[追加のコードで更新]
一部のデバイス(私が知っているNexus 7および10)では、カスタムビューのonDraw()メソッドで一部のビットマップをAndroidが正しくレンダリングすることに大きな問題がありますが、すべてのデバイスではありません。テスト用に持っているAndroid携帯で正しくレンダリングされます。結果のスニペットは次のとおりです。
/* set up mImagePaint earlier */
mImagePaint.setAntiAlias(true);
mImagePaint.setFilterBitmap(true);
mImagePaint.setDither(true);
mImagePaint.setStyle(Paint.Style.FILL_AND_STROKE);
mImagePaint.setStrokeWidth(0);
mImagePaint.setColor(Color.WHITE);
protected void onDraw(Canvas canvas) {
final float vw = getWidth();
final float vh = getHeight();
final float bw = mBitmap.getWidth();
final float bh = mBitmap.getHeight();
final float ba = bw / bh;
final float va = vw / vh;
if (va > ba) {
final float top = (bh - ba / va * bh) / 2;
mSrcRect.set(0, (int) top, (int) bw, (int) (bh - top));
} else {
final float left = (bw - va / ba * bw) / 2;
mSrcRect.set((int) left, 0, (int) (bw - left), (int) bh);
}
mContentRect.set(0, 0, vw, vh);
canvas.drawBitmap(mBitmap, mSrcRect, mContentRect, mImagePaint);
}
Nexus 7と10の結果は正しくなく、以下に示すように幅の広い白い境界線が表示されます。これはビットマップレンダリングの一部ですが、元のビットマップまたはラスターの一部ではありません。
サムスンギャラクシー電話での正しい(望ましい)結果:
上記の両方の例に示されている画像とコードはまったく同じです。null paint、null srcRectを使用し、さらに代替メソッドdrawBitmap(bitmap、0、0、null)を使用してバリエーションを試しましたが、同じ結果が得られました。フレームワークコードを見ると、もちろん、drawBitmap()は、ソースコードを表示できないネイティブメソッドを直接呼び出します。
少数の画像だけがこの問題を示しているようであり、ほとんどの正方形の画像がこの問題を示しているように見えます。しかし、この問題を示す他の1つの非正方形画像は次のとおりです。
これらの画像のほとんどは、目的のカスタムビューを指定してわずかに回転します。回転が問題の一部である可能性がありますが、キャンバスが回転されていないため、親のキャンバスビットマップにコピーされたときに発生する可能性があります。アンドロイド。
何か案は?これはナッツです!