1

[追加のコードで更新]

一部のデバイス(私が知っている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の結果は正しくなく、以下に示すように幅の広い白い境界線が表示されます。これはビットマップレンダリングの一部ですが、元のビットマップまたはラスターの一部ではありません。

Nexus7でのレンダリングが正しくありません

サムスンギャラクシー電話での正しい(望ましい)結果:

サムスンギャラクシー電話での正しいレンダリング

上記の両方の例に示されている画像とコードはまったく同じです。null paint、null srcRectを使用し、さらに代替メソッドdrawBitmap(bitmap、0、0、null)を使用してバリエーションを試しましたが、同じ結果が得られました。フレームワークコードを見ると、もちろん、drawBitmap()は、ソースコードを表示できないネイティブメソッドを直接呼び出します。

少数の画像だけがこの問題を示しているようであり、ほとんどの正方形の画像がこの問題を示しているように見えます。しかし、この問題を示す他の1つの非正方形画像は次のとおりです。

Nexus7の正方形以外の画像が正しくありません

これらの画像のほとんどは、目的のカスタムビューを指定してわずかに回転します。回転が問題の一部である可能性がありますが、キャンバスが回転されていないため、親のキャンバスビットマップにコピーされたときに発生する可能性があります。アンドロイド。

何か案は?これはナッツです!

4

1 に答える 1

0

これらのデバイスで拡大しなくても、画像が十分に大きく表示されますか?

于 2013-03-16T07:45:39.823 に答える