のねのBlog

パソコンの問題や、ソフトウェアの開発で起きた問題など書いていきます。よろしくお願いします^^。

Androidで同じBitmapが描画されてしまう。

同じ図形が書かれてしまう。
Android3.2(API13)以下では、正常に異なるbitmapuが表示される。
Android4.0(API14)以上では、同じbitmapが表示されるようになった。
Android4.0以上では、表示のさせ方を変更しないといけない。

小さなBitmapを16x16個書いていたが、
大きなBitmap(縦横16倍)へ、一つづつコピーしていく方法に変更した。

for (x = 0; x < 16; x++) {
	if ((bitmap.getWidth() != width) 
	|| (bitmap.getHeight() != height))
	{
		bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
	}
	getShape(colorArray);
	bitmap.setPixels(colorArray, 0, width, 0, 0, width, height);
	canvas.drawBitmap(bitmap, sx, sy, null);
}
GLES20RecordingCanvas.java
   @Override
    public void drawBitmap(Bitmap bitmap, float left, float top, Paint paint) {
        super.drawBitmap(bitmap, left, top, paint);
        mDisplayList.mBitmaps.add(bitmap);<=リストに追加されるだけ?
                     <=実際には、描かれるのは別のタイミング
                     <=描かれるまでに、bitmapを書き換えると、
                     <=書き換わってしまう。
        // Shaders in the Paint are ignored when drawing a Bitmap
    }
GLES20RecordingCanvas.java:687
    @Override
    public void drawBitmap(Bitmap bitmap, float left, float top, Paint paint) {
        // Shaders are ignored when drawing bitmaps
        int modifiers = paint != null ? setupModifiers(bitmap, paint) : MODIFIER_NONE;
        final int nativePaint = paint == null ? 0 : paint.mNativePaint;
        nDrawBitmap(mRenderer, bitmap.mNativeBitmap, bitmap.mBuffer, left, top, nativePaint);
        if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
    }
ArrayList.java
    /**
     * Adds the specified object at the end of this {@code ArrayList}.
     *
     * @param object
     *            the object to add.
     * @return always true
     */
    @Override public boolean add(E object) {
        Object[] a = array;
        int s = size;
        if (s == a.length) {
            Object[] newArray = new Object[s +
                    (s < (MIN_CAPACITY_INCREMENT / 2) ?
                     MIN_CAPACITY_INCREMENT : s >> 1)];
            System.arraycopy(a, 0, newArray, 0, s);
            array = a = newArray;
        }
        a[s] = object;
        size = s + 1;
        modCount++;
        return true;
    }