![]()
今回は画面のタッチ操作の検出方法を見てみる。
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でビルドしてから実行すると、、、画面のドラッグでグラデーション描画領域を好きなように移動できるようになりました。
プロジェクトファイルをダウンロード
