今回は画面のタッチ操作の検出方法を見てみる。
EasyProjectGenerator for AndroidでNativeViewプロジェクトを生成して、Eclipseに読み込む。そしてjavaのソースコードを編集する。
Viewに対して、setOnTouchListner()によりOnTouchListerner()のOnTouch()を指定する。Javaのソースを本格的?にいじるのはこれが初めて。処理の流れはJavascript、文法方法はC++という雰囲気です。
package com.Test111; import android.app.Activity; import android.os.Bundle; import android.content.Context; import android.view.View; import android.view.View.OnTouchListener; import android.view.MotionEvent; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Rect; public class Test111Act extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new NativeView(this)); } static { System.loadLibrary("Test111jni"); } } class NativeView extends View { private Bitmap _mBitmap; private static native void RenderBitmap(Bitmap bitmap); private boolean _bTouchDown; private float _fTouchX; private float _fTouchY; private float _fScrollX; private float _fScrollY; public NativeView(Context context) { super(context); _bTouchDown = false; _fTouchX = 0.0f; _fTouchY = 0.0f; _fScrollX = 0.0f; _fScrollY = 0.0f; final int W = 200; final int H = 200; _mBitmap = Bitmap.createBitmap(W, H, Bitmap.Config.RGB_565); this.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { float fTouchX = event.getX(); float fTouchY = event.getY(); // float fTouchSize = event.getSize(); // float fTouchPressure = event.getPressure(); switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: _bTouchDown = true; _fTouchX = fTouchX; _fTouchY = fTouchY; break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: _bTouchDown = false; //break; //break処理せずにinvalidate()まで実行する case MotionEvent.ACTION_MOVE: _fScrollX -= _fTouchX - event.getX(); _fScrollY -= _fTouchY - event.getY(); _fTouchX = fTouchX; _fTouchY = fTouchY; v.invalidate(); break; } return true; } }); } @Override protected void onDraw(Canvas canvas) { RenderBitmap(_mBitmap); int nWidth = _mBitmap.getWidth(); int nHeight = _mBitmap.getHeight(); Rect rcSrc = new Rect(0,0,nWidth, nHeight); Rect rcDst = new Rect((int)_fScrollX,(int)_fScrollY,(int)_fScrollX + nWidth,(int)_fScrollY + nHeight); canvas.drawBitmap(_mBitmap,rcSrc,rcDst,null); } }
これで忘れずにネイティブコードをndk-buildでビルドしてから実行すると、、、画面のドラッグでグラデーション描画領域を好きなように移動できるようになりました。
プロジェクトファイルをダウンロード