2013年12月31日星期二

2013年12月28日星期六

創建圓角的EditText

創建圓角的EditText:


首先創建/res/drawable/roundcorner.xml文件.
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:padding="5dp"
    android:shape="rectangle" >
    <solid android:color="#B0B0B0" />
    <corners
        android:bottomLeftRadius="10dp"
        android:bottomRightRadius="10dp"
        android:topLeftRadius="10dp"
        android:topRightRadius="10dp" />
</shape>


在佈局文件, 設置android:background="@drawable/roundcorner".
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10sp"
        android:drawablePadding="5dp"
        android:drawableStart="@drawable/ic_launcher"
        android:gravity="left|bottom"
        android:textColor="#F0F0F0"
        android:background="@drawable/roundcorner"
        android:hint="hello" >
    </EditText>

</LinearLayout>

在EditText上添加圖標

在EditText上添加圖標的實例:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10sp"
        android:drawablePadding="5dp"
        android:drawableStart="@drawable/ic_launcher"
        android:gravity="left|bottom"
        android:textColor="#F0F0F0"
        android:background="#B0B0B0"
        android:hint="hello" >
    </EditText>

</LinearLayout>

2013年12月24日星期二

Google Maps Android API Utility Library (谷歌地圖AndroidAPI工具庫)

Google Maps Android API Utility Library (谷歌地圖AndroidAPI工具庫) 是一個開放源碼的類庫, 為地圖應用程序提供先進的功能. 這是提供源代碼的 GitHub 網站.

Maps Shortcuts: Android Maps Utility Library

2013年12月18日星期三

谷歌時代精神 - Here's to 2013

Google Zeitgeist | Here's to 2013

2013年時代精神. 認識世界搜索了什麼, 與谷歌的一年回顧.
http://www.google.com/zeitgeist

2013年12月10日星期二

2013年12月8日星期日

實現 GestureDetector.OnGestureListener 檢測手勢

這個示例代碼通過實現 GestureDetector.OnGestureListener 檢測用戶的手勢操作:
實現 GestureDetector.OnGestureListener 檢測手勢
實現 GestureDetector.OnGestureListener 檢測手勢

package com.example.androidgesturedetector;

import android.os.Bundle;
import android.app.Activity;
import android.support.v4.view.GestureDetectorCompat;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.TextView;

public class MainActivity extends Activity {

 String info;
 TextView infoView;
 private GestureDetectorCompat myGestureDetectorCompat;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  // setContentView(R.layout.activity_main);
  infoView = new TextView(this);
  setContentView(infoView);

  info = "";
  infoView.setText(info);

  myGestureDetectorCompat = new GestureDetectorCompat(this,
    myOnGestureListener);
 }

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  myGestureDetectorCompat.onTouchEvent(event);
  return super.onTouchEvent(event);
 }

 GestureDetector.OnGestureListener myOnGestureListener = new 
   GestureDetector.OnGestureListener() {

  @Override
  public boolean onDown(MotionEvent e) {
   info = "onDown - " + e.getX() + " : " + e.getY() + "\n";
   infoView.setText(info);
   return false;
  }

  @Override
  public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
    float velocityY) {
   info += "onFling - " + "\n" + " e1 - " + e1.getX() + " : "
     + e1.getY() + "\n" + " e2 - " + e2.getX() + " : "
     + e2.getY() + "\n" + " velocityX = " + velocityX + "\n"
     + " velocityY = " + velocityY + "\n";
   infoView.setText(info);
   return false;
  }

  @Override
  public void onLongPress(MotionEvent e) {
   info += "onLongPress - " + e.getX() + " : " + e.getY() + "\n";
   infoView.setText(info);
  }

  @Override
  public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,
    float arg3) {
   info += "onScroll\n";
   infoView.setText(info);
   return false;
  }

  @Override
  public void onShowPress(MotionEvent e) {
   info += "onShowPress - " + e.getX() + " : " + e.getY() + "\n";
   infoView.setText(info);
  }

  @Override
  public boolean onSingleTapUp(MotionEvent e) {
   info += "onSingleTapUp - " + e.getX() + " : " + e.getY() + "\n";
   infoView.setText(info);
   return false;
  }
 };

}


相關帖子:
- 手勢檢測 GestureDetector.SimpleOnGestureListener

2013年12月2日星期一

手勢檢測 GestureDetector.SimpleOnGestureListener

