【问题标题】:Animate Bitmap to Move on a Curve动画位图以在曲线上移动
【发布时间】:2025-12-14 13:30:01
【问题描述】:

如何在 android 中为位图设置动画,使其以抛物线拱形或任何其他弯曲路径在屏幕上移动?目前,我使用的方法是使用 onDraw() 方法在画布上绘制一个带有 x/y 坐标的位图,然后在绘制完位图后将该 x/y 坐标增加 1,此时方法调用 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 在接近屏幕边缘时呈现曲线?

【问题讨论】:

    标签: android bitmap android-animation


    【解决方案1】:

    使用 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();}
            };
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】: