【Android】SurfaceViewに対するタッチイベントで再描画する

SurfaceViewに対するイベント処理も、考え方は通常のViewでの処理とほとんどかわりません。

今回はSurfaceViewに描画した真顔のイラストをタッチ後、笑顔にする。

【準備画像】

SurfaceViewにタッチイベント

public class SampleSurfaceView extends SurfaceView implements SurfaceHolder.Callback{
	
	// 表示する画像
	private Bitmap image01;
	private Bitmap image02;
	private Bitmap image03;
	private Bitmap image02b;
     
	// コンストラクタ
	public SampleSurfaceView4(Context context) {
		super(context);
         
		getHolder().addCallback(this);
		// Bitmapリソースを用意
		image01 = BitmapFactory.decodeResource(getResources(), R.drawable.face);
		image02 = BitmapFactory.decodeResource(getResources(), R.drawable.eye);
		image02b = BitmapFactory.decodeResource(getResources(), R.drawable.eye2);
		image03 = BitmapFactory.decodeResource(getResources(), R.drawable.mouth);
	}
     
	// SurfaceView生成時に呼び出される(初期画面の描画)
	public void surfaceCreated(SurfaceHolder holder) {
    	
		doDraw(holder);
	}
     
	// SurfaceView変更時に呼び出される(画面の更新処理)
	public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
		// 処理がない場合も必要
	}
     
	// SurfaceView破棄時に呼び出される(画面の削除、削除後の処理)
	public void surfaceDestroyed(SurfaceHolder holder) {
		// 処理がない場合も必要
	}
    
	private void doDraw(SurfaceHolder holder) {
		// Canvas取得しロックする
		Canvas canvas = holder.lockCanvas();
		Paint paint = new Paint();
		//paint.setColor(Color.WHITE);
         
		// 描画処理
		canvas.drawBitmap(image01, 0, 0, paint);
		canvas.drawBitmap(image02, 0, 0, paint);
		canvas.drawBitmap(image03, 0, 0, paint);
         
		// LockしたCanvasを解放する
		holder.unlockCanvasAndPost(canvas);
	}
	
	private void onDraw(SurfaceHolder holder) {
		// Canvas取得しロックする
		Canvas canvas = holder.lockCanvas();
		Paint paint = new Paint();
		//paint.setColor(Color.WHITE);
         
		// 描画処理
		canvas.drawBitmap(image01, 0, 0, paint);
		canvas.drawBitmap(image02b, 0, 0, paint);
		canvas.drawBitmap(image03, 0, 0, paint);
         
		// LockしたCanvasを解放する
		holder.unlockCanvasAndPost(canvas);
	}
	
	// タッチイベント
	@Override
	public boolean onTouchEvent(MotionEvent event){
		onDraw(getHolder());
		return true;
	}
}

【実行結果】
SurfaceViewでオンタッチイベント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>