Android force可绘制相同高度和宽度的图形

Android force可绘制相同高度和宽度的图形,android,android-drawable,Android,Android Drawable,我使用日历库,我需要提供自定义选择器绘制。不幸的是,我应该使每个日期单元格的高度小于宽度,这就是为什么我在xml中将app:mcv_tileHeight设置为40dp 在我提供选择器drawable后,它会被拉伸到整个单元格的边界。 但我希望它像正方形一样缩放,而不是像矩形一样缩放,也就是说,若视图的宽度(在我的例子中是日期)大于高度,我希望在左右两侧都有空的空间 下面是我目前拥有的以及我想要实现的实际屏幕截图 我已经尝试通过在层列表的属性中将宽度和高度设置为相同的值,在xml中强制使用方形比

我使用日历库,我需要提供自定义选择器绘制。不幸的是,我应该使每个日期单元格的高度小于宽度,这就是为什么我在xml中将
app:mcv_tileHeight
设置为
40dp

在我提供选择器drawable后,它会被拉伸到整个单元格的边界。 但我希望它像正方形一样缩放,而不是像矩形一样缩放,也就是说,若视图的宽度(在我的例子中是日期)大于高度,我希望在左右两侧都有空的空间

下面是我目前拥有的以及我想要实现的实际屏幕截图

我已经尝试通过在
层列表的
属性中将宽度和高度设置为相同的值,在xml中强制使用方形比例,但这对我没有帮助

我还尝试了第二个答案,但它产生了崩溃

我试图像这样扩展Drawable类,但我用这种方法得到了NPE

public class SquareDrawable extends Drawable {

private Drawable drawable;

public SquareDrawable(Drawable drawable) {
    this.drawable = drawable;
}

@Override
public void setBounds(int left, int top, int right, int bottom) {
    super.setBounds(left, top, right, bottom);
    calculateBounds(right - left, bottom - top);
}

private void calculateBounds(int width, int height) {
    final int radius = Math.min(height, width);
    final int offset = Math.abs(height - width) / 2;

    if (width >= height) {
        drawable.setBounds(offset, 0, radius + offset, height);
    } else {
        drawable.setBounds(0, offset, width, radius + offset);
    }
}

@Override
public void draw(@NonNull Canvas canvas) {
    drawable.draw(canvas);
}

@Override
public void setAlpha(int alpha) {
    drawable.setAlpha(alpha);
}

@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
    drawable.setColorFilter(colorFilter);
}

@Override
public int getOpacity() {
    return drawable.getOpacity();
}
}

如果可绘制为位图可绘制,则应能够设置其重力以强制图像居中

BitmapDrawable bitmap = (BitmapDrawable) getResources().getDrawable(R.color.chat_cardview_color);
bitmap.setGravity(Gravity.center)

这里有一个类似的问题。

不,它不是位图。现在我用椭圆形状和填充的图层列表,我试着用位图,但它不起作用。老实说,这似乎是库问题,圆的动态绘制很好,谢谢你的帮助+1