Android Canvas.drawVertices中的Bug?(带复制代码和logcat)

Android Canvas.drawVertices中的Bug?(带复制代码和logcat),android,android-canvas,Android,Android Canvas,只需将此代码粘贴到一个简单的Android项目框架中 public final class DrawableView extends View { private float[] mVertices = {0, 0, 255, 0, 255, 255, 0, 255}; private float[] mTexCoords = {0, 0, 255, 0, 255, 255, 0, 255}; private short[] mIndices = {0, 2, 3, 0,

只需将此代码粘贴到一个简单的Android项目框架中

public final class DrawableView extends View
{
    private float[] mVertices = {0, 0, 255, 0, 255, 255, 0, 255};
    private float[] mTexCoords = {0, 0, 255, 0, 255, 255, 0, 255};
    private short[] mIndices = {0, 2, 3, 0, 1, 2};
    private int[] mColors = {Color.RED, Color.GREEN, Color.BLUE, Color.MAGENTA};

    Context mContext;
    BitmapShader mShader;

    public DrawableView(Context context)
    {
        super(context);
        mContext = context;
        mShader = new BitmapShader(BitmapFactory.decodeResource(getResources(), R.drawable.icon), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        Paint paint = new Paint();
        paint.setColor(Color.RED);
        paint.setShader(mShader);

        canvas.drawVertices(Canvas.VertexMode.TRIANGLES, 8, mVertices, 0, mTexCoords, 0, mColors, 0, mIndices, 0, 6, paint);

        invalidate();
    }
}
然后在主活动的onCreate中将其设置为主视图

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(new DrawableView(this));
}
这将使应用程序退出,不会出现错误,甚至不会出现“强制关闭”对话框。Logcat没有给我任何有用的东西(http://pastebin.com/c67NJnBz)也不是

不过,以下两个drawVertices调用都会产生所需的效果

canvas.drawVertices(Canvas.VertexMode.TRIANGLES, 8, mVertices, 0, mTexCoords, 0, null, 0, mIndices, 0, 6, paint); // Works!

我做错什么了吗?请帮助我确定这是否是Android API错误。

尽管for drawVertices没有明确说明这一点,但Vert、Tex和Color数组的数组大小都必须与vertexCount匹配。下面的第三个答案似乎也证实了这一点。 请记住,只有第一个(vertexCount/2)颜色用于绘制三角形,其他值将被忽略。

即使for DrawVertex没有明确说明这一点,顶点、纹理和颜色数组的数组大小都必须与vertexCount匹配。下面的第三个答案似乎也证实了这一点。
请记住,只有第一个(vertexCount/2)颜色用于绘制三角形,其他值将被忽略。

是的,我理解。我有4种颜色和4个顶点(每个顶点的x和y坐标)。我看到您链接到的答案指定了6种颜色,每个坐标对应一种颜色!请您解释一下,对于0,0处有两种颜色的顶点,将使用什么颜色?颜色数组指定了红色和绿色?我知道。。。这没有多大意义,而且我自己也没有试过。不过,我尝试了使用您的代码,并将颜色数组“加倍”(即“color.RED,color.RED,color.GREEN,color.GREEN…)它会导致图标被画成红色,InputDispatcher错误消失,应用程序不会崩溃,因此这似乎是朝着正确方向迈出的一步。谢谢,如果我提供的颜色与顶点数组中的条目一样多,它就会起作用,但我仍然不明白为什么。难道不应该只有相同数量的颜色是垂直的吗es,而不是顶点坐标?违背了我所见过的任何图形API的逻辑。同意……它失败的方式让我觉得很糟糕。是的,我理解。我有4种颜色和4个顶点(每个都有x和y坐标)。我看到您链接的答案指定了6种颜色,每个坐标一种!请您解释一下,0处的顶点将使用哪种颜色,该顶点有两种颜色。颜色数组指定了红色和绿色。我知道……这没有多大意义,我自己也没有尝试过。不过,我尝试过使用您的代码d“加倍”颜色数组(即“color.RED,color.RED,color.GREEN,color.GREEN…),它会导致图标以红色绘制,InputDispatcher错误消失,并且应用程序不会崩溃,因此这似乎是朝着正确方向迈出的一步。谢谢,如果我提供了很多颜色,它就会工作,因为顶点数组中有条目,但我仍然不明白为什么。难道不应该只有尽可能多的颜色是顶点,而不是顶点坐标吗?违背了我见过的任何图形API的逻辑。同意。。。而它失败的方式无疑让我觉得很糟糕。
paint.setColor(Color.RED);
// paint.setShader(mShader);

canvas.drawVertices(Canvas.VertexMode.TRIANGLES, 8, mVertices, 0, mTexCoords, 0, mColors, 0, mIndices, 0, 6, paint); // Renders wireframe