/*
* 建立自己的手写笔画图案
* Gesture对象是自GestureOverlay.getGesture()所取得的手写
* 对象。GestureLibraries保存手写背后所包含的意义,程序中利
* 用GestureLibraries.fromFile()方法来加载预设的Gesture文件
* 倘若默认手机的SD存储卡中尚未创建Gesture手写数据文件,此程序
* 也会处理创建新文件的工作。此外还应用了GestureLibraries.addGesture()
* 新建手写数据;GestureLibraries.save()保存写入的手写数据
* GestureLibraries.load()加载手写数据;GestureLibraries.removeGesture()
* 删除手写数据等方法。
*/
import 略;
public class Ex05_25Activity extends Activity { private Gesture ges; private GestureLibrary lib; private GestureOverlayView overlay; private Button bt1, bt2; private EditText et; private String getPath; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 查看SD卡是否存在 if (!Environment.MEDIA_MOUNTED.equals(Environment .getExternalStorageState())) { // SD卡不存在,提示信息 Toast.makeText(Ex05_25Activity.this, "SD卡不存在,程序无法执行!", Toast.LENGTH_SHORT).show(); this.finish(); } et = (EditText) findViewById(R.id.myEditText1); bt1 = (Button) findViewById(R.id.myButton1); bt2 = (Button) findViewById(R.id.myButton1); overlay = (GestureOverlayView) findViewById(R.id.myGestures1); // 取得系统默认的GestureLibrary文件路径 getPath = new File(Environment.getExternalStorageDirectory(), "gestures").getAbsolutePath(); // 设置EditText的onKeyListener et.setOnKeyListener(new EditText.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { // TODO Auto-generated method stub // 名称和手写都设置好时 将新建的Button enable if (ges != null && et.getText().length() != 0) { bt1.setEnabled(true); } else { bt1.setEnabled(false); } return false; } }); // 设置overlay的OnGestureListener overlay.addOnGestureListener(new GestureOverlayView.OnGestureListener() { // 开始手写时将添加的Button disable,并清除Gesture @Override public void onGestureStarted(GestureOverlayView overlay, MotionEvent event) { // TODO Auto-generated method stub bt1.setEnabled(false); ges = null; } // 手写完时判断名称和手写时候完整建立 @Override public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) { // TODO Auto-generated method stub ges = overlay.getGesture(); if (ges != null && et.getText().length() != 0) { bt1.setEnabled(true); } } @Override public void onGestureCancelled(GestureOverlayView overlay, MotionEvent event) { // TODO Auto-generated method stub } @Override public void onGesture(GestureOverlayView overlay, MotionEvent event) { // TODO Auto-generated method stub } }); bt1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub String gesName = et.getText().toString(); try { File file = new File(getPath); lib = GestureLibraries.fromFile(getPath); if (!file.exists()) { // 文件不存在就直接写入 lib.addGesture(gesName, ges); if (lib.save()) {// 保存成功 // 将设置画面数据清除 et.setTag(""); bt1.setEnabled(false); overlay.clear(true); Toast.makeText( Ex05_25Activity.this, getString(R.string.save_success) + ":" + getPath, Toast.LENGTH_SHORT) .show(); } else {// 保存失败 Toast.makeText( Ex05_25Activity.this, getString(R.string.save_failed) + ":" + getPath, Toast.LENGTH_LONG) .show(); } } else {// 文件存在时,想读取以保存的Gesture if (!lib.load()) {// 读取失败 Toast.makeText( Ex05_25Activity.this, getString(R.string.load_failed) + ":" + getPath, Toast.LENGTH_SHORT) .show(); } else {// 读取成功 // 如果存在相同的名称,则先将其移除再写入 Set<String> en = lib.getGestureEntries(); if (en.contains(gesName)) { ArrayList<Gesture> al = lib .getGestures(gesName); for (int i = 0; i < al.size(); i++) { lib.removeGesture(gesName, al.get(i)); } } lib.addGesture(gesName, ges); if (lib.save()) {// 保存成功 // 将设置画面数据清除 et.setTag(""); bt1.setEnabled(false); overlay.clear(true); Toast.makeText( Ex05_25Activity.this, getString(R.string.save_success) + ":" + getPath, Toast.LENGTH_SHORT) .show(); } else {// 保存失败 Toast.makeText( Ex05_25Activity.this, getString(R.string.save_failed) + ":" + getPath, Toast.LENGTH_LONG) .show(); } } } } catch (Exception e) { e.printStackTrace(); } } }); bt2.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub et.setText(""); bt1.setEnabled(false); overlay.clear(true); } }); } }
main.xml文件代码:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/white" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/myTextView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/title" android:textColor="@drawable/blue" /> <EditText android:id="@+id/myEditText1" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> <android.gesture.GestureOverlayView android:id="@+id/myGestures1" android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1.0" android:gestureStrokeType="multiple" /> <LinearLayout style="@android:style/ButtonBar" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:id="@+id/myButton1" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1" android:enabled="false" android:text="@string/button_done" /> <Button android:id="@+id/myButton2" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/button_cancel" /> </LinearLayout> </LinearLayout>