SurfaceViewDeamon

4021 ワード

activity:
package com.example.surfaceviewdeamon;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		MySurfaceView m=new MySurfaceView(this);
		setContentView(m);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}

}
sufaceview:
 
package com.example.surfaceviewdeamon;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback{

	private SurfaceHolder sfh;
	private Mythread m_thread;
	private boolean flag;
	private float x=10;
	private float y=10;
	
	private float cx=200;
	private float cy=200;
	
	private float degree;
	private Paint pen;
	private Canvas canvas;
	private Bitmap bmp;
	
	
	public MySurfaceView(Context context) {
		super(context);
		Log.i("Tag","surface ");
		// TODO Auto-generated constructor stub
		Init();
	}
	
	public void Init(){
		
		sfh=getHolder();
		sfh.addCallback(this);
		
		bmp=BitmapFactory.decodeResource(getResources(), R.drawable.hey);
		pen=new Paint();
		pen.setStrokeWidth(20);
		pen.setColor(Color.GREEN);
		canvas=new Canvas();
		degree=0;
	}
	
	public void MyOnDraw(){
		try{
			canvas=sfh.lockCanvas();
			if(canvas!=null){
				
//				pen.setColor(Color.GREEN);
//				canvas.drawPoint(x, y, pen);
//				pen.setColor(Color.BLACK);
//				canvas.drawRect(0, 0, this.getWidth(), this.getHeight(), pen);
//				pen.setColor(Color.BLUE);
//				canvas.save();
//				canvas.rotate(degree, cx+bmp.getWidth()/2, cy+bmp.getHeight()/2);
//				canvas.drawBitmap(bmp, cx, cy,pen);
//				canvas.restore();
//				canvas.drawText(" :"+degree, 155, 100, pen);
				
				
				Matrix mx=new Matrix();
				canvas.drawBitmap(bmp, cx, cy, pen);
				mx.postRotate(degree, bmp.getWidth()/2, bmp.getHeight()/2);
				mx.postTranslate(cx, cy);
				
				canvas.drawBitmap(bmp, mx, pen);
			}
			
		}catch(Exception e){
			
		}finally{
			if(canvas!=null){
				sfh.unlockCanvasAndPost(canvas);
			}
		}
		
		
		
	}
	

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		// TODO Auto-generated method stub
		Log.i("Tag","surfaceChange");
	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		// TODO Auto-generated method stub
		Log.i("Tag","surfaceCreate");
		flag=true;
		m_thread=new Mythread();
		m_thread.start();
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub
		if(event.getAction()==MotionEvent.ACTION_DOWN){
			x=event.getX();
			y=event.getY();
			System.out.println("downing..........");
		}
		if(event.getAction()==MotionEvent.ACTION_MOVE){
			x=event.getX();
			y=event.getY();
		}
		return true;
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		// TODO Auto-generated method stub
		Log.i("Tag","surfaceDestroyed");
		flag=false;
	}
	class Mythread extends Thread{
		@Override
		public void run() {
			// TODO Auto-generated method stub
			
			while(flag){
				long start=System.currentTimeMillis();
				MyOnDraw();
				degree=(degree+1)%360;
				long end=System.currentTimeMillis();
				try {
					if(end-start<50){
					 Thread.sleep(50-end+start);
					}
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
		}
	}

}