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

时间:2012-03-18 18:46:04

标签: android bitmap drawable shader tiling

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

enter image description here

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

  

机器人:TILEMODE

     

关键字。定义切片模式。当平铺模式是   启用后,位图重复出现。在平铺模式下,重力被忽略   已启用。

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

3 个答案:

答案 0 :(得分: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();
    }
}

可以将其设置为如下视图:

view.setBackgroundDrawable(new MyBitmapDrawable(getResources().getDrawable(R.drawable.smiley).getBitmap()));

答案 1 :(得分:1)

只是一个想法,而且它很迂回,但是你可以垂直翻转图像,然后对你的背景应用一个变换来垂直翻转 那个 吗? / p>

答案 2 :(得分:1)

使用自定义视图可能涉及自己处理全部绘图,而不仅仅是背景图片。

相反,我建议以编程方式设置视图的背景,如下所示:

// This drawable refers to an image directly and NOT an XML
BitmapDrawable smiley = (BitmapDrawable) getResources().getDrawable(R.drawable.smiley);

// Create a new bitmap with the size of the view
Bitmap bgBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bgBitmap);

// Translate down by the remainder
Matrix matrix = new Matrix();
matrix.setTranslate(0, view.getHeight() % smiley.getIntrinsicHeight());
canvas.setMatrix(matrix);

// Tile the smileys
Paint paint = new Paint();
paint.setShader(new BitmapShader(smiley.getBitmap(), TileMode.REPEAT, TileMode.REPEAT));
canvas.drawPaint(paint);

view.setBackgroundDrawable(new BitmapDrawable(bgBitmap));

要考虑的要点:

  • 我不确定view.getWidth()& view.getHeight()是正确的 获取尺寸的方法。
  • 如果笑脸尺寸大于视图怎么办?