Android 在自定义视图的画布上设置位图动画时遇到问题
我正在尝试使用自定义视图(称为MyView)模拟动画。我试图显示一个位图在屏幕上移动。我的计划是让视图的onDraw方法在给定的x,y绘制位图。我可以增加x并重新绘制位图。下面是一些代码: MyViewAndroid 在自定义视图的画布上设置位图动画时遇到问题,android,animation,canvas,bitmap,Android,Animation,Canvas,Bitmap,我正在尝试使用自定义视图(称为MyView)模拟动画。我试图显示一个位图在屏幕上移动。我的计划是让视图的onDraw方法在给定的x,y绘制位图。我可以增加x并重新绘制位图。下面是一些代码: MyView public class MyView extends View { private Bitmap block; public MyView(Context context) { super(context); this.block = Bitm
public class MyView extends View {
private Bitmap block;
public MyView(Context context) {
super(context);
this.block = BitmapFactory.decodeResource(getResources(), R.mipmap.block);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.BLACK);
//block is a bitmap of a block…
canvas.drawBitmap(block, MainActivity.x, 100, null);
}
}
main活动
public class MainActivity extends ActionBarActivity {
public static int x = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyView myView = (MyView) findViewById(R.id.canvas);
myView.invalidate();
Button butt = (Button) findViewById(R.id.butt);
butt.setOnClickListener((v) - > {
for (int i = 0; i < 10; i++) {
x += 10;
myView.invalidate();
SystemClock.sleep(500);
}
});
}
公共类MainActivity扩展了ActionBarActivity{
公共静态int x=0;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyView MyView=(MyView)findviewbyd(R.id.canvas);
myView.invalidate();
按钮对接=(按钮)findViewById(R.id.butt);
butt.setOnClickListener((v)->{
对于(int i=0;i<10;i++){
x+=10;
myView.invalidate();
系统时钟。睡眠(500);
}
});
}
因此,我看到我的block
坐在屏幕的左侧,到目前为止还不错。当我按下按钮butt
,我想会发生什么,我会看到block
的5秒动画以2 FPS的速度在屏幕上移动
取而代之的是,有5秒的延迟,屏幕上没有变化,然后块向右移动了100个像素。for循环中的所有“中间”帧似乎都发生在幕后,我只看到块在for循环末尾的位置
那么如何查看“实时”动画;如何确保屏幕随着每次调用而更新以使其无效?在自定义MyView中使用ValueAnimator/ObjectAnimator也不要使用loop with sleep,因为您没有给UI线程时间来重新绘制/刷新视图(它只是阻止UI线程),将其放入postDelayed循环或使用另一个thread@pskink值动画师做了这个把戏,谢谢!