たぼさんの部屋

いちょぼとのんびり

T013)シンプルなsurfaceViewとonTouchListener

目的

LinearLayoutにButton , SurfaceView を配置。
Button に OnTouchListener をセットして、ACTION_DOWNで 
SurfaceViewに円を描画する。

SurfaceViewには、「getHolder()」というSurfaceHolderを取得するメソッドがあります。さらにSurfaceHolderには、「lockCanvas()」というCanvasを取得するメソッドがあります。ここで取得したキャンバスに自由に描画し、最後にSurfaceHolderのunlockCanvasAndPost(Canvas)を呼び出して描画を完了します。

point

canvas

Canvas canvas = surface.getHolder().lockCanvas();
//canvasへの描画処理
surface.getHolder().unlockCanvasAndPost(canvas);

setOnTouchListener(内部クラス)

View.setOnTouchListener(new View.OnTouchListener() {
   @Override
   public boolean onTouch(View v, MotionEvent event) {
     //処理
   return true;
   }
});

動作

f:id:donsuka_kk:20121114170733p:plain

f:id:donsuka_kk:20121114170749p:plain

Main.java

package com.example.t013_simple_surfaceview;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.LinearLayout;

public class Main extends Activity {
	Context context;
	FrameLayout frame;
	LinearLayout base;
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
	    super.onCreate(savedInstanceState);
	    context = getApplicationContext();
	    //instance
	    frame = new FrameLayout(context);
	    base = new LinearLayout(context);
	    final Button btn = new Button(context);
	    final SurfaceView surface = new SurfaceView(context);
	    
	    //set
	    setContentView(frame);
	    
	    //addView
	    frame.addView(base);
	    base.addView(btn);
	    base.addView(surface);
	    
	    //property
	    base.setOrientation(LinearLayout.VERTICAL);
	    base.setBackgroundColor(Color.GRAY);
	    btn.setText("ボタンだよ");
	    
	    btn.setOnTouchListener(new View.OnTouchListener() {
			
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				
				switch(event.getAction()){
				case MotionEvent.ACTION_DOWN:
					btn.setText("押した---------");
					break;
				case MotionEvent.ACTION_UP:
					btn.setText("離した");
					break;
					
				}
				
				//surface
				Canvas canvas = surface.getHolder().lockCanvas();
				Paint paint = new Paint();
				paint.setColor(Color.BLUE);
				canvas.drawCircle(100, 100, 40, paint);
				surface.getHolder().unlockCanvasAndPost(canvas);
				return true;
			}
		});
	}

}