2012年5月30日 星期三

[Android]取得手機螢幕大小 (Display Metrics)




<GetDisplayMetrics.java>
   1: package com.android.getdisplaymetrics;
   2:  
   3: import android.app.Activity;
   4: import android.os.Bundle;
   5: import android.util.DisplayMetrics;
   6: import android.view.View;
   7: import android.view.View.OnClickListener;
   8: import android.widget.Button;
   9: import android.widget.TextView;
  10:  
  11: public class GetDisplayMetrics extends Activity {
  12:  
  13:     private TextView textviewDisplayMetrics;
  14:     private Button btnRun, btnExit;
  15:     
  16:     @Override
  17:     public void onCreate(Bundle savedInstanceState) {
  18:         super.onCreate(savedInstanceState);
  19:         setContentView(R.layout.main);
  20:         findViews();
  21:         setButtonListeners();
  22:     }
  23:     
  24:     private void findViews() {
  25:         textviewDisplayMetrics = (TextView) findViewById(R.id.displaymetricsTextView);
  26:         btnRun = (Button) findViewById(R.id.runBtn);
  27:         btnExit = (Button) findViewById(R.id.exitBtn);
  28:     }
  29:     
  30:     private void setButtonListeners() {
  31:  
  32:         btnRun.setOnClickListener(new OnClickListener(){
  33:         // 取得手機螢幕大小
  34:             public void onClick(View v) {
  35:                  getDisplayMetrics();
  36:             }
  37:         });
  38:         
  39:         btnExit.setOnClickListener(new OnClickListener(){
  40:         // 執行 【離開】
  41:             public void onClick(View v) {
  42:                 android.os.Process.killProcess(android.os.Process.myPid());
  43:             }
  44:         });
  45:     }
  46:     
  47:     private void getDisplayMetrics() {
  48:        // 取得手機螢幕大小
  49:         DisplayMetrics dm = new DisplayMetrics();
  50:         this.getWindowManager().getDefaultDisplay().getMetrics(dm);
  51:         textviewDisplayMetrics.setText(    getString(R.string.strDisplayMetrics)+
  52:                                         dm.widthPixels + " * " + dm.heightPixels);        
  53:     }
  54:     
  55: }

<main.xml>
   1: <?xml version="1.0" encoding="utf-8"?>
   2: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   3:     android:layout_width="fill_parent"
   4:     android:layout_height="fill_parent"
   5:     android:orientation="vertical" >
   6:  
   7:     <TextView
   8:         android:id="@+id/displaymetricsTextView"
   9:         android:layout_width="fill_parent"
  10:         android:layout_height="wrap_content"
  11:         android:text="@string/strDisplayMetrics" />
  12:  
  13:     <LinearLayout
  14:         android:layout_width="match_parent"
  15:         android:layout_height="wrap_content" >
  16:  
  17:         <Button
  18:             android:id="@+id/runBtn"
  19:             android:layout_width="wrap_content"
  20:             android:layout_height="wrap_content"
  21:             android:text="@string/strExecute" />
  22:  
  23:         <Button
  24:             android:id="@+id/exitBtn"
  25:             android:layout_width="wrap_content"
  26:             android:layout_height="wrap_content"
  27:             android:text="@string/strExit" />
  28:  
  29:     </LinearLayout>
  30:  
  31: </LinearLayout>

<strings.xml>
   1: <?xml version="1.0" encoding="utf-8"?>
   2: <resources>
   3:  
   4:     <string name="hello">Hello World, GetDisplayMetrics!</string>
   5:     <string name="app_name">GetDisplayMetrics</string>
   6:     <string name="strDisplayMetrics">手機螢幕大小:</string>
   7:     <string name="strExecute">取得手機螢幕大小</string>
   8:     <string name="strExit">離開</string>
   9:  
  10: </resources>

2012年5月21日 星期一

[Android]利用 Paint 指令繪製 Android 機器人


