android - 绘制一个平铺在 Rect android 上的位图

标签 android bitmap rect

我正在尝试沿矩形绘制位图,但我不确定如何去做。有没有办法使用 paint 属性或其他东西沿着 Rect 对象平铺位图?我看过了,但我找不到任何东西让它做我需要的事情,大多数平铺选项不会为特定实例平铺它,它们会沿着整个屏幕平铺它,所以使用该位图的所有内容都结束了有一个大位图同时沿着所有这些平铺,没有滚动或任何东西。

有什么想法吗?如果您需要更多信息,请告诉我,这是一个奇怪的问题,所以我知道我可能没有提到重要的事情。

威廉

最佳答案

有几种方法可以解决这个问题。我将在这里概述其中的两个...

一种方式:

你可以定义一个BitmapDrawable位图周围。将其 TileMode 设置为重复。通过 setBounds(rect) 给它一些边界,其中 rect 是您的 Rect 实例。

这是一个使用 View onDraw 作为上下文的简短示例:

public class MyView extends View {
    Rect rect;
    Bitmap mBitmap;
    BitmapDrawable mDrawable;

    public MyView(Context context) {
        super(context);
        rect = new Rect(0, 0, 100, 100);
        mBitmap = loadBitmap();
        mDrawable = new BitmapDrawable(context.getResources(), mBitmap);
        mDrawable.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
        mDrawable.setBounds(rect);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        mDrawable.draw(canvas);
    }

    public Bitmap loadBitmap() {
        // included only for example sake
        Paint paint = new Paint();
        paint.setColor(Color.RED);
        Bitmap bm = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bm);
        canvas.drawRect(0,0,10,10, paint);
        paint.setStyle(Style.STROKE);
        paint.setColor(Color.BLUE);
        canvas.drawRect(0, 0, 9, 9, paint);
        return bm;
    }
}

注意:

您也可以在 xml 中定义一个 BitmapDrawable 而不是在代码中进行。

此外,如果您知道通过 getResources().getDrawable(resourceId) 加载的可绘制对象确实只是位图,您可以将其转换为 BitmapDrawable 并在那里设置 TileMode。啊啦:

public class MyView extends View {
    Rect rect;
    BitmapDrawable mDrawable;

    public MyView(Context context) {
        super(context);
        rect = new Rect(0, 0, 400, 240);
        mDrawable = (BitmapDrawable) context.getResources().getDrawable(R.drawable.ic_launcher);
        mDrawable.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
        mDrawable.setBounds(rect);

        this.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.ic_launcher));
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        mDrawable.draw(canvas);
    }
}

此示例显示背景被拉伸(stretch),并且在其上方绘制了一个平铺版本。

另一种方式:

在 x 和 y 方向上循环并重复将位图绘制到 rect 中:

public class MyView extends View {
    Rect rect;
    Bitmap mBitmap;

    public MyView(Context context) {
        super(context);
        rect = new Rect(0, 0, 100, 100);
        mBitmap = loadBitmap();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        final int bmWidth = mBitmap.getWidth();
        final int bmHeight = mBitmap.getHeight();

        for (int y = 0, height = rect.height(); y < height; y += bmHeight) {
            for (int x = 0, width = rect.width(); x < width; x += bmWidth) {
                canvas.drawBitmap(mBitmap, x, y, null);
            }
        }
    }

    public Bitmap loadBitmap() {
        // included only for example sake
        Paint paint = new Paint();
        paint.setColor(Color.RED);
        Bitmap bm = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bm);
        canvas.drawRect(0,0,10,10, paint);
        paint.setStyle(Style.STROKE);
        paint.setColor(Color.BLUE);
        canvas.drawRect(0, 0, 9, 9, paint);
        return bm;
    }
}

我个人会选择第一种 (BitmapDrawable) 方法。

关于android - 绘制一个平铺在 Rect android 上的位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11472117/

相关文章:

C# 从 System.Drawing.Bitmap 中高效获取像素数据

redis - 如何从redis位图中获取二进制字符串?

javascript - 矩形图() : is the documentation wrong?

python - Pygame 矩形中心无法覆盖矩形的左侧

android - 每次应用程序重新启动时避免登录屏幕

android - Intent Service 永远不会被调用

Android Pie 和 WiFiManger.getScanResults() 返回空列表或 Android Oreo WiFiManger.startScan() 返回 false

android - 如何在Android平台上利用网络进行p2p文件共享?

python - Pygame 碰撞错误

c - 从 Allegro 加载位图后神秘崩溃