在android中制作画布动画

phi*_*lip 5 java android

我是 android 新手,我在理解如何为画布设置动画时遇到问题。基本上,当球应该从楼梯上掉下来时,我已经画了一个红球和一个楼梯

这是它的样子。

在此处输入图片说明

谁能帮助我我应该使用什么方法?如果你能给我提供一个非常有帮助的源代码。

这是我的源代码:

绘图视图.java

package com.ballandstair;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.view.View;

public class DrawingView extends View {
    DrawingView(Context context) {
        super(context);
    }

    protected void onDraw(Canvas canvas){
        super.onDraw(canvas);
        Paint paint = new Paint();
        Path path = new Path();

        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.RED);
        paint.setAntiAlias(true);
        canvas.drawCircle(100, 50, 25, paint);

        paint.setColor(Color.BLUE);
        paint.setStyle(Paint.Style.FILL);
        path.moveTo(75, 75);
        path.lineTo(125, 75);
        path.lineTo(125, 125);
        path.lineTo(175, 125);
        path.lineTo(175, 175);
        path.lineTo(225, 175);
        path.lineTo(225, 225);
        path.lineTo(275, 225);
        path.lineTo(275, 275);
        path.lineTo(325, 275);
        path.lineTo(325, 325);
        path.lineTo(75, 325);
        path.close();
        canvas.drawPath(path, paint);

    }
}
Run Code Online (Sandbox Code Playgroud)

主活动.java

package com.ballandstair;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DrawingView drawing = new DrawingView(this);
        setContentView(drawing);


    }
}
Run Code Online (Sandbox Code Playgroud)

Ted*_*opp 1

您将需要(至少)做两件事:

  1. 修改代码,使球的位置可变。这应该不会太难。
  2. 有一种方法可以更新定义球位置的变量并触发自定义视图的重绘,以便随着时间的推移,球看起来会遵循您想要的路径。

第二步需要稍微小心。您可能会想编写一个循环来调用Thread.sleep(frameRate)(其中frameRate是帧之间的毫秒数)、更新球位置,然后调用invalidate()自定义视图来触发重绘。这样做的问题是您无法暂停事件线程。有(同样)两种处理此问题的方法:

  1. 创建一个具有动画循环的工作线程。它不能invalidate()直接调用,但是可以调用postInvalidate()达到同样的效果。
  2. 声明 ,Runnable在其run()方法中更新球位置,调用invalidate(),然后要求视图Runnable在延迟后再次运行自身frameRate(通过调用postDelayed())。

这两种方法都是合理的方法。您还需要逻辑来知道动画何时结束,并且您可能希望让用户控制动画何时开始或允许重播。