Android 建立自己的手写笔画图案 Gesture Builder

   <Button

        android:id\="@+id/button1\_id"

        android:layout\_width\="wrap\_content"

        android:layout\_height\="wrap\_content"

        android:layout\_weight\="1.0"

        android:text\="@string/str\_button1" />;

    <Button

        android:id\="@+id/button2\_id"

        android:layout\_width\="wrap\_content"

        android:layout\_height\="wrap\_content"

        android:layout\_weight\="1.0"

        android:text\="@string/str\_button2" />



其中有一个TAG为<android.gesture. GestureOverlayView>的Widget,可称为“手写绘图区”,当中有两项较重要的属性,分别为android:layout\_width设置为“fill\_parent”以及android:gestureStrokeType设置为“multiple”,这表示为支持多笔画,若设置为“single”则仅支持单一笔画。  

  

AndroidManifest.xml:



<manifest xmlns:android=“http://schemas.android.com/apk/res/android”

package\="com.example.gesturebuilderdemo"

android:versionCode\="1"

android:versionName\="1.0" 

android:installLocation=“preferExternal”

>

<uses-sdk

    android:minSdkVersion\="8"

    android:targetSdkVersion\="15" />
<application

    android:icon\="@drawable/ic\_launcher"

    android:label\="@string/app\_name"

    android:theme\="@style/AppTheme" >

   <activity

        android:name\=".GestureBuilderDemo"

        android:label\="@string/title\_activity\_gesture\_builder\_demo" >

       <intent-filter>

            <action android:name="android.intent.action.MAIN" />

           <category android:name="android.intent.category.LAUNCHER" />

        </intent-filter>

    /activity>

/application>

/manifest>




由于Gesture手写Libary文件"/sdcard/gestures"默认保存在SD存储卡中,所以需要写入External Storage的权限。  

<uses-permission android:name="android.permission.WRITE\_EXTERNAL\_STORAGE"/>  

  

再看java文件中看几个函数:  

Gesture对象是自GestureOverlayView.getGesture() 所取得的手写对象;GestureLibraries为保存手写背后所包含的意义(String),本范例利用GestureLibraries.fromFile()方法来加载预设的Gesture文件,倘若默认手机的SD存储卡中尚未创建Gesture手写数据文件,此程序也会处理创建新文件的工作。此外,程序中举例应用了GestureLibraries.addGesture()新建手写数据、GestureLibraries.save()保存写入手写数据GestureLibraries.load()加载手写数据、GestureLibraries. removeGesture()删除手写数据等方法。  

  

GestureBuilderDemo.java



package com.example.gesturebuilderdemo;

import java.io.File;

import java.util.ArrayList;

import java.util.List;

import java.util.Set;

import android.os.Bundle;

import android.os.Environment;

import android.app.Activity;

import android.gesture.Gesture;

import android.gesture.GestureLibraries;

import android.gesture.GestureLibrary;

import android.gesture.GestureOverlayView;

import android.gesture.GestureOverlayView.OnGestureListener;

import android.graphics.Bitmap;

import android.graphics.Color;

import android.util.Log;

import android.view.KeyEvent;

import android.view.Menu;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.View.OnKeyListener;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.ListView;

import android.widget.SlidingDrawer;

import android.widget.SlidingDrawer.OnDrawerCloseListener;

import android.widget.SlidingDrawer.OnDrawerOpenListener;

import android.widget.Toast;

