手書き入力を行うために・・・
onTouchEventを取得する
今回は応用編
前回説明のPathを利用して手書き入力を行いたいと思います
Pathによる線の描画
まずはViewクラスの独自クラスを作成するところまでは同じです
Viewクラスへのグラフィックの描画
その中には描写を担当するViewメソッドがありますが
今回はその中にonTouchEventを追加します
//イベントのタイプごとに処理を設定
public boolean onTouchEvent(MotionEvent e){
switch(e.getAction()){
case MotionEvent.ACTION_DOWN: //最初のポイント
//押された時のイベント記入
break;
case MotionEvent.ACTION_MOVE: //途中のポイント
//そのまま移動時のイベント記入
break;
case MotionEvent.ACTION_UP: //最後のポイント
//離された時ののイベント記入
break;
default://その他
break;
}
return true;
}
onTouchEventは画面がタッチされた時、そのまま移動したとき、離した時のイベントをそれぞれ取得します
MotionEvent.ACTION_DOWN:・・・タッチされた時
MotionEvent.ACTION_MOVE:・・・移動したとき
MotionEvent.ACTION_UP:・・・離したとき
押された場所を取得する
押された場所は
e.getX();および
e.getY();でそれぞれx座標・y座標を取得します
まずはfloatで変数を定義します
private float pos_x = 0f; //イベントが起きたX座標
private float pos_y = 0f; //イベントが起きたY座標
タッチされた時に座標を取得し
moveToで移動します
pos_x = e.getX();//x座標取得
pos_y = e.getY();//y座標取得
//押されたPointに移動
path.moveTo(e.getX(), e.getY());
移動中は同様に取得し今度は
lineToで線を描きます
pos_x = e.getX();
pos_y = e.getY();
path.lineTo(pos_x, pos_y);
invalidate();
path.lineToでpathに入れた後にinvalidate();
でonDrawで描写します
Viewの状態を保存するためのBitmapを作成
最後に指が離れたときにbitmapとして保存させます
まずはbitmapを新規で作成します
//Viewの状態を保存するためのBitmap
private Bitmap bitmap = null;
次に
setDrawingCacheEnabled();
を使用しキャッシュ機能をオンにして画面状態を保持します
保持した画面をbitmapに保存し再びキャッシュ機能をオフにすることで保存が可能です
path.lineTo(e.getX(), e.getY());
//キャッシュの中からキャプチャを作成するので、その一瞬の為にキャッシュをON
setDrawingCacheEnabled(true);
bitmap = Bitmap.createBitmap(getDrawingCache());
setDrawingCacheEnabled(false);
まとめ
1.タッチされたポイントにmoveTo
2.移動中はlineToで描き続ける
3.離されたときにbitmap保存
4.onDrawで描写の設定
となります
以下に全体を載せますんで参考に・・・
package draw.test;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
public class DrawActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//カスタムビューを表示
setContentView(new CustomView(this));
}
}
//独自クラス
class CustomView extends View {
private float pos_x = 0f; //イベントが起きたX座標
private float pos_y = 0f; //イベントが起きたY座標
private Path path = null; //パス新規作成
private Bitmap bitmap = null; //Viewの状態を保存するためのBitmap
public CustomView(Context context) {
super(context);
setFocusable(true);
}
//イベントのタイプごとに処理を設定
public boolean onTouchEvent(MotionEvent e){
switch(e.getAction()){
case MotionEvent.ACTION_DOWN: //最初のポイント
path = new Path();//pathを新規作成
pos_x = e.getX();//x座標取得
pos_y = e.getY();//y座標取得
//押されたPointに移動
path.moveTo(e.getX(), e.getY());
break;
case MotionEvent.ACTION_MOVE: //途中のポイント
pos_x = e.getX();
pos_y = e.getY();
path.lineTo(pos_x, pos_y);
invalidate();
break;
case MotionEvent.ACTION_UP: //最後のポイント
path.lineTo(e.getX(), e.getY());
//キャッシュの中からキャプチャを作成するので、その一瞬の為にキャッシュをON
setDrawingCacheEnabled(true);
bitmap = Bitmap.createBitmap(getDrawingCache());
setDrawingCacheEnabled(false);
invalidate();
break;
default://その他
break;
}
return true;
}
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(bitmap != null){
canvas.drawBitmap(bitmap, 0, 0, null);
}
//この間にグラフィック描画のコードを記述する
Paint paint = new Paint();
//色を設定
paint.setColor(Color.YELLOW);
//線の太さを指定
paint.setStrokeWidth(5);
//線を滑らかに書く
paint.setAntiAlias(true);
//線で描く
paint.setStyle(Paint.Style.STROKE);
//端点を丸く
paint.setStrokeCap(Paint.Cap.ROUND);
//つなぎ目を丸く
paint.setStrokeJoin(Paint.Join.ROUND);
//pathを描写
if(path != null){
canvas.drawPath(path, paint);
}
//終了
}
}
スポンサードリンク