现在的位置: 首页 > 综合 > 正文

android 之 回调函数

2013年10月04日 ⁄ 综合 ⁄ 共 3251字 ⁄ 字号 评论关闭

目标:

实现一个自定义的MyThread 类,定义多个其实例,

每个实例调用不同的draw()。

 

 失误点:

canvas 不是传递进来的! 是 通过holder lock得到!!!!!!!!!!!!!!!!!!!

 canvas  //canvas最易出错! 因为它的初始化是在holder.lock

 

 

关于多线程的实现:

thMain = new MyThread(6,1000, myInterface );

这里多了一个回调接口作为参数;

public interface myInterface {

	public void myIFfun();

}

然后再 自定义一个 实现该接口的类叫做 比如 ClassGrassDraw,并在它的myIFfun()中去实现自定义的draw的动作。

以此类推。如此,即实现多个不同的 画的 线程 就实现了。

 

附代码:

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(new mySur(this));
	}
}
public interface myInterface {

	public void InterfaceFun();

}
public class MyThread extends Thread{
	private int WholeTime;
	private int PerTime;
	private boolean thFlag;
	private int counter;
	
	private mySur Sur; //为了使用其成员WholeThreadFlag
	private myInterface CallBackObj; 
	
	
	public MyThread(int WholeTime, int PerTime, myInterface CallBackObj, mySur Sur){
		this.WholeTime = WholeTime;
		this.PerTime = PerTime;
		this.CallBackObj = CallBackObj;
		this.Sur = Sur;
		
		thFlag = true;
		counter = 0;
	}
	
	private void setTimer(){
		
		if(WholeTime != 0){
			
			counter += 1;
			if(counter * PerTime >= WholeTime * 1000){
				thFlag = false;
				System.out.println("Timer!! thread exit! ");
			}
		
		}
	}
	
	@Override
	public void run(){
		while(Sur.WholeThreadFlag && thFlag){
			
			try {
				CallBackObj.InterfaceFun();// 包含draw 和 logic
				
				Thread.sleep(PerTime);
				setTimer();
				
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			
		}
		
		
	}

}
import android.content.Context;

import android.graphics.Color;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;

public class mySur extends SurfaceView implements Callback{
	protected SurfaceHolder holder;
	protected Paint paint;
	protected int screenW, screenH;
	
	boolean WholeThreadFlag;
	private MyThread mainThread;
	private MainDraw mainDraw; 

	
	
	public mySur(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		holder = getHolder();
		holder.addCallback(this);
		
		paint = new Paint();
		paint.setColor(Color.WHITE);
		

		//bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.ic_launcher);
		
	}

	@Override
	public void surfaceCreated(SurfaceHolder arg0) {
		// TODO Auto-generated method stub
		screenW = getWidth();
		screenH = getHeight();
		WholeThreadFlag = true;
		
		mainDraw = new MainDraw(this.getContext(),holder,paint);
		mainThread = new MyThread(0,50,mainDraw,this);
		
		mainThread.start();
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder arg0) {
		// TODO Auto-generated method stub
		WholeThreadFlag = false;
	}

	@Override
	public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
		// TODO Auto-generated method stub
		
	}

}
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.SurfaceHolder;


public class MainDraw extends mySur implements myInterface{
	private Canvas canvas;

	
	public MainDraw(Context context, SurfaceHolder holder, Paint paint) {
		super(context);
		// TODO Auto-generated constructor stub
		this.holder = holder;
		this.paint = paint;
		
	}

	private void reallyDraw(){
		canvas.drawRect(0, 0, 100, 100, paint);
		//System.out.println("hhhhhhhhhhhhhello,world!");
	}
	
	private void logic(){
		
	}
	
	private void draw(){
		
		try{
			canvas = holder.lockCanvas();
			if(canvas != null){
				reallyDraw();
			}
		
		}catch(Exception e){
			
		}finally{
			if(canvas != null){
				holder.unlockCanvasAndPost(canvas);
			}
		}
	
	}

	@Override
	public void InterfaceFun() {
		// TODO Auto-generated method stub
		draw();
		logic();		
	}


}

 

参考:

http://wenku.baidu.com/view/4a4022a4284ac850ad024289.html 

http://wenku.baidu.com/view/78f2cb10866fb84ae45c8d8b.html

抱歉!评论已关闭.