public class GestureBuilderDemo extends Activity {

private static final String TAG=“GestureBuilderDemo”;

private Button mButton1, mButton2;

private GestureOverlayView mGestureOverlayView;//手写绘制区

private EditText mEditText;

private Gesture ges;

private GestureLibrary lib;

private String gesPath;

// ----------------------------

private ImageView mImageView;//拉动式抽屉

private SlidingDrawer mDrawer;//拉动式抽屉的手柄

private ListView mListView;//拉动式抽屉的内容

private List<String> gesNames = new ArrayList<String>();//保存手写的名称集合

private List<Bitmap> gesPics = new ArrayList<Bitmap>();//保存转换为手写的图片的集合

//------------------- -------

private LinearLayout layout_bottom;//底部的2个按钮布局

private LinearLayout layout_top;//顶部的2个按钮布局

private MyListAdapter adapter;//适配器

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

/* 查看SDCard是否存在 */

setContentView(R.layout.activity_gesture_builder_demo);

if (!Environment.MEDIA_MOUNTED.equals(Environment

.getExternalStorageState())) {

Toast.makeText(this, “SDCard不存在!”, Toast.LENGTH_SHORT).show();

this.finish();

}

/* 取得系统默认的GestureLibrary的文件路径 */

gesPath = new File(Environment.getExternalStorageDirectory(),

"gestures").getAbsolutePath();

mButton1 = (Button) this.findViewById(R.id.button1_id);

mButton2 = (Button) this.findViewById(R.id.button2_id);

mGestureOverlayView = (GestureOverlayView) this

.findViewById(R.id.myGestures1);

mEditText = (EditText) this.findViewById(R.id.edit_id);

mButton1.setEnabled(false);

mImageView = (ImageView) this.findViewById(R.id.handler);

mDrawer = (SlidingDrawer) this.findViewById(R.id.slidingDreaer);

mListView = (ListView) this.findViewById(R.id.content);

mEditText.setOnKeyListener(keyListener);

mGestureOverlayView.addOnGestureListener(onGestureListener);

mButton1.setOnClickListener(listener1);

mButton2.setOnClickListener(listener2);

layout_bottom=(LinearLayout)this.findViewById(R.id.linear_botton_id);

layout_top=(LinearLayout)this.findViewById(R.id.linear_top_id);

adapter=new MyListAdapter(this,gesNames,gesPics);

getExitGesture();//读取SD卡中的/sdcard/gestures里建立的手写,并显示在ListView中

mListView.setAdapter(adapter);

mListView.setOnItemClickListener(list_listener);

mDrawer.setOnDrawerOpenListener(onDrawerOpenListener_open);

mDrawer.setOnDrawerCloseListener(onDrawerCloseListener_close);

}

OnItemClickListener list_listener=new OnItemClickListener(){

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,

long arg3) {

// TODO Auto-generated method stub

Toast.makeText(GestureBuilderDemo.this, “GestureName:”+gesNames.get(arg2),

 Toast.LENGTH\_SHORT).show();

}

};

//抽屉打开

OnDrawerOpenListener onDrawerOpenListener_open=new OnDrawerOpenListener(){

public void onDrawerOpened() {

// TODO Auto-generated method stub

mImageView.setImageResource(R.drawable.close);

layout_bottom.setVisibility(View.GONE);

layout_top.setVisibility(View.GONE);

mGestureOverlayView.setVisibility(View.GONE);

getExitGesture();

}

};

//抽屉关闭

OnDrawerCloseListener onDrawerCloseListener_close=new OnDrawerCloseListener(){

public void onDrawerClosed() {

// TODO Auto-generated method stub

mImageView.setImageResource(R.drawable.open);

layout_bottom.setVisibility(View.VISIBLE);

layout_top.setVisibility(View.VISIBLE);

mGestureOverlayView.setVisibility(View.VISIBLE);

}

};

//读取SD卡中的/sdcard/gestures里建立的手写,并显示在ListView中

public void getExitGesture() {

Log.i(TAG, “getExitGesture()”);

gesNames.clear();

gesPics.clear();

File f = new File(gesPath);

lib = GestureLibraries.fromFile(f);

if (f.exists()) {

if (!lib.load()) {

Toast.makeText(GestureBuilderDemo.this, "加载失败!!",

  Toast.LENGTH\_SHORT).show();

} else {

Object\[\] obj \= lib.getGestureEntries().toArray();

for (int i = 0; i &lt; obj.length; i++) {

 ArrayList&lt;Gesture&gt; al = lib.getGestures(obj\[i\].toString());

// Log.i(TAG, "i="+i);

 for (int j = 0; j &lt; al.size(); j++) {

//  Log.i(TAG, "j="+j);

//  Log.i(TAG, "obj\[i\].toString()==="+obj\[i\].toString());

  // 手写名称

  gesNames.add(obj\[i\].toString());

  Gesture gs \= (Gesture) al.get(j);

  //将手写转成Bitmap图片

  gesPics.add(gs.toBitmap(50, 50, 12, Color.MAGENTA));

 }

}

}

} else {

Toast.makeText(GestureBuilderDemo.this, “文件不存在!”,

 Toast.LENGTH\_SHORT).show();

}

adapter.notifyDataSetChanged();

}

OnGestureListener onGestureListener = new OnGestureListener() {

public void onGesture(GestureOverlayView overlay, MotionEvent event) {

// TODO Auto-generated method stub

}

public void onGestureCancelled(GestureOverlayView overlay,

MotionEvent event) {

// TODO Auto-generated method stub

}

public void onGestureEnded(GestureOverlayView overlay, MotionEvent event) {

// TODO Auto-generated method stub

ges = overlay.getGesture();

if (ges != null

 &amp;&amp; mEditText.getText().toString().trim().length() != 0) {

mButton1.setEnabled(true);

}

}

public void onGestureStarted(GestureOverlayView overlay,

MotionEvent event) {

// TODO Auto-generated method stub

ges = null;

mButton1.setEnabled(false);

}

};

