如何在Android上创建一个很棒的位图动画

时间:2017-09-07 18:27:43

标签: android animation android-canvas surfaceview android-bitmap

我是初学者,所以请耐心等待。

我有一个位图图片,我希望以编程方式为其设置动画

我想在视频“独立国家”中获得徽标的动画

https://www.youtube.com/watch?v=yRU2rU2k_NI

跳过0:20来看。

无论如何,这是我所理解的,我必须这样做。如果我错了,请纠正我。

  1. 应用缩放以放大和缩小
  2. 应用转换以稍微移动它
  3. 我打算制作一个对象,有一个

     public void draw(Canvas canvas)
    

    将使用位图的方法。

    另外,我是否需要使用Matrix,或者直接修改画布是否足够?

    提前致谢!

1 个答案:

答案 0 :(得分:1)

  
      
  1. 应用缩放以放大和缩小
  2.   
  3. 应用转换以稍微移动它
  4.   

是的,您的理解是正确的。

您可以使用矩阵来达到预期的结果,如下所示。

public class LogoView extends View {
    public LogoView(Context context) {
        super(context);
        init();
    }

    public LogoView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public LogoView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        logo = BitmapFactory.decodeResource(getResources(), R.drawable.logo);
        logoLeft = -logo.getWidth() >> 1;
        logTop = -logo.getHeight() >> 1;
        matrix = new Matrix();
    }

    private Bitmap logo;
    private Matrix matrix;
    private float logoLeft, logTop;

    private float SCALE_FACTOR = 0.07f;
    private float TRANSLATE_FACTOR = 0.03f;

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        matrix.reset();
        matrix.setTranslate(getWidth() >> 1, getHeight() >> 1);
        canvas.setMatrix(matrix);
        float scaleFactor = (float) (Math.random() * SCALE_FACTOR) + 1.f;
        canvas.scale(scaleFactor, scaleFactor);
        float dx = (float) ((Math.random() - 0.5) * TRANSLATE_FACTOR) * logo.getWidth();
        float dy = (float) ((Math.random() - 0.5) * TRANSLATE_FACTOR) * logo.getHeight();
        canvas.translate(dx, dy);
        canvas.drawBitmap(logo, logoLeft, logTop, null);
        postInvalidateDelayed(150);
    }
}