Android 在自定义视图的画布上设置位图动画时遇到问题

Android 在自定义视图的画布上设置位图动画时遇到问题,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

我正在尝试使用自定义视图(称为MyView)模拟动画。我试图显示一个位图在屏幕上移动。我的计划是让视图的onDraw方法在给定的x,y绘制位图。我可以增加x并重新绘制位图。下面是一些代码:

MyView

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值动画师做了这个把戏,谢谢!