将 9patch 和纹理应用于按钮
Apply 9patch and texture to button
我正在做一个项目,所有按钮都有类似纸的背景。按钮也需要圆角和特定的边框。为了制作角和边界,我使用了九个补丁。问题来了!使用纹理作为背景排除了九个补丁,顺便说一句,九个补丁不能以正确的方式拉伸纹理。
有什么方法可以将九个补丁与纹理结合起来吗?我尝试使用 layer-list
但失败了。
更新。
这是我的九个补丁(缩放)
这是纹理
经过一些研究,我定制了 class 扩展了 Button
。这个class可以给9patch按钮贴上相应的mask贴图
public class TextureButton extends Button {
private final static String TAG = TextureButton.class.getSimpleName();
private BitmapDrawable texture;
private NinePatchDrawable ninePatchDrawable;
private Paint paint;
public TextureButton(Context context) {
super(context);
init();
}
public TextureButton(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public TextureButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pattern300);
texture = new BitmapDrawable(getResources(), bitmap);
texture.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
Bitmap bitmapMask = BitmapFactory.decodeResource(getResources(), R.drawable.btn_mask);
ninePatchDrawable = new NinePatchDrawable(getResources(), bitmapMask, bitmapMask.getNinePatchChunk(), new Rect(0, 0, 0, 0), null);
paint = new Paint();
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
paint.setAntiAlias(true);
}
@Override
protected void onDraw(@NonNull Canvas canvas) {
super.onDraw(canvas);
canvas.saveLayer(0, 0, getWidth(), getHeight(), paint, Canvas.ALL_SAVE_FLAG);
texture.setBounds(0, 0, getWidth(), getHeight());
texture.setAlpha(255);
texture.draw(canvas);
ninePatchDrawable.setBounds(0, 0, getWidth(), getHeight());
ninePatchDrawable.draw(canvas);
canvas.restore();
}
}
作为遮罩,我使用带有白色和透明像素的 9patch。
我正在做一个项目,所有按钮都有类似纸的背景。按钮也需要圆角和特定的边框。为了制作角和边界,我使用了九个补丁。问题来了!使用纹理作为背景排除了九个补丁,顺便说一句,九个补丁不能以正确的方式拉伸纹理。
有什么方法可以将九个补丁与纹理结合起来吗?我尝试使用 layer-list
但失败了。
更新。
这是我的九个补丁(缩放)
这是纹理
经过一些研究,我定制了 class 扩展了 Button
。这个class可以给9patch按钮贴上相应的mask贴图
public class TextureButton extends Button {
private final static String TAG = TextureButton.class.getSimpleName();
private BitmapDrawable texture;
private NinePatchDrawable ninePatchDrawable;
private Paint paint;
public TextureButton(Context context) {
super(context);
init();
}
public TextureButton(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public TextureButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pattern300);
texture = new BitmapDrawable(getResources(), bitmap);
texture.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
Bitmap bitmapMask = BitmapFactory.decodeResource(getResources(), R.drawable.btn_mask);
ninePatchDrawable = new NinePatchDrawable(getResources(), bitmapMask, bitmapMask.getNinePatchChunk(), new Rect(0, 0, 0, 0), null);
paint = new Paint();
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY));
paint.setAntiAlias(true);
}
@Override
protected void onDraw(@NonNull Canvas canvas) {
super.onDraw(canvas);
canvas.saveLayer(0, 0, getWidth(), getHeight(), paint, Canvas.ALL_SAVE_FLAG);
texture.setBounds(0, 0, getWidth(), getHeight());
texture.setAlpha(255);
texture.draw(canvas);
ninePatchDrawable.setBounds(0, 0, getWidth(), getHeight());
ninePatchDrawable.draw(canvas);
canvas.restore();
}
}
作为遮罩,我使用带有白色和透明像素的 9patch。