【问题标题】:Bug in Canvas.drawVertices? (with repro code and logcat)Canvas.drawVertices 中的错误? (带有复制代码和 logcat)
【发布时间】:2011-09-20 00:28:01
【问题描述】:

只需将此代码粘贴到一个简单的框架 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();
    }
}

然后在主activity的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!

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

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

【问题讨论】:

    标签: android android-canvas


    【解决方案1】:

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

    【讨论】:

    • 是的,我明白了。我有 4 种颜色和 4 个顶点(每个顶点的 x 和 y 坐标)。我看到您链接到的答案指定了 6 种颜色,每个坐标一个颜色!您能否解释一下在 0、0 处为颜色数组指定了两种颜色 Color.RED 和 Color.GREEN 的顶点使用什么颜色?
    • 我知道......这没有多大意义,而且我自己也没有真正尝试过。不过,我尝试使用您的代码并将颜色数组“加倍”(即“Color.RED,Color.RED,Color.GREEN,Color.GREEN ...),它导致图标被绘制为红色和InputDispatcher 错误消失了,应用程序没有崩溃,所以这似乎是朝着正确方向迈出的一步。
    • 谢谢,如果我提供它,它就可以工作,因为顶点数组中有许多颜色,但我仍然不明白为什么。不应该只有尽可能多的颜色是顶点,而不是顶点坐标?违背了我见过的任何图形 API 的逻辑。
    • 同意...它失败的方式绝对让我觉得有问题。
    猜你喜欢
    • 2018-08-06
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 2011-01-03
    • 2020-01-09
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多