在Android中使用XML形状设置绘制矩形

在Android中使用XML形状设置绘制矩形,android,xml,shape,drawrectangle,Android,Xml,Shape,Drawrectangle,我有一个我不知道如何解决的问题。如果可以的话,请帮帮我。 在我的应用程序中,我必须创建一个自定义视图扩展视图。在这个视图中,我应该绘制很多矩形,并通过canvas.drawRect或canvas.drawRoundRect创建它们。很清楚。但是我想用渐变、角、填充等创建这些矩形的复合设计,我想用XML实现这些设置渐变、角、填充等。我怎么做?问题是,我确定XML中的形状,我只能将此可绘制图形用作背景,但当我绘制矩形时,我无法为矩形设置背景。也许有另一种方法可以解决这个问题。我是否可以将XML形状对

我有一个我不知道如何解决的问题。如果可以的话,请帮帮我。 在我的应用程序中,我必须创建一个自定义视图扩展视图。在这个视图中,我应该绘制很多矩形,并通过canvas.drawRect或canvas.drawRoundRect创建它们。很清楚。但是我想用渐变、角、填充等创建这些矩形的复合设计,我想用XML实现这些设置渐变、角、填充等。我怎么做?问题是,我确定XML中的形状,我只能将此可绘制图形用作背景,但当我绘制矩形时,我无法为矩形设置背景。也许有另一种方法可以解决这个问题。我是否可以将XML形状对象不仅设置为背景,还设置为具有x、y坐标和宽度、高度的视图对象

编辑: 我可以画矩形:

canvas.drawRect(x1, y1, x2, y2, paint);
但我在XML中有如下矩形设置:

<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

<!-- Specify a gradient for the background -->
    <gradient
    android:angle="90"
    android:startColor="#55000066"
    android:centerColor="#FFFFFF"
    android:endColor="#55000066" />

<!-- Specify a dark blue border -->
    <stroke 
    android:width="2dp"
    android:color="#000066" />

<!-- Specify the margins that all content inside the drawable must adhere to -->
    <padding
    android:left="5dp"
    android:right="5dp"
    android:top="5dp"
    android:bottom="5dp" />

<corners
    android:topLeftRadius="10dp"
    android:topRightRadius="10dp"
    android:bottomLeftRadius="10dp"
    android:bottomRightRadius="10dp" />
</shape>

我想把这些设置应用到我的矩形上。如何加载?

您可以加载并使用以下代码中定义的可绘制XML:

public class CustomView extends View {

    Drawable shape;

    public CustomView(Context context) {
        super(context);
        shape = context.getResources().getDrawable(R.drawable.shape);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        shape.setBounds(left, top, right, bottom);
        shape.draw(canvas)
    }

    // ... Additional methods omitted for brevity

}

您可以从以下代码加载和使用XML定义的可绘制文件:

public class CustomView extends View {

    Drawable shape;

    public CustomView(Context context) {
        super(context);
        shape = context.getResources().getDrawable(R.drawable.shape);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        shape.setBounds(left, top, right, bottom);
        shape.draw(canvas)
    }

    // ... Additional methods omitted for brevity

}

你的问题有点不清楚。你能试着把它编辑得更简洁一些吗?你的问题有点不清楚。你能试着对它进行编辑,使其更简洁地表达你的要求吗?它应该被转换为GradientDrawable,而不是ShapeDrawable,因为它会抛出错误java.lang.ClassCastException:android.graphics.drawable.GradientDrawable听起来似乎有道理。当我最初写我的答案时,XML没有包含在问题中。事实上,如果您没有使用特定于实现的任何内容,则根本不需要强制转换。如果我的回答有帮助,如果您通过向上投票和/或将其标记为正确来表示,那将非常棒。它应该强制转换为GradientDrawable,不允许ShapeDrawable,因为会抛出错误java.lang.ClassCastException:android.graphics.drawable.GradientDrawable听起来似乎有道理。当我最初写我的答案时,XML没有包含在问题中。事实上,如果你没有使用任何特定于实现的东西,你根本不需要使用它。如果我的答案是有帮助的,那么如果你通过向上投票和/或将其标记为正确来表明这一点,那就太棒了。