GestureDetector.SimpleOnGestureListener 類為檢測手勢(Gesture)提供一種簡單的方式. 它實現了 GestureDetector.OnGestureListener 和 GestureDetector.OnDoubleTapListener 的所有方法. 你只需要擴展 GestureDetector.SimpleOnGestureListener 子類,並重寫所需的方法便可以。

返回值: 如果該事件被消耗掉 return true,否則 return false.

示例代碼:

package com.example.androidsimpleongesturelistener;

import android.os.Bundle;
import android.support.v4.view.GestureDetectorCompat;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.TextView;
import android.app.Activity;

public class MainActivity extends Activity {
 
 private GestureDetectorCompat myGestureDetector;
 String info;
 TextView infoView;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  //setContentView(R.layout.activity_main); 
  infoView = new TextView(this);
  setContentView(infoView);

  info = "";
  infoView.setText(info);
  
  myGestureDetector = 
    new GestureDetectorCompat(this, new MyGestureListener());
 }

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  this.myGestureDetector.onTouchEvent(event);
  return super.onTouchEvent(event);
 }

 class MyGestureListener extends GestureDetector.SimpleOnGestureListener {

  @Override
  public boolean onDoubleTap(MotionEvent e) {
   info += "onDoubleTap - " + 
     e.getX() + " : " + e.getY() + 
     "\n";
   infoView.setText(info);
   return super.onDoubleTap(e);
  }

  @Override
  public boolean onDoubleTapEvent(MotionEvent e) {
   info += "onDoubleTapEvent - " + 
     e.getX() + " : " + e.getY() + 
     "\n";
   infoView.setText(info);
   return super.onDoubleTapEvent(e);
  }

  @Override
  public boolean onDown(MotionEvent e) {
   info = "onDown - " + 
     e.getX() + " : " + e.getY() + 
     "\n";
   infoView.setText(info);
   return super.onDown(e);
  }

  @Override
  public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
    float velocityY) {
   info += "onFling - " + "\n" +
     " e1 - " + e1.getX() + " : " + e1.getY() + "\n" +
     " e2 - " + e2.getX() + " : " + e2.getY() + "\n" +
     " velocityX = " + velocityX + "\n" +
     " velocityY = " + velocityY + "\n";
   infoView.setText(info);
   return super.onFling(e1, e2, velocityX, velocityY);
  }

  @Override
  public void onLongPress(MotionEvent e) {
   info += "onLongPress - " + 
     e.getX() + " : " + e.getY() + 
     "\n";
   infoView.setText(info);
   super.onLongPress(e);
  }

  @Override
  public boolean onScroll(MotionEvent e1, MotionEvent e2,
    float distanceX, float distanceY) {
   /*
   info += "onScroll - " + "\n" +
     " e1 - " + e1.getX() + " : " + e1.getY() + "\n" +
     " e2 - " + e2.getX() + " : " + e2.getY() + "\n" +
     " distanceX = " + distanceX + "\n" +
     " distanceY = " + distanceY + "\n";
   infoView.setText(info);
   */
   info += "onScroll\n";
   infoView.setText(info);
   return super.onScroll(e1, e2, distanceX, distanceY);
  }

  @Override
  public void onShowPress(MotionEvent e) {
   info += "onShowPress - " + 
     e.getX() + " : " + e.getY() + 
     "\n";
   infoView.setText(info);
   super.onShowPress(e);
  }

  @Override
  public boolean onSingleTapConfirmed(MotionEvent e) {
   info += "onSingleTapConfirmed - " + 
     e.getX() + " : " + e.getY() + 
     "\n";
   infoView.setText(info);
   return super.onSingleTapConfirmed(e);
  }

  @Override
  public boolean onSingleTapUp(MotionEvent e) {
   info += "onSingleTapUp - " + 
     e.getX() + " : " + e.getY() + 
     "\n";
   infoView.setText(info);
   return super.onSingleTapUp(e);
  }
 }
}


手勢檢測 GestureDetector.SimpleOnGestureListener
手勢檢測 GestureDetector.SimpleOnGestureListener


相關帖子:
- 實現 GestureDetector.OnGestureListener 檢測手勢

2013年11月2日星期六

Android 4.4 KitKat 新功能介紹

此播放列表介紹一些 Android4.4 KitKat 的新功能:

2013年10月24日星期四

Play Games 與 NDK

下面三個視頻教程介紹如何整合 NativeActivity 與 NDK, 使用C++ 編寫遊戲程式.

設定:


成勣和排行榜:


線程和生命週期:


2013年10月11日星期五

Density-independent Pixels (密度獨立像素)

一個教導如何針對不同Android設備, 不同分辨率的問題, 創建統一用戶界面(UI)的視頻教程.

DesignBytes: Density-independent Pixels


This introductory video explains how Android app designers can easily work across different screen pixel densities by using the density-independent pixel (abbreviated dp or dip), a virtual pixel unit that keeps things the same physical size across device. Understanding dp units is critical to a successful Android app design workflow.

2013年9月30日星期一

如何請求重新佈局/繪製 - requestLayout()/invalidate()

如果一個視圖(View)有一些視覺變化, 希望系統重新佈局/繪製, 可以調用函數 requestLayout() 或 invalidate().

- 調用 requestLayout() 函數將安排重新佈局.
- 調用 invalidate() 函數會調用onDraw(android.graphics.Canvas).

2013年9月27日星期五

水平放置單選按鈕(RadioButton)

    <RadioGroup
        android:id="@+id/radiogroup2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
 
        <RadioButton
            android:id="@+id/radiobutton1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="option 1" />
 
        <RadioButton
            android:id="@+id/radiobutton2"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="option 2" />
    </RadioGroup>

2013年9月4日星期三

2013年8月17日星期六

圖像像素化 (Image Pixelization)


本視頻演示了一些實現對圖像像素化效果((Image Pixelization))的基本位圖處理(Bitmap manipulation)技術. 以及使用AsyncTask從UI線程移至後台工作線程, 以減少UI線程的負荷.

示例代碼: http://developer.android.com/shareables/devbytes/ImagePixelization.zip

2013年8月15日星期四

百度登上“福布斯”全球最具創新力公司,第六位

參考: http://www.forbes.com/innovative-companies/list/

福布斯全球最具創新力公司
百度登上“福布斯”全球最具創新力公司,第六位

2013年7月25日星期四

谷歌推出 Chromecast (HDMI 串流電視棒), 只售 $35 美元



Google 還宣布 Google Cast 開發者網站, 提供 Google Cast Developer Preview. 通過 Google Cast Developer Preview, 可以開發運行在 Android, iOS, 和 Chrome 上的 sender 應用程序, 以及運行在縮減版本的Chrome 上的 receiver 應用程序.

Android 4.3 vs Android 4.2.2

2013年7月24日星期三

通過 Java 設定旋轉角度 setRotation()

適用 API Level 11:
通過 Java 設定旋轉角度
通過 Java 設定旋轉角度


package com.example.androidview;

import android.os.Bundle;
import android.app.Activity;
import android.widget.ImageView;

public class MainActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  ImageView image = (ImageView)findViewById(R.id.image);
  image.setRotation(270);
 }

}


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />

</RelativeLayout>


通過XML設定旋轉角度 android:rotation

通過XML設定旋轉角度

例子:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ImageView
        android:id="@+id/image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/ic_launcher"
        android:rotation="45.0" />

</RelativeLayout>


2013年7月17日星期三

比爾·蓋茨在微軟研究院教育高峰會2013開幕主題演講



Bill Gates Opening Keynote at Microsoft Research Faculty Summit 2013

微軟董事長比爾·蓋茨在微軟研究院教育高峰會2013討論計算研究如何可以改善我們的世界.

2013年7月13日星期六

DevBytes: Curved Motion (曲線運動)

這個視頻演示了如何使用現有動畫 APIs 來實現曲線運動。

2013年7月11日星期四

了解新的 Google Maps app for Android

Learn about the new Google Maps app for Android

2013年6月28日星期五

2013年6月26日星期三

Android Studio - 全新 Android 應用程序開發工具

Android Studio 是一個基於 IntelliJ 社區版, 功能齊全的全新 Android 應用程序開發工具.


2013年6月25日星期二

視頻教程 - Java集合指南

Field Guide to Java Collections

2013年6月24日星期一

2013年6月19日星期三

華為 Ascend P6 - 官方視頻



6.18毫米, 世上最薄智能手機.
四核 Cortex-A9.
4.7英寸的720p顯示屏.

2013年6月15日星期六

Facebook上發布的數據,包括所有國家的安全要求

Facebook上公布包括所有(美國)國家安全要求的數據: http://newsroom.fb.com/News/636/Facebook-Releases-Data-Including-All-National-Security-Requests.

谷歌又一新計劃項目: Project Loon

