surfaceView
子线程一改变作画内容,改变一次休眠一次:
public class WelcomeViewGoThread extends Thread{
WelcomeView welcomeView;
private int sleepPan = 150;
private boolean flag = true; //循环标志
public WelcomeViewGoThread(WelcomeView welcomeView) {
this.welcomeView = welcomeView;
}
@Override
public void run() {
while(flag){
welcomeView.drawIndex++; //图片序号自驾
if(welcomeView.drawIndex > welcomeView.bitmapsID.length-1){
welcomeView.drawIndex = welcomeView.bitmapsID.length - 10; //防止数组越界
}
if(welcomeView.drawIndex % 5 == 0){
welcomeView.drawString = !welcomeView.drawString;
}
try {
Thread.sleep(sleepPan);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void setFlag(boolean flag){
this.flag = flag;
}
}
子线程二:
public class WelcomeViewDrawThread extends Thread{
WelcomeView welcomeView; //使用它的类的引用
private int sleepPan = 100;
private boolean flag = true; //循环标志
private SurfaceHolder surfaceHolder; //SufaceHolder的引用
public WelcomeViewDrawThread(WelcomeView welcomeView) {
this.welcomeView = welcomeView;
surfaceHolder = welcomeView.getHolder(); //得到surfaceHolder的引用
}
@Override
public void run() {
Canvas c; //申明画布
while(flag){
c = null;
try{
//锁定整个画布
c = this.surfaceHolder.lockCanvas();
synchronized(this.surfaceHolder){ //同步
welcomeView.onDraw(c);
}
}finally {
if(c != null){ //更新显示屏幕新内容
this.surfaceHolder.unlockCanvasAndPost(c);
}
}
try {
Thread.sleep(sleepPan);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void setFlag(boolean flag){
this.flag = flag;
}
}
SurfaceView由于可以直接从内存或者DMA等硬件接口取得图像数据,因此是个非常重要的绘图容器,
SurfaceHolder回调可以在底层的Surface被创建和销毁的时候通知View,并传递给它对SurfaceHolder对象的引用,其中包含了当前有效的Surface。
使用方法:
SurfaceView都是配合线程来使用的,在子线程上作画,主线程上显示
public class WelcomeView extends SurfaceView implements SurfaceHolder.Callback{
KLSDActivity activity; //主线程对象引用
WelcomeViewDrawThread welcomeViewDrawThread; //欢迎刷真线程
WelcomeViewGoThread welcomeViewGoThread; //动画生成线程
}
最后收尾工作:
在surfaceView的销毁方法surfaceDestroyed里面要关掉两个子线程