如何在 Android 上创建很棒的位图动画
How to create an awesome bitmap animation on Android
我是这方面的初学者,请多多包涵。
我有一个位图图像,我想以编程方式为它制作动画。
我想在视频中有logo的动画效果"Indie Nation"
https://www.youtube.com/watch?v=yRU2rU2k_NI
跳转点赞0:20查看
无论如何,这就是我所知道的我必须做的事情。如果我错了请纠正我。
- 应用缩放比例进行放大和缩小
- 应用变换稍微移动它
我打算做一个对象,有一个
public void draw(Canvas canvas)
将使用位图的方法。
另外,我需要使用矩阵,还是直接修改canvas就足够了?
提前致谢!
- Apply scaling for zooming in and out
- Apply transformations for slightly moving it around
是的,你的理解是正确的。
您可以使用矩阵来实现如下所示的预期结果。
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);
}
}
我是这方面的初学者,请多多包涵。
我有一个位图图像,我想以编程方式为它制作动画。
我想在视频中有logo的动画效果"Indie Nation"
https://www.youtube.com/watch?v=yRU2rU2k_NI
跳转点赞0:20查看
无论如何,这就是我所知道的我必须做的事情。如果我错了请纠正我。
- 应用缩放比例进行放大和缩小
- 应用变换稍微移动它
我打算做一个对象,有一个
public void draw(Canvas canvas)
将使用位图的方法。
另外,我需要使用矩阵,还是直接修改canvas就足够了?
提前致谢!
- Apply scaling for zooming in and out
- Apply transformations for slightly moving it around
是的,你的理解是正确的。
您可以使用矩阵来实现如下所示的预期结果。
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);
}
}