让canvas在安卓中实现动画

5

我是一个新手使用安卓系统,对于如何在画布上制作动画不太理解。 我已经画了一个红球和一个楼梯,现在需要让球从楼梯顶部掉下来。

以下是示例图像:

enter image description here

请问有谁能帮我解决问题?如果能够提供源代码就更好啦。

这是我的源代码:

DrawingView.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);

    }
}

MainActivity.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);


    }
}
2个回答

2
基本上,任何动画逻辑都由三个组件组成:
  • 参数:你将要绘制的对象的位置、旋转和缩放;

  • 线程:你可以选择使用两个线程来分别绘制和更新对象属性(位置、旋转和缩放),或者在一个线程中完成它们。

  • 无限循环:一个循环,不断进行绘制-更新-绘制...

有许多实现它们的方法,我只能建议您使用一些API:
  • View.invalidate(),使用它来请求框架重新绘制您的视图,这样您的onDraw()方法就会被调用。

  • [View.postDelayed()](http://developer.android.com/reference/android/view/View.html#postDelayed(java.lang.Runnable, long)),使用它在你的onDraw()方法的末尾创建无限循环来调用View.invalidate()。


1

你需要做(至少)两件事情:

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

第二步需要一些小心。你可能会想编写一个循环,调用 Thread.sleep(frameRate)(其中 frameRate 是帧之间的毫秒数),更新球的位置,然后调用 invalidate() 来触发自定义视图的重绘。但问题在于你不能暂停事件线程。有两种处理方式:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接