Bug in Canvas.drawVertices? (with repro code and logcat)

China☆狼群 提交于 2019-12-02 06:48:33

问题


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.



来源:https://stackoverflow.com/questions/6434132/bug-in-canvas-drawvertices-with-repro-code-and-logcat

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!