OnKeyListener keyListener = new OnKeyListener() {

public boolean onKey(View arg0, int arg1, KeyEvent arg2) {

// TODO Auto-generated method stub

if (ges != null

 &amp;&amp; mEditText.getText().toString().trim().length() != 0) {

mButton1.setEnabled(true);

} else {

mButton1.setEnabled(false);

}

return false;

}

};

@Override

public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.activity_gesture_builder_demo, menu);

return true;

}

OnClickListener listener1 = new OnClickListener() {

public void onClick(View arg0) {

// TODO Auto-generated method stub

String gestureName = mEditText.getText().toString().trim();

lib = GestureLibraries.fromFile(gesPath);

File f = new File(gesPath);

if (!f.exists()) {

/\* 文件不存在就直接写入 \*/

lib.addGesture(gestureName, ges);

if (lib.save()) {

 mEditText.setText("");

 mGestureOverlayView.clear(true);

 mButton1.setEnabled(false);

 Toast.makeText(GestureBuilderDemo.this,

   "保存成功,路径为:" + gesPath, Toast.LENGTH\_SHORT).show();

} else {

 Toast.makeText(GestureBuilderDemo.this, "保存失败!",

   Toast.LENGTH\_SHORT).show();

}

} else {

// 文件存在时,先读取已经存在的Gesture

if (lib.load()) {

 /\* 如果Library中存在相同名称,则先将其移除再写入 \*/

 Set&lt;String&gt; set = lib.getGestureEntries();

 if (set.contains(gestureName)) {

  ArrayList&lt;Gesture&gt; list = lib.getGestures(gestureName);

  for (int i = 0; i &lt; list.size(); i++) {

   //删除手写数据

   lib.removeGesture(gestureName, list.get(i));

  }

 }

 //新增手写数据

 lib.addGesture(gestureName, ges);

 // 保存写入手写数据

 if (lib.save()) {

  mEditText.setText("");

  mGestureOverlayView.clear(true);

  mButton1.setEnabled(false);

  Toast.makeText(GestureBuilderDemo.this,

    "保存成功,路径为:" + gesPath, Toast.LENGTH\_SHORT)

    .show();

 } else {

  Toast.makeText(GestureBuilderDemo.this, "保存失败!",

    Toast.LENGTH\_SHORT).show();

 }

} else {

 Toast.makeText(GestureBuilderDemo.this, "加载失败!",

   Toast.LENGTH\_SHORT).show();

}

}

mDrawer.toggle();

}

};

OnClickListener listener2 = new OnClickListener() {

public void onClick(View arg0) {

// TODO Auto-generated method stub

mEditText.setText(“”);

mGestureOverlayView.clear(true);

mButton1.setEnabled(false);

}

};

}




ListView的适配器文件:



package com.example.gesturebuilderdemo;

import java.util.List;

import android.content.Context;

import android.graphics.Bitmap;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.ImageView;

import android.widget.TextView;

public class MyListAdapter extends BaseAdapter {

private Context mContext;

private List<String> gesNames ;

private List<Bitmap> gesPics ;

public MyListAdapter(Context mContext,List<String> gesNames,List<Bitmap> gesPics )

{

this.mContext=mContext;

this.gesNames=gesNames;

this.gesPics=gesPics;

}

public int getCount() {

// TODO Auto-generated method stub

return gesNames.size();

}

public Object getItem(int arg0) {

// TODO Auto-generated method stub

return gesNames.get(arg0);

}

public long getItemId(int position) {

// TODO Auto-generated method stub

return position;

}

public View getView(int position, View convertView, ViewGroup parent) {

// TODO Auto-generated method stub

convertView= LayoutInflater.from(mContext).inflate(R.layout.list, null);

ImageView img=(ImageView)convertView.findViewById(R.id.img_id);

img.setImageBitmap(gesPics.get(position));

TextView text=(TextView)convertView.findViewById(R.id.text_id);

text.setText(gesNames.get(position));

return convertView;

}

}




ListView的布局配置文件:



<?xml version="1.0" encoding="UTF-8"?>

<RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”

android:layout\_width\="fill\_parent"

android:layout\_height\="fill\_parent" >

<ImageView

    android:id\="@+id/img\_id"

    android:layout\_width\="wrap\_content"

    android:layout\_height\="wrap\_content"

    android:layout\_alignParentLeft\="true"

    android:contentDescription\="@string/app\_name" />

<TextView

    android:id\="@+id/text\_id"

    android:layout\_width\="wrap\_content"

    android:layout\_height\="wrap\_content"

    android:layout\_toRightOf\="@+id/img\_id"

    android:lines\="1"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值