在android中制作画布动画

时间:2012-08-10 02:15:48

标签: java android

我是android的新手,我在理解如何动画画布时遇到了问题。 基本上,当球从楼梯上落下时,我画了一个红球和一个楼梯

这就是它的样子。

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 个答案:

答案 0 :(得分:1)

基本上任何动画逻辑都由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()的无限循环。

答案 1 :(得分:0)

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

  1. 修改您的代码,以便球的位置可变。这不应该太难。
  2. 有办法更新定义球位置的变量并触发自定义视图的重绘,以便随着时间的推移球看起来像你想要的路径。
  3. 第二步需要一点小心。您可能想要编写一个调用Thread.sleep(frameRate)的循环(其中frameRate是帧之间的毫秒数),更新球位置,然后调用invalidate()以使您的自定义视图触发一个重画。这个问题是你无法暂停事件线程。 (再次)有两种处理方式:

    1. 创建具有动画循环的工作线程。它无法直接调用invalidate(),但可以将postInvalidate()调用为相同的效果。
    2. 声明Runnable在其run()方法中更新球位置,调用invalidate(),然后要求视图在延迟后再次运行Runnable本身frameRate(通过致电postDelayed())。
    3. 这两种方法都是合理的方法。您还需要逻辑来了解动画何时结束,并且您可能希望让用户控制它何时开始或允许重放。