<DrawAndroid.java>
   1: package com.android.drawandroid;
   2:  
   3: import android.app.Activity;
   4: import android.os.Bundle;
   5: import android.view.Window;
   6: import android.view.WindowManager;
   7:  
   8: public class DrawAndroid extends Activity {
   9:  
  10:     private DrawAndroidView drawAndroidView = null;
  11:   
  12:     @Override
  13:     public void onCreate(Bundle  savedInstanceState) { 
  14:         super.onCreate(savedInstanceState);
  15:         
  16:         // 移除應用程式的標題
  17:         requestWindowFeature(Window.FEATURE_NO_TITLE);
  18:         
  19:         // 設定視窗屬性為全螢幕
  20:         getWindow().setFlags(    WindowManager.LayoutParams.FLAG_FULLSCREEN,
  21:                                 WindowManager.LayoutParams.FLAG_FULLSCREEN);
  22:         
  23:         drawAndroidView = new DrawAndroidView(this);
  24:         
  25:         setContentView(drawAndroidView);
  26:     }
  27: }

<DrawAndroidView.java>


自定義字體下載點: DroidLogo-Bold.ttf 


   1: package com.android.drawandroid;
   2:  
   3: import android.content.Context;
   4: import android.graphics.Canvas;
   5: import android.graphics.Color;
   6: import android.graphics.Paint;
   7: import android.graphics.RectF;
   8: import android.graphics.Typeface;
   9: import android.view.View;
  10:  
  11: public class DrawAndroidView extends View {
  12:     
  13:     Typeface font;
  14:     Paint paint, paint_eye;
  15:       
  16:     public DrawAndroidView(Context context) {
  17:         super(context);
  18:     }
  19:  
  20:     public void  onDraw(Canvas canvas) {
  21:         super.onDraw(canvas);
  22:         DrawCircle(canvas);
  23:         DrawRect(canvas);
  24:         DrawLine(canvas);
  25:         DrawText(canvas);
  26:     }
  27:     
  28:     private void DrawCircle(Canvas canvas) {
  29:         // 畫頭
  30:         paint = new Paint();
  31:         // 設置為true可消除邊緣效果 
  32:         paint.setAntiAlias(true);
  33:         // 設定畫筆顏色
  34:         paint.setColor(Color.GREEN);
  35:         // 於畫布上繪製【頭部】    
  36:         RectF rectF = new RectF(70,40,250,180);
  37:         canvas.drawArc(rectF, 180, 180, true, paint);
  38:         
  39:         // 畫眼睛
  40:         paint_eye = new  Paint();
  41:         // 設置為true可消除邊緣效果 
  42:         paint_eye.setAntiAlias(true);
  43:         // 設定畫筆顏色
  44:         paint_eye.setColor(Color.WHITE);
  45:         // 於畫布上繪製【眼腈】
  46:         canvas.drawCircle(120, 77, 8, paint_eye);
  47:         canvas.drawCircle(200, 77, 8, paint_eye);
  48:     }
  49:     
  50:     private void DrawRect(Canvas canvas) {
  51:         paint = new Paint();
  52:         // 設置為true可消除邊緣效果 
  53:         paint.setAntiAlias(true);
  54:         // 設定畫筆顏色
  55:         paint.setColor(Color.GREEN);
  56:         // 設置矩形區域
  57:         RectF rectF1 = new RectF(20,105,60,280);    // 左手
  58:         RectF rectF2 = new RectF(260,105,300,280);    // 右手
  59:         RectF rectF3 = new RectF(70,120,250,350);    // 身體
  60:         RectF rectF4 = new RectF(100,320,140,430);    // 左腳
  61:         RectF rectF5 = new RectF(180,320,220,430);    // 右腳
  62:         // 於畫布上繪製圓角矩形
  63:         canvas.drawRoundRect(rectF1, 20, 20, paint);
  64:         canvas.drawRoundRect(rectF2, 20, 20, paint);
  65:         canvas.drawRoundRect(rectF3, 20, 20, paint);
  66:         canvas.drawRoundRect(rectF4, 20, 20, paint);
  67:         canvas.drawRoundRect(rectF5, 20, 20, paint);
  68:     }
  69:     
  70:     
  71:     private void DrawLine(Canvas canvas) {
  72:         paint = new Paint();
  73:         // 設置為true可消除邊緣效果 
  74:         paint.setAntiAlias(true);
  75:         // 設定畫筆顏色
  76:         paint.setColor(Color.GREEN);
  77:         // 設定畫筆的粗細
  78:         paint.setStrokeWidth(12);
  79:         // 於畫布上繪製【頭頂兩支角】
  80:         canvas.drawLine(70,28,100,63, paint);
  81:         canvas.drawLine(215,63,250,28, paint);
  82:     }
  83:     
  84:     private void DrawText(Canvas canvas) {
  85:         paint = new Paint();
  86:         // 讀取自定義字體
  87:         font = Typeface.createFromAsset(getContext().getAssets(),"fonts/DroidLogo-Bold.ttf");
  88:         // 設定字體
  89:         paint.setTypeface(font);
  90:         // 設置為true可消除邊緣效果 
  91:         paint.setAntiAlias(true);
  92:         // 設定畫筆顏色
  93:         paint.setColor(Color.WHITE);
  94:         // 設定字體大小
  95:         paint.setTextSize(30);
  96:         // 於畫布上繪製【ANDROID 文字】
  97:         canvas.drawText("ANDROID", 85, 230, paint);
  98:     }
  99: }

