Android:使用类似于css background-position的底部或其他对齐绘制平铺位图

Ran*_*ku' 2 shader android tiling bitmap drawable

我想设置一个带有平铺位图的视图背景,但是平铺需要锚定到左下角,而不是左上角(默认).例如,如果瓷砖是下面的笑脸,我希望它像平铺一样:

在此输入图像描述

使用xml drawables我可以实现平铺(使用tileMode="repeat")或底部定位(使用gravity="bottom"),但是无法将两者结合使用,即使文档中也这样说:

机器人:TILEMODE

关键词.定义切片模式.启用切片模式后,将重复位图.启用切片模式时,将忽略重力.

虽然它没有内部支持,有没有办法实现这一点,也许使用自定义视图?

Dhe*_*.S. 5

另一种方法是扩展BitmapDrawable和覆盖该paint()方法:

在此方法中,我们避免创建具有视图大小的新位图.

class MyBitmapDrawable extends BitmapDrawable {
    private Paint mPaint = new Paint(Paint.FILTER_BITMAP_FLAG | Paint.DITHER_FLAG);
    private boolean mRebuildShader = true;
    private Matrix mMatrix = new Matrix();

    @Override
    public void draw(Canvas canvas) {
        Bitmap bitmap = getBitmap();
        if (bitmap == null) {
            return;
        }

        if (mRebuildShader) {
            mPaint.setShader(new BitmapShader(bitmap, TileMode.REPEAT, TileMode.REPEAT));
            mRebuildShader = false;
        }

        // Translate down by the remainder
        mMatrix.setTranslate(0, getBounds().bottom % getIntrinsicHeight());
        canvas.save();
        canvas.setMatrix(mMatrix);
        canvas.drawRect(getBounds(), mPaint);
        canvas.restore();
    }
}
Run Code Online (Sandbox Code Playgroud)

它可以设置为这样的视图:

view.setBackgroundDrawable(new MyBitmapDrawable(getResources().getDrawable(R.drawable.smiley).getBitmap()));
Run Code Online (Sandbox Code Playgroud)