2013年3月31日 星期日

[ Android Gesture ] GestureDetector手勢範例三

在Android手機中,有一套APP叫Gestures Builder,我們利用它來設計幾個手勢,如下圖:
接下來我們嘗試開發一套APP來讀取這個手勢,來控制畫面中,圓形圖案的顏色,當查覺到使用者輸入"2"時,則顯示紅色圓,否則為藍色圓。該APP執行結果如下圖:



其原始程式如下:
//MainActivity.java
package com.example.test;
import java.io.File;
import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.gesture.Gesture;
import android.gesture.GestureLibraries;
import android.gesture.GestureLibrary;
import android.gesture.GestureOverlayView;
import android.gesture.GestureOverlayView.OnGesturePerformedListener;
import android.gesture.Prediction;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity implements OnGesturePerformedListener {
 private GestureLibrary gestureLib;
 DrawView drawView;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
   GestureOverlayView gestureOverlayView = new GestureOverlayView(this);
      View inflate = getLayoutInflater().inflate(R.layout.activity_main, null);
      gestureOverlayView.addView(inflate);
      drawView = new DrawView(this);
      gestureOverlayView.addView(drawView);
      gestureOverlayView.addOnGesturePerformedListener(this);
      gestureLib = GestureLibraries.fromFile(new File("/mnt/sdcard/gestures"));
      if (!gestureLib.load()) {
        finish();
      }
  setContentView(gestureOverlayView);
 }
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.activity_main, menu);
  return true;
 }
 @Override
 public void onGesturePerformed(GestureOverlayView arg0, Gesture gesture) {
  // TODO Auto-generated method stub
    ArrayList<prediction> predictions = gestureLib.recognize(gesture);
      for (Prediction prediction : predictions) {
        if (prediction.score > 1.0) {
          Toast.makeText(this, prediction.name+"  "+Double.toString(prediction.score),
  Toast.LENGTH_SHORT).show();
          if(prediction.name.contains("2"))
             drawView.setState(1);
          else
           drawView.setState(0);
         break;
        }
      }   
 }
}

//DrawView.java
package com.example.test;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;
public class DrawView extends View {
 Paint paint;
 int state = 0;
 public DrawView(Context context) {
  super(context);
  paint=new Paint();  // TODO Auto-generated constructor stub
 }
 @Override
 protected void onDraw(Canvas canvas) {
  // TODO Auto-generated method stub
  switch(state){
  case 0:
   paint.setColor(Color.BLUE);
   break;
  case 1:
   paint.setColor(Color.RED);
   break;
  }

  canvas.drawCircle(10, 10, 10, paint);
  super.onDraw(canvas);
 }
 public void setState(int s){
  state = s;
  invalidate();
 }
}

2013年3月30日 星期六

[ Android Gesture ] GestureDetector手勢範例二

利用長按手勢來啟動計次。

增加程式


[ Android Gesture ] GestureDetector手勢範例一