2012年5月7日 星期一

[Android]AppWidget 呼叫 Activity, then Activity 傳送資料給 AppWidget

步驟一:新增 AppWidget至首頁畫面



步驟二:點選 Appwidget 內的文字,以啟動另一個 Activity

步驟三:選擇其中一個項目

步驟四:將選擇的項目資料顯示於 AppWidget

步驟五:移除 AppWidget

<AppWidgetInvokeActivity.java>
   1: package com.android.appwidgetinvokeactivity;
   2:  
   3: import android.app.PendingIntent;
   4: import android.app.Service;
   5: import android.appwidget.AppWidgetManager;
   6: import android.appwidget.AppWidgetProvider;
   7: import android.content.ComponentName;
   8: import android.content.Context;
   9: import android.content.Intent;
  10: import android.os.IBinder;
  11: import android.widget.RemoteViews;
  12:  
  13: public class AppWidgetInvokeActivity extends AppWidgetProvider {
  14:  
  15:     @Override
  16:     public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
  17:         super.onUpdate(context, appWidgetManager, appWidgetIds);
  18:         
  19:         // Start UpdateService Service 
  20:         context.startService(new Intent(context, UpdateService.class));
  21:         
  22:         int appWidgetId = appWidgetIds[0];
  23:         Intent configIntent = new Intent(context, MyActivity.class);
  24:         PendingIntent configPendingIntent = PendingIntent.getActivity(context, 0, configIntent, 0);
  25:         RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widgetlayout);
  26:         remoteViews.setOnClickPendingIntent(R.id.resultTextView, configPendingIntent);
  27:         appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
  28:     }
  29:     
  30:     
  31:     @Override
  32:     public void onDisabled(Context context) {
  33:     // 處理 AppWidget onDisabled 事件
  34:     // 當最後一個  AppWidget 被刪除時,會執行 onDisabled
  35:         
  36:         super.onDisabled(context);
  37:        
  38:         // 停止 UpdateService 服務
  39:         context.stopService(new Intent(context, UpdateService.class));
  40:         
  41:         android.os.Process.killProcess(android.os.Process.myPid());
  42:     }
  43:  
  44:     
  45:     public static class UpdateService extends Service {
  46:  
  47:         @Override
  48:         public IBinder onBind(Intent intent) {
  49:             // TODO Auto-generated method stub
  50:             return null;
  51:         }
  52:  
  53:         @Override
  54:         public void onStart(Intent intent, int startId) {
  55:             super.onStart(intent, startId);
  56:             
  57:             // 將 MyActivity 設定的 selectedItem 值,更新 AppWidget 內容值
  58:             RemoteViews updateViews = new RemoteViews(this.getPackageName(), R.layout.widgetlayout);
  59:             updateViews.setTextViewText(R.id.resultTextView, "點選這裡選擇設定項目"+"\n"+MyActivity.selectedItem);
  60:             ComponentName thisWidget = new ComponentName(this, AppWidgetInvokeActivity.class);
  61:             AppWidgetManager manager = AppWidgetManager.getInstance(this);
  62:             manager.updateAppWidget(thisWidget, updateViews);
  63:         }
  64:     }
  65:          
  66: }

