2011-06-22 3 views
1

このコードを単純なスケルトンAndroidプロジェクトに貼り付けてください。Canvas.drawVerticesのバグ? (repro codeとlogcatを使用)

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! 

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のバグかどうか判断してください。

答えて

1

drawVerticesのdocumentationで明示的に指定していないにもかかわらず、verts、texs、およびcolors配列の配列サイズはすべてvertexCountと一致する必要があります。 this questionの3番目の回答は、これを確認しているようです。 三角形の描画には最初の(vertexCount/2)色のみが使用され、他の値は無視されます。

+0

はい、わかりました。私は4色と4つの頂点(それぞれxとyの座標)を持っています。あなたがリンクしてきた答えは、それぞれの座標に合わせて6色を指定していることがわかります!色の配列にColor.REDとColor.GREENの2つの色を指定した0、0の頂点に、どの色を使うのかを教えてください。 – Ani

+0

私は知っている...それはあまり意味がありません、そして、私は実際にそれを自分で試していなかった。私はあなたのコードを取ってみましたが、カラー配列( "Color.RED、Color.RED、Color.GREEN、Color.GREEN ...)を倍増させてみました。入力アプリケーションのエラーがなくなり、アプリケーションがクラッシュしないので、正しい方向に進んでいるようです。 – Mark

+0

ありがとう、頂点配列にエントリがありますが、なぜか分かりません。頂点の座標ではなく、頂点だけでなく、グラフィックスAPIのロジックに逆らって移動してください。 – Ani

関連する問題