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のバグかどうか判断してください。
はい、わかりました。私は4色と4つの頂点(それぞれxとyの座標)を持っています。あなたがリンクしてきた答えは、それぞれの座標に合わせて6色を指定していることがわかります!色の配列にColor.REDとColor.GREENの2つの色を指定した0、0の頂点に、どの色を使うのかを教えてください。 – Ani
私は知っている...それはあまり意味がありません、そして、私は実際にそれを自分で試していなかった。私はあなたのコードを取ってみましたが、カラー配列( "Color.RED、Color.RED、Color.GREEN、Color.GREEN ...)を倍増させてみました。入力アプリケーションのエラーがなくなり、アプリケーションがクラッシュしないので、正しい方向に進んでいるようです。 – Mark
ありがとう、頂点配列にエントリがありますが、なぜか分かりません。頂点の座標ではなく、頂点だけでなく、グラフィックスAPIのロジックに逆らって移動してください。 – Ani