我想设置一个带有平铺位图的视图背景,但是平铺需要锚定到左下角,而不是左上角(默认)。例如,如果瓷砖是下面的笑脸,我希望它像瓷砖一样平铺:
使用xml drawables我可以实现平铺(使用tileMode="repeat"
)或底部定位(使用gravity="bottom"
),但是两者结合是不可能的,即使文档也这样说:
机器人:TILEMODE
关键字。定义切片模式。当平铺模式是 启用后,位图重复出现。在平铺模式下,重力被忽略 已启用。
虽然它没有内部支持,有没有办法实现这一点,也许使用自定义视图?
答案 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));
要考虑的要点: