13

人気の Google 開発者であるRomain Guyによって作成された素敵な投稿があり、ビューで角の丸いドローアブル (彼のコードでは "StreamDrawable" と呼ばれます) を効率的に使用する方法を示しています。

このサンプル自体は、Galaxy S3 のポートレート モードで非常にうまく機能しますが、いくつか問題があります。

  1. 画面が小さい場合 (qvga 画面など)、表示される画像がトリミングされます。

  2. 表示したいサイズよりも小さすぎる入力ビットマップがある場合、出力イメージのエッジが不鮮明になります。Galaxy S3 でも、横向きでサンプル コードを実行すると、見栄えが悪くなります。

    ここに画像の説明を入力

  3. まだわかりませんが(サンプルコードを使用するために画像をスケーリングする回避策を使用しているため)、このソリューションでもlistViewで使用すると少し遅いと思います。多分これのためのrenderscriptソリューションがありますか?

setImageDrawable を使用するか setBackgroundDrawable を使用するかは問題ではありません。それはドローアブル自体にあるものでなければなりません。

変数と bitmapShader を試してみましたが、何も機能しませんでした。悲しいことに、 TileModeには画像を引き伸ばすだけの値はなく、何らかの方法でタイルを張るだけです。

回避策として、スケーリングされた新しいビットマップを作成できますが、これは単なる回避策です。確かに、必要以上に多くのメモリを使用しないより良い方法があります。

これらの問題を修正し、この優れたコードを使用するにはどうすればよいですか?

4

3 に答える 3

4

このコードにはサイズの問題がありましたが、解決しました。

多分これもあなたを助けるでしょう:

1) コンストラクターでビットマップをローカル変数に格納します (例: private Bitmap bmp;)

2) さらに 2 つのメソッドをオーバーライドします。

@Override
    public int getIntrinsicWidth() {
    return bmp.getWidth();
}

@Override
    public int getIntrinsicHeight() {
    return bmp.getHeight();
}

敬具、ダローラ

于 2013-01-07T16:23:52.443 に答える
1

根本的な問題は、BitmapShaderTileModeにスケーリング オプションがないことです。に設定されていることがソースにShader.TileMode.CLAMP記載されており、ドキュメントでは次のように説明されています。

シェーダが元の境界の外に描画する場合、エッジの色を複製します

これを回避するには、次の 3 つの解決策があります。

  1. ドローアブルが使用されるビューのサイズをビットマップのサイズに制限します。
  2. 描画領域を制限します。たとえば、次のように変更します。

    int width = bounds.width() - mMargin;
    int height = bounds.height() - mMargin;
    mRect.set(mMargin, mMargin, width, height);
    

    に:

    int width = Math.min(mBitmap.getWidth(), bounds.width()) - mMargin;
    int height = Math.min(mBitmap.getHeight(), bounds.height()) - mMargin;
    mRect.set(mMargin, mMargin, width, height);
    
  3. ビットマップをドローアブルのサイズにスケーリングします。シェーダーの作成を onBoundsChange() に移動し、ここから新しいビットマップを作成することにしました。

    bitmap = Bitmap.createScaledBitmap(mBitmap, width, height, true);
    mBitmapShader = new BitmapShader(bitmap,
            Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
    

    これは処理が遅くなる可能性があり、メイン スレッドで実行されることに注意してください。この最後のソリューションに進む前に、実装方法を慎重に検討することをお勧めします。

于 2013-07-19T10:19:21.693 に答える