在Android官方網站中,有關GestureDetector的建構元(see http://developer.android.com/reference/android/view/GestureDetector.html),有一些在新版的API中將作廢,例如:
  • public GestureDetector (GestureDetector.OnGestureListener listener, Handler handler)
  • public GestureDetector (GestureDetector.OnGestureListener listener)

因此在本文中擬使用支援API Level 8的建構元來實作範例。

public GestureDetector (Context context, GestureDetector.OnGestureListener listener, Handler handler, boolean unused)

在這個函式中有四個參數,分別是Context、OnGestureListener、Handler、boolean等資料型態的物件,其中最後一個是用來說明是否使用Handler。
其步驟如下:
1.建立新檔。
 

 2.為TextView增加ID。
 3.宣告TextView物件,使用findViewById建立UI的聯結。
 4. 增加OnGestureListener介面物件。
 5.宣告並建立GestureDetector物件。
 6.增加onTouchEvent事件函式,並聯結GestureDetector物件。
7.執行結果。


2013年3月28日 星期四

[ SQLite Expert ] 好用的資料庫管理工具分享

SQLite Expert是一套很好用的SQLite資料庫管理工具,該軟體可以分成2個版本:專業版SQLite Expert Professional 及個人版SQLite Expert Personal,專業版是付費軟體,提供30天試用期,而個人版則是免費軟體,但僅提供簡易功能。兩者的功能差別說明在http://www.sqliteexpert.com/features.html。在該網站也提供5個教學影片,包括:
  1. 建立資料庫,http://www.sqliteexpert.com/tutorial_create_db.html
  2. 使用表格設計員建立表格,http://www.sqliteexpert.com/tutorial_create_table.html
  3. 使用SQL腳本建立表格,http://www.sqliteexpert.com/tutorial_create_more_tables.html
  4. 建立主鍵,http://www.sqliteexpert.com/tutorial_add_primary_key.html
  5. 執行SQL腳本來增加資料記錄,http://www.sqliteexpert.com/tutorial_add_data_using_sql.html
另一款好用的SQLite資料庫管理工具,由Masked提供"FireFox也有一套管理工具叫 SQLite Manager也不錯用"。網址:https://code.google.com/p/sqlite-manager/

2013年3月26日 星期二

[ Windows 8 APPs ] 建立新專案

1.打開Visual Studio 2012,選擇檔案->新增->專案,如下圖.然後再選擇Windows市集,格線應用程式,格線應用程式可以建立3層操控介面的範本, 省去我們建構程式架構的時間。

 2.選擇執行後,下圖是執行結果。
 
3.在方案總管上,選擇Data Model資料夾中SampleDataSource.cs,找到SampleDataSource()建構元,就可看到畫面中的資料結構。
 4. 查看下圖及程式,讀者應可以看到其結果。
var group1 = new SampleDataGroup("Group-1",
                    "Group Title: 1",
                    "Group Subtitle: 1",
                    "Assets/DarkGray.png",
                    "Group Description: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus tempor scelerisque lorem in vehicula. Aliquam tincidunt, lacus ut sagittis tristique, turpis massa volutpat augue, eu rutrum ligula ante a ante");
            group1.Items.Add(new SampleDataItem("Group-1-Item-1",
                    "Item Title: 1",
                    "Item Subtitle: 1",
                    "Assets/LightGray.png",
                    "Item Description: Pellentesque porta, mauris quis interdum vehicula, urna sapien ultrices velit, nec venenatis dui odio in augue. Cras posuere, enim a cursus convallis, neque turpis malesuada erat, ut adipiscing neque tortor ac erat.",
                    ITEM_CONTENT,
                    group1));
 
5. 練習修改
            var group1 = new SampleDataGroup("Group-1",
                    "師資",
                    "11位教師",
                    "Assets/DarkGray.png",
                    "南開科技大學數位生活創意系擁有2位教授、3位副教授、4位助理教授、2位講師");
            group1.Items.Add(new SampleDataItem("Group-1-Item-1",
                    "林正敏",
                    "教授兼系主任",
                    "Assets/LightGray.png",
                    "專長:智慧生活科技、嵌入式系統、行動計算、車載資通訊",
                    ITEM_CONTENT,
                    group1));
 
 
6. 建立應用程式名稱(打開package.appxmanifest)

 
7. 修改標題名稱(打開App.xaml)
 





2013年3月22日 星期五

[ Android ListActivity ] ListActivity範例實作(五)

基礎練習: ListActivity範例實作(一)ListActivity範例實作(二)ListActivity範例實作(三) ListActivity範例實作(四)
1. 在android.xml上新增按鈕

 2.新增AndroidActivity程式,利用Intent把資料回傳。
 3. 新增MainActivity程式,來顯示回傳程式,記得要把startActivity改成startActivityForResult

 4.執行結果

[ Android ListActivity ] ListActivity範例實作(四)

基礎練習:ListActivity範例實作(一)ListActivity範例實作(二)ListActivity範例實作(三)
練習在兩個Activity間傳值
1. 輸入程式MainActivity.java
 2. 輸入程式AndroidActivity.java
3. 執行結果

[ Android ListActivity ] ListActivity範例實作(三)

1. 延續ListActivity範例實作(二),在專案/src的套件上按下右鍵,選擇new,建立新類別。

 
2.輸入新類別名稱:AndroidActivity,按下Superclass右邊的Browse鍵,選擇android.app.Activity類別,按下Finish鍵。

 3.在layout目錄上按下,選擇New/File。
 4.輸入檔名android.xml按下Finish鍵。
 5.新增Linear Layout及EditText UI物件

6.輸入程式MainActivity.java

 
 
 7.輸入程式AndroidActivity.java
 8. 在AndroidManifest.xml添加Activity物件。
 9. 執行結果

2013年3月17日 星期日

[ Sensor Simulator ] 感測模擬器教學資源


2.0版教學資源

感測器模擬程式 2.0下載及目錄說明






1.0版教學資源



注意!因android版本所造成的差異,Android 4.0以後目錄由lib->libs。




[ Android ListActivity ] ListActivity範例實作(二)


1.用Intent及startActivity函式來瀏覽網站,程式碼如下:
package com.example.listviewtest;

import android.net.Uri;
import android.os.Bundle;
import android.app.ListActivity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;


public class MainActivity extends ListActivity {
private String[] mStrings = {
            "南開科技大學", "南投縣電腦公會"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
        setListAdapter(new ArrayAdapter(this,
                android.R.layout.simple_list_item_1, mStrings));
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
Uri uri;
Intent i;
super.onListItemClick(l, v, position, id);
switch(position){
case 0:
            uri=Uri.parse("http://www.nkut.edu.tw");
            i=new Intent(Intent.ACTION_VIEW,uri);
            startActivity(i);
break;
case 1:
            uri = Uri.parse("http://nca.nantou.com.tw/?ptype=info");
            i = new Intent(Intent.ACTION_VIEW, uri);
            startActivity(i);

break;
}

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}


2.執行結果