You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

重复Drawable滚动效果

实现Activity布局背景的重复Drawable定向滚动效果

可以实现,下面提供两种实用方案:

方案一:AnimationDrawable逐帧动画(适合简单场景)

这种方式通过预定义多帧偏移后的图案,模拟滚动效果,适合图案简单、对性能要求不高的场景。

    1. 准备好基础重复图案,以及多帧偏移后的图案(比如水平滚动的话,每帧图案向右偏移一点)
    1. 在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>
    1. 给布局设置背景并启动动画:
      在布局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实现图案重复,再用属性动画控制偏移量,滚动方向和速度可灵活调整。

    1. 实现自定义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();
    }
}
    1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:40:45