微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – 在Surface View中动画和旋转图像

我想在SurfaceView上制作动画动画.理想情况下,我想在动画结束后收到通知.

例如:
我可能有一辆朝北的汽车.如果我想动画它以使其面向南方持续500ms,我该怎么办呢?

我使用的是SurfaceView,因此必须手动处理所有动画,我认为我不能使用XMLAndroid Animator类.

此外,我想知道在SurfaceView中连续动画内容的最佳方法(即步行循环)

解决方法

手动旋转图像可能有点痛苦,但这就是我如何做到的.
private void animateRotation(int degrees,float durationOfAnimation){
    long startTime = SystemClock.elapsedRealtime();
    long currentTime;
    float elapsedratio = 0;
    Bitmap bufferBitmap = carBitmap;

    Matrix matrix = new Matrix();

    while (elapsedratio < 1){
        matrix.setRotate(elapsedratio * degrees);
        carBitmap = Bitmap.createBitmap(bufferBitmap,width,height,matrix,true);
        //draw your canvas here using whatever method you've defined
        currentTime = SystemClock.elapsedRealtime();
        elapsedratio = (currentTime - startTime) / durationOfAnimation;
    }

    // As elapsed ratio will never exactly equal 1,you have to manually draw the last frame
    matrix = new Matrix();
    matrix.setRotate(degrees);
    carBitmap = Bitmap.createBitmap(bufferBitmap,true);
    // draw the canvas again here as before
    // And you can Now set whatever other notification or action you wanted to do at the end of your animation

}

这会将carBitmap旋转到指定绘制最后一帧的时间指定的任何角度.然而,有一个问题.这会旋转您的carBitmap而不会正确调整其在屏幕上的位置.根据您绘制位图的方式,最终可能会在位图的左上角保持原位时旋转carBitmap.随着汽车的旋转,位图将拉伸并调整以适应新的汽车尺寸,用透明像素填充其周围的空隙.很难描述它的外观,所以这是一个旋转方块的例子:

灰色区域表示位图的完整大小,并填充透明像素.要解决此问题,您需要使用三角函数.它有点复杂…如果这最终成为你的问题(我不知道你是如何将你的位图绘制到画布上所以它可能不是),你无法解决问题,让我知道,我会发布我是如何做到的.

(我不知道这是否是最有效的方法,但只要位图小于300×300左右,它就能顺利运行.也许如果有人知道更好的方法,他们可以告诉我们!)

原文地址:https://www.jb51.cc/android/316292.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