<MyActivity.java>
   1: package com.android.appwidgetinvokeactivity;
   2:  
   3: import android.app.Activity;
   4: import android.content.Context;
   5: import android.content.Intent;
   6: import android.os.Bundle;
   7: import android.view.View;
   8: import android.widget.AdapterView;
   9: import android.widget.ArrayAdapter;
  10: import android.widget.ListAdapter;
  11: import android.widget.ListView;
  12: import android.widget.AdapterView.OnItemClickListener;
  13:  
  14: public class MyActivity extends Activity {
  15:     
  16:     public static String selectedItem = "";
  17:     ListView listviewSourceFrom;
  18:     ListAdapter laSingleChoice;
  19:     static final String[] mSourceFrom = new String[] {  "選擇項目-1",
  20:                                                         "選擇項目-2",
  21:                                                         "選擇項目-3" };
  22:     
  23:     
  24:     @Override
  25:     protected void onCreate(Bundle savedInstanceState) {
  26:         super.onCreate(savedInstanceState);
  27:         setContentView(R.layout.myactivitylayout);
  28:         findViews();
  29:         setListviewControls();
  30:         setListviewListener();
  31:     }
  32:     
  33:     private void findViews() {
  34:         listviewSourceFrom = (ListView) findViewById(R.id.sourcefromListview);
  35:     }
  36:     
  37:     private void setListviewControls() {
  38:         laSingleChoice = new ArrayAdapter<String>(    this,
  39:                                                 android.R.layout.simple_list_item_single_choice,
  40:                                                 mSourceFrom);
  41:         listviewSourceFrom.setAdapter(laSingleChoice);
  42:         listviewSourceFrom.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
  43:     }
  44:     
  45:     private void setListviewListener() {
  46:         listviewSourceFrom.setOnItemClickListener(new OnItemClickListener() {  
  47:             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
  48:                 selectedItem = "選擇了第 "+String.valueOf(arg2+1)+" 個項目";
  49:                 final Context context = MyActivity.this;
  50:                 context.startService(new Intent(context, AppWidgetInvokeActivity.UpdateService.class));
  51:                 Intent resultValue = new Intent();
  52:                 setResult(RESULT_OK, resultValue);
  53:                 finish();
  54:             }
  55:         });  
  56:     }
  57:  
  58: }

<widgetlayout.xml>
   1: <?xml version="1.0" encoding="utf-8"?>
   2: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   3:     android:layout_width="wrap_content"
   4:     android:layout_height="wrap_content"
   5:     android:gravity="center"
   6:     android:orientation="vertical" >
   7:  
   8:     <TextView
   9:         android:id="@+id/resultTextView"
  10:         android:layout_width="match_parent"
  11:         android:layout_height="match_parent"
  12:         android:background="@drawable/widget"
  13:         android:gravity="center"
  14:         android:text="@string/app_name"
  15:         android:textColor="@android:color/black"
  16:         android:textSize="12dp"
  17:         android:typeface="serif" />
  18:  
  19: </LinearLayout>

<myactivitylayout.xml>
   1: <?xml version="1.0" encoding="utf-8"?>
   2: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   3:     android:id="@+id/LinearLayout1"
   4:     android:layout_width="match_parent"
   5:     android:layout_height="match_parent" >
   6:  
   7:     <ListView
   8:         android:id="@+id/sourcefromListview"
   9:         android:layout_width="match_parent"
  10:         android:layout_height="wrap_content"
  11:         android:drawSelectorOnTop="true" >
  12:  
  13:     </ListView>
  14:  
  15: </LinearLayout>

<appwidget.xml>

   1: <?xml version="1.0" encoding="utf-8"?>
   2: <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
   3:         android:initialLayout="@layout/widgetlayout"
   4:         android:minWidth="176dp"
   5:         android:minHeight="72dp" >
   6:  
   7: </appwidget-provider> 

<AndroidManifest.xml>
   1: <?xml version="1.0" encoding="utf-8"?>
   2: <manifest xmlns:android="http://schemas.android.com/apk/res/android"
   3:     package="com.android.appwidgetinvokeactivity"
   4:     android:versionCode="1"
   5:     android:versionName="1.0" >
   6:  
   7:     <uses-sdk android:minSdkVersion="8" />
   8:  
   9:     <application
  10:         android:icon="@drawable/ic_launcher"
  11:         android:label="@string/app_name" >
  12:         <receiver android:name="AppWidgetInvokeActivity" android:label="@string/app_name">
  13:             <intent-filter>
  14:                 <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
  15:             </intent-filter>
  16:             <meta-data android:resource="@xml/appwidget" android:name="android.appwidget.provider"/>
  17:         </receiver>
  18:         <service android:name="AppWidgetInvokeActivity$UpdateService"/>
  19:         <activity android:name="MyActivity">
  20:             <intent-filter>
  21:                 <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
  22:             </intent-filter>
  23:         </activity>
  24:     </application>
  25:  
  26: </manifest>