如何在Android Studio中实现可重复平移的Drawable布局背景?

实现Activity布局背景的重复Drawable定向滚动效果
可以实现,下面提供两种实用方案:
方案一:AnimationDrawable逐帧动画(适合简单场景)
这种方式通过预定义多帧偏移后的图案,模拟滚动效果,适合图案简单、对性能要求不高的场景。
- 准备好基础重复图案,以及多帧偏移后的图案(比如水平滚动的话,每帧图案向右偏移一点)
- 在
res/drawable目录下创建动画配置文件scroll_background.xml:
- 在
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <!-- 每帧对应偏移后的图案,duration控制滚动速度 --> <item android:drawable="@drawable/base_pattern" android:duration="40" /> <item android:drawable="@drawable/pattern_offset_1" android:duration="40" /> <item android:drawable="@drawable/pattern_offset_2" android:duration="40" /> <!-- 补充更多帧直到完成一个完整循环 --> </animation-list>
- 给布局设置背景并启动动画:
在布局XML中:
- 给布局设置背景并启动动画:
<LinearLayout android:id="@+id/root_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/scroll_background"> <!-- 页面内容 --> </LinearLayout>
在Activity代码中:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); AnimationDrawable animBg = (AnimationDrawable) findViewById(R.id.root_layout).getBackground(); animBg.start(); }
方案二:自定义Drawable+属性动画(灵活高效)
这种方式无需多帧图,通过BitmapShader实现图案重复,再用属性动画控制偏移量,滚动方向和速度可灵活调整。
- 实现自定义Drawable类:
public class ScrollRepeatDrawable extends Drawable { private final Bitmap mPatternBitmap; private final Paint mPaint; private float mOffsetX = 0f; private float mOffsetY = 0f; public ScrollRepeatDrawable(Bitmap bitmap) { mPatternBitmap = bitmap; mPaint = new Paint(); // 设置Shader实现图案重复平铺 mPaint.setShader(new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT)); } @Override public void draw(@NonNull Canvas canvas) { canvas.save(); // 根据偏移量平移画布,实现滚动效果 canvas.translate(mOffsetX, mOffsetY); canvas.drawRect(getBounds(), mPaint); canvas.restore(); } @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); } @Override public void setColorFilter(@Nullable ColorFilter colorFilter) { mPaint.setColorFilter(colorFilter); } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } // 供动画调用的偏移量设置方法 public void setOffsetX(float offsetX) { mOffsetX = offsetX; invalidateSelf(); } public void setOffsetY(float offsetY) { mOffsetY = offsetY; invalidateSelf(); } }
- 在Activity中应用并启动滚动动画:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); View rootView = findViewById(R.id.root_layout); // 加载基础重复图案 Bitmap patternBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.your_repeat_pattern); ScrollRepeatDrawable scrollBg = new ScrollRepeatDrawable(patternBitmap); rootView.setBackground(scrollBg); // 水平向右滚动动画:偏移范围0到图案宽度,循环滚动 ObjectAnimator scrollAnimator = ObjectAnimator.ofFloat(scrollBg, "offsetX", 0f, patternBitmap.getWidth()); scrollAnimator.setDuration(1500); // 滚动一次的时长,越小速度越快 scrollAnimator.setRepeatCount(ValueAnimator.INFINITE); scrollAnimator.setInterpolator(new LinearInterpolator()); // 匀速滚动 scrollAnimator.start(); // 如果需要垂直滚动,替换为以下代码: // ObjectAnimator scrollAnimator = ObjectAnimator.ofFloat(scrollBg, "offsetY", 0f, patternBitmap.getHeight()); }
内容的提问来源于stack exchange,提问作者Alma N
相关产品推荐
相关产品推荐

