0

我将如何在 android 中为位图设置动画,使其以抛物线拱形或任何其他弯曲路径在屏幕上移动?目前,我正在使用的方法是使用 onDraw() 方法在画布上绘制一个带有 x/y 坐标的位图,然后在绘制完位图后将该 x/y 坐标增加一,此时方法调用 invalidate() 以使用新位置重绘位图。

更新:

也许这会给我正在尝试做的事情提供更多背景信息。下面是我现在为我的位图制作动画的实现:

canvas.drawColor(Color.TRANSPARENT);
canvas.drawBitmap(gBall, x, y, null);

x += changeX;
y += changeY;

if(x >= (canvas.getWidth()-gBall.getWidth()) || x <= 0)
    changeX = -changeX;
if(y >= (canvas.getHeight()-gBall.getHeight()) || y <= 0)
    changeY = -changeY;


invalidate();

有没有办法在仍然使用此实现时使位图 gBall 曲线接近屏幕边缘?

4

2 回答 2

0

实现一个自定义动画器。要实现自定义动画器,您所要做的就是覆盖 Animator 类的 applyTransformation 方法。然后,您可以使用自定义类的实例调用 View.startAnimation。考虑到谷歌开发人员为实现流畅动画所付出的努力,这可能是最好的解决方案——比在处理程序上执行操作要好得多,因为垃圾收集可能会导致故障。正确实现的动画,在其 applyTransform 方法中不执行内存分配,可以运行而不会产生任何垃圾收集。

如果您查看平台资源,很快就会发现无故障动画是 Android 4.x 的主要开发目标。谷歌工程师投入了大量工作来确保动画运行时不会出现故障。您的平局和无效策略实际上可能运作良好。处理程序的方法不是那么多。但如果是我,我会花更多的时间来利用已经投入到动画中的努力。

于 2013-01-15T19:53:12.023 回答
0

使用 Handler 来控制速度:

public void draw(Canvas canvas, ...){
   if (System.currentTimeMillis() - lastCall < PERIOD-50){
       mHandler.postDelayed(mReDrawRunnable,PERIOD);
       return;
   }

   //to call back
   mHandler.removeCallbacks(mReDrawRunnable);
   mHandler.postDelayed(mReDrawRunnable,PERIOD);
   lastCall = System.currentTimeMillis();

   //your code here
   ...


}
private long lastCall = 0;
private static final PERIOD = 250; //millis
private Handler mHandler = new Handler();
private Runnable mReDrawRunnable==new Runnable() {
          public void run() {YourClass.this.invalidate();}
        };

这是一种快速的方法,它应该可以工作。您应该创建另一个线程来控制绘图。

于 2013-01-15T17:46:59.220 回答