Androidで画面のタッチ操作を検出する

test111_01.png
今回は画面のタッチ操作の検出方法を見てみる。
EasyProjectGenerator for AndroidでNativeViewプロジェクトを生成して、Eclipseに読み込む。そしてjavaのソースコードを編集する。

test111_02.png
Viewに対して、setOnTouchListner()によりOnTouchListerner()のOnTouch()を指定する。Javaのソースを本格的?にいじるのはこれが初めて。処理の流れはJavascript、文法方法はC++という雰囲気です。

タッチ開始、ドラッグ中、タッチ終了などのイベントはevent.getAction()、タッチ座標は戻り値がfloatというのが意味不明がevent.getX()とevent.getY()で取得できるようです。
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);
	}
}

test111_03.png
これで忘れずにネイティブコードをndk-buildでビルドしてから実行すると、、、画面のドラッグでグラデーション描画領域を好きなように移動できるようになりました。




プロジェクトファイルをダウンロード


カテゴリー「android」 のエントリー