Bug in Canvas.drawVertices? (with repro code and l

2019-03-02 07:08发布

问题:

Simply paste this code into a simple skeleton Android project.

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();
    }
}

And then set this as the main view in the onCreate of the main activity.

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(new DrawableView(this));
}

This should make the application exit, with no error or even a "force close" dialog. Logcat gives me nothing useful (http://pastebin.com/c67NJnBz), either!

Both the following drawVertices calls produce the desired effect, though.

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

and

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

Am I doing something wrong? Please help me determine if this an Android API bug.

回答1:

Even though the documentation for drawVertices does not spell this out explicitly, the array size of the verts, texs, and colors arrays must all match the vertexCount. The third answer down in this question would also seem to confirm this. Keep in mind, only the first (vertexCount / 2) colors are used to draw the triangles, the other values are ignored.