5

我是 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);

    }
}

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


    }
}
4

2 回答 2

2

基本上任何动画逻辑都由 3 个组件组成:

  • 参数:要绘制的对象的位置、旋转和比例;

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

  • 无限循环:绘制 -> 更新 -> 绘制 ... 无限循环

有很多方法可以实现它们,我只能推荐一些你可以使用的 API:

  • View.invalidate(),使用它来请求框架重绘您的视图,因此您的 onDraw() 方法将被调用。

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

于 2012-08-10T02:35:38.867 回答
1

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

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

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

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

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

于 2012-08-10T02:38:45.790 回答