世界上三分之二人口還沒有上網! 谷歌的新項目 Project Loon 是一個行駛在太空邊緣的氣球網絡, 這些氣球上行駛邊緣空間,它的目的旨在連接在農村和偏遠地區的人, 幫助填補網絡覆蓋, 以及在災難發生後為人們帶來重新的聯機. http://www.google.com/loon/


A Moving Experience - Google I/O 2013 視頻

本講座展示各類應用動畫, 以及如何實現.


2013年6月13日星期四

2013年6月9日星期日

小米手機 2S 台灣版動手玩(Xiaomi 2S)

小米手機 2S 台灣版動手玩(Xiaomi 2S Hands-on)| Engadget 中文版

2013年6月8日星期六

視頻: 自定義活動動畫(Custom Activity Animations)

Window Animations 是一個製作活動間過渡動畫的簡單方法. 這個視頻涵蓋可定制動畫的不同技術。

DevBytes: Custom Activity Animations

2013年6月3日星期一

探討Android的用戶界面(UI) - Google I/O 2013 視頻

Google I/O 2013 - Android Design for UI Developers

2013年6月2日星期日

當Android遇上谷歌地圖 - Google I/O 2013 視頻



使用 Google Maps Android API 建立直觀和引人入勝的移動地圖應用程序. 這段視頻展示創新的方式來整合地圖和Android傳感器與Android上的谷歌服務. 探討可視化背景, 個性化和及時信息的概念.

2013年4月22日星期一

通過讀取 android.os.Build.VERSION.SDK_INT 獲得操作系統版本

通過讀取 android.os.Build.VERSION.SDK_INT 獲得操作系統版本
通過讀取 android.os.Build.VERSION.SDK_INT 獲得操作系統版本


package com.example.androidbuildversion;


import java.util.Arrays;
import java.util.List;

import android.os.Bundle;
import android.app.Activity;
import android.widget.TextView;

public class MainActivity extends Activity {
 
 final static Integer[] VersionCode = {
  android.os.Build.VERSION_CODES.BASE,
  android.os.Build.VERSION_CODES.BASE_1_1,
  android.os.Build.VERSION_CODES.CUPCAKE,
  android.os.Build.VERSION_CODES.CUR_DEVELOPMENT,
  android.os.Build.VERSION_CODES.DONUT,
  android.os.Build.VERSION_CODES.ECLAIR,
  android.os.Build.VERSION_CODES.ECLAIR_0_1,
  android.os.Build.VERSION_CODES.ECLAIR_MR1,
  android.os.Build.VERSION_CODES.FROYO,
  android.os.Build.VERSION_CODES.GINGERBREAD,
  android.os.Build.VERSION_CODES.GINGERBREAD_MR1,
  android.os.Build.VERSION_CODES.HONEYCOMB,
  android.os.Build.VERSION_CODES.HONEYCOMB_MR1,
  android.os.Build.VERSION_CODES.HONEYCOMB_MR2,
  android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH,
  android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1,
  android.os.Build.VERSION_CODES.JELLY_BEAN,
  android.os.Build.VERSION_CODES.JELLY_BEAN_MR1 
 };
 
 final static String[] Version = {
  "BASE - October 2008: The original, first, version of Android",
  "BASE_1_1 - February 2009: First Android update, officially called 1.1",
  "CUPCAKE - May 2009: Android 1.5",
  "CUR_DEVELOPMENT - Magic version number for a current development build",
  "DONUT - September 2009: Android 1.6",
  "ECLAIR - November 2009: Android 2.0",
  "ECLAIR_0_1 - December 2009: Android 2.0.1",
  "ECLAIR_MR1 - January 2010: Android 2.1",
  "FROYO - June 2010: Android 2.2",
  "GINGERBREAD - November 2010: Android 2.3",
  "GINGERBREAD_MR1 - February 2011: Android 2.3.3",
  "HONEYCOMB - February 2011: Android 3.0",
  "HONEYCOMB_MR1 - May 2011: Android 3.1",
  "HONEYCOMB_MR2 - June 2011: Android 3.2",
  "ICE_CREAM_SANDWICH - October 2011: Android 4.0",
  "ICE_CREAM_SANDWICH_MR1 - December 2011: Android 4.0.3",
  "JELLY_BEAN - June 2012: Android 4.1",
  "JELLY_BEAN_MR1 - Android 4.2: Moar jelly beans!" 
 };

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  //setContentView(R.layout.activity_main);
  TextView textVersion = new TextView(this);
  setContentView(textVersion);
  
  int SDKversion = android.os.Build.VERSION.SDK_INT;
  int matched = Arrays.asList(VersionCode).indexOf((int)SDKversion);
  if(matched == -1){
   textVersion.setText(String.valueOf(SDKversion) 
     + " : " + "unknown!");
  }else{
   textVersion.setText(String.valueOf(SDKversion) 
     + " : " + Version[matched]);
  }
 }

}


2013年4月20日星期六

谷歌网上寻人: 四川地震已經上線

谷歌网上寻人: 四川地震已經上線, 希望內地網民可以連接. http://google.org/personfinder/2013-sichuan-earthquake/

谷歌网上寻人: 四川地震
谷歌网上寻人: 四川地震

2013年4月12日星期五

runOnUiThread(), 在用戶界面線程上運行

在 Android 上, 應用程序不能在後台線程更新用戶界面. 如果你需要在後台線程更新用戶界面, 一個非常簡單的方法是 呼叫 runOnUiThread(Runnable action) 方法. action Runnable 會在稍後的UI線程上運行.

 runOnUiThread(new Runnable(){

  @Override
  public void run() {
         //do something on UI here
  }

 });



2013年4月11日星期四

如何檢查目前是否運行在UI線程

可以使用下面的程序碼檢查目前是否運行在UI線程:

if(Looper.getMainLooper().getThread() == Thread.currentThread()){
 //目前運行在UI線程
}else{
 目前運行不是在UI線程
}

2013年3月28日星期四

开源中国, 中国最大的开源技术社区

开源中国 www.oschina.net 成立于2008年8月,是中国最大的开源技术社区。我们传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国已收录超过两万款开源软件。

经过不断的改进,目前开源中国社区已经形成了由开源软件库、代码分享、资讯、翻译、讨论区和博客等几大频道内容。

2013年2月20日星期三

視頻 - 在平板電腦上運行的Ubuntu

Ubuntu for tablets - Full video

Ubuntu 創始人 Mark Shuttleworth 解釋 在平板電腦上運行的Ubuntu.

2013年2月11日星期一

新年快樂



2013年2月6日星期三

實現自動滾動的文本視圖 - marquee

通過 marquee 實現自動滾動的文本視圖的例子:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:singleLine="true"
        android:scrollHorizontally="true"
        android:ellipsize="marquee"
        android:marqueeRepeatLimit ="marquee_forever"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:textSize="28sp"
        android:text="Android編程: .............滾動文字" />

</RelativeLayout>

Android編程: .............滾動文字

2013年2月2日星期六

ADL+ Maps API V2 視頻教程

ADL+ 2012-12-13 - Maps API V2


ADL+ 2013-01-24 Maps API v2 part2


2013年1月30日星期三

全新谷歌地圖 Android API V2 簡介視頻

Google Maps Developers Live: Google Maps Android API V2

2013年1月3日星期四

在Android上顯示TTF/OTF

"OTF" 是 OpenType 字體, 在大多數現代操作系統中使用.
"TTF" 是 TrueType 字體, 適用於Windows的首選.

在Android上顯示TTF/OTF


要在Android上顯示TTF/OTF, 首先要下載和複製到/assets/fonts 文件夾. 可以在這裡找到一些免費的字體. 注意, 僅複製所需要的字體文件, 否則,很浪費內存資源, 甚至不能加載/運行!



程序代碼:

package com.example.androidfonts;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Typeface;
import android.widget.TextView;

public class MainActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  TextView ttfView = (TextView)findViewById(R.id.ttf);
  TextView otfView = (TextView)findViewById(R.id.otf);
  
  Typeface ttfFace_FreeMonoBold = Typeface.createFromAsset(getAssets(), 
    "fonts/FreeMonoBold.ttf");
  Typeface otfFace_FreeSansBoldOblique = Typeface.createFromAsset(getAssets(), 
    "fonts/FreeSansBoldOblique.otf");
  
  ttfView.setTypeface(ttfFace_FreeMonoBold);
  ttfView.setTextSize(28);
  otfView.setTypeface(otfFace_FreeSansBoldOblique);
  otfView.setTextSize(28);

 }

}


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
    <TextView
        android:id="@+id/ttf"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello! I'm TTF" />
    <TextView
        android:id="@+id/otf"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello! I'm OTF" />

</LinearLayout>