surfaceView 轮流绘制图片,在一个SurfaceView 中连续播放三张图片,后台修改数据线程有问题,大家帮帮我吧。
public class AnimationView extends SurfaceView implements SurfaceHolder.Callback{
AnimationDrawThread adt; //后台重绘线程
AnimationThread at; //后台修改数据线程
Bitmap [] bitmaps; //轮流播放的三张图片数组
int index= 0; //3个动画图片的索引
int status=-1; // 0 代表3个动画图片进来,1代表旋转背景图片进来,2代表全部渐显,3代表待命
public AnimationView(AnimationMainActivity father) {
super(father);
// TODO Auto-generated constructor stub
getHolder().addCallback(this);
initBitmap(getResources());
at = new AnimationThread(this);
adt = new AnimationDrawThread(this,getHolder());
status = 0;
} public void initBitmap(Resources r){
bitmaps = new Bitmap[3];
bitmaps[0] = BitmapFactory.decodeResource(r, R.drawable.p1);
bitmaps[1] = BitmapFactory.decodeResource(r, R.drawable.p2);
bitmaps[2] = BitmapFactory.decodeResource(r, R.drawable.p3);
}
public void doDraw(Canvas canvas){
Paint paint = new Paint();
switch (status) {
case 0:
canvas.drawBitmap(bitmaps[index], 0,0,paint);
break;
case 1: //全场透明
default:
break;
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
} public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
if(!at.isAlive()){ //这里的at 是修改数据线程对象,可是如果没有修改数据线程,这里就是重绘线程对象,搞不清楚啊
adt.start();
}
} public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
if(at.isAlive()){
at.flag = false;
}
}}//后台重绘线程就不贴上来了,因为是正确的,
// 下面的修改数据线程
AnimationView father;
boolean flag;
float rotateAngle = 60;
int rotateCounter = 0; //旋转计数器
int animationCounter = 0; //换帧计数器
int sleepSpan=1000; //休眠时间
public AnimationThread(AnimationView father){
this.father = father;
flag = true;
}
public void run(){
while(flag){
switch (father.status) {
case 0:
animationCounter++;
if(animationCounter==4){
father.index++; //好像就是没有执行这里的方法,不知道是什么原因
if(father.index==3){
father.status=1;
}
animationCounter=0;
}
break;
case 1:
this.flag = false;
break;
default:
break;
}
try {
Thread.sleep(sleepSpan);
}
catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
}
public class AnimationView extends SurfaceView implements SurfaceHolder.Callback{
AnimationDrawThread adt; //后台重绘线程
AnimationThread at; //后台修改数据线程
Bitmap [] bitmaps; //轮流播放的三张图片数组
int index= 0; //3个动画图片的索引
int status=-1; // 0 代表3个动画图片进来,1代表旋转背景图片进来,2代表全部渐显,3代表待命
public AnimationView(AnimationMainActivity father) {
super(father);
// TODO Auto-generated constructor stub
getHolder().addCallback(this);
initBitmap(getResources());
at = new AnimationThread(this);
adt = new AnimationDrawThread(this,getHolder());
status = 0;
} public void initBitmap(Resources r){
bitmaps = new Bitmap[3];
bitmaps[0] = BitmapFactory.decodeResource(r, R.drawable.p1);
bitmaps[1] = BitmapFactory.decodeResource(r, R.drawable.p2);
bitmaps[2] = BitmapFactory.decodeResource(r, R.drawable.p3);
}
public void doDraw(Canvas canvas){
Paint paint = new Paint();
switch (status) {
case 0:
canvas.drawBitmap(bitmaps[index], 0,0,paint);
break;
case 1: //全场透明
default:
break;
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
} public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
if(!at.isAlive()){ //这里的at 是修改数据线程对象,可是如果没有修改数据线程,这里就是重绘线程对象,搞不清楚啊
adt.start();
}
} public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
if(at.isAlive()){
at.flag = false;
}
}}//后台重绘线程就不贴上来了,因为是正确的,
// 下面的修改数据线程
AnimationView father;
boolean flag;
float rotateAngle = 60;
int rotateCounter = 0; //旋转计数器
int animationCounter = 0; //换帧计数器
int sleepSpan=1000; //休眠时间
public AnimationThread(AnimationView father){
this.father = father;
flag = true;
}
public void run(){
while(flag){
switch (father.status) {
case 0:
animationCounter++;
if(animationCounter==4){
father.index++; //好像就是没有执行这里的方法,不知道是什么原因
if(father.index==3){
father.status=1;
}
animationCounter=0;
}
break;
case 1:
this.flag = false;
break;
default:
break;
}
try {
Thread.sleep(sleepSpan);
}
catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货