gpt4 book ai didi

android - 带重复的背景动画

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:15:58 25 4
gpt4 key购买 nike

在我的项目中,我想像这样无限期地为具有大图像图案的背景制作动画:

enter image description here

我想最初使用 Matrix(用于缩放和平移)和 ValueAnimator 来创建平移动画,但我不知道如何重复该模式。

这种效果的开发方法是什么?感谢您的帮助。


更新一下,我的源码不重复(注意:在GIF动画中为了表示简单,我将图像图案水平绘制,但实际上我需要一个垂直平移动画):

background.setImageResource(R.drawable.background);
background.setScaleType(ScaleType.MATRIX);

ValueAnimator animator = ValueAnimator.ofFloat(0, 1);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
private Matrix matrix = new Matrix();
@Override public void onAnimationUpdate(ValueAnimator animation) {
float factor = (Float) animation.getAnimatedValue();
int width = background.getDrawable().getIntrinsicWidth();
int height = background.getDrawable().getIntrinsicHeight();
float scale = (float) background.getWidth() / (float) width;
matrix.reset();
matrix.postTranslate(0, -height * factor);
matrix.postScale(scale, scale);
background.setImageMatrix(matrix);
}
});

animator.setInterpolator(new LinearInterpolator());
animator.setRepeatCount(ValueAnimator.INFINITE);
animator.setRepeatMode(ValueAnimator.RESTART);
animator.setDuration(10000);
animator.start();

最佳答案

我最终扩展了 BitmapDrawable 以覆盖 draw() 方法:

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.background);
BitmapDrawable drawable = new BitmapDrawable(getResources(), bitmap) {
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
canvas.drawBitmap(getBitmap(), 0, getIntrinsicHeight(), null);
}
};

background.setImageDrawable(drawable);
background.setScaleType(ScaleType.MATRIX);

ValueAnimator animator = ValueAnimator.ofFloat(0);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
private Matrix matrix = new Matrix();
@Override
public void onAnimationUpdate(ValueAnimator animator) {
matrix.reset();
int height = background.getDrawable().getIntrinsicHeight();
float translate = -height * animator.getAnimatedFraction();
matrix.postTranslate(0, translate);
float width = background.getDrawable().getIntrinsicWidth();
float scale = background.getWidth() / width;
matrix.postScale(scale, scale);
background.setImageMatrix(matrix);
}
});

animator.setInterpolator(new LinearInterpolator());
animator.setRepeatCount(ValueAnimator.INFINITE);
animator.setRepeatMode(ValueAnimator.RESTART);
animator.setDuration(10000);
animator.start();

注意:drawable.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT) 不适用于 imageView.setScaleType(ScaleType.MATRIX)

所以我不知道这是否是一个好的做法,但这是我目前唯一找到的做法。如果您有任何改进技术的想法,请分享。

关于android - 带重复的背景动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27671653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com