web-dev-qa-db-ja.com

タイルドローアブルが時々伸びる

アイテムの背景がタイル状になっているListViewがあります。これを実現するために、私は次の描画可能なxmlを使用します。

<bitmap
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:src="@drawable/tile"
    Android:tileMode="repeat" />

通常、これは機能します。ただし、srcドローアブルが並べて表示されず、リスト項目全体を埋めるように引き伸ばされる場合があります。 (私はこのようないくつかの異なるタイルを持っており、それらを1つのListViewで混合して使用します。タイリングの代わりにストレッチがある場合、それは価値があるため、一度にすべてに含まれることはありません。)

私も追加しようとしましたAndroid:dither="true"をそのxmlに追加しました。これがないとバグがある可能性があることをどこかで読んだのでそれは何も変わりませんでした。

誰か同じ問題がありましたか?どのように修正しましたか?

54
benvd

私もこの問題に噛まれました。診断が非常に難しく、同様のレポートと使用可能なソリューションを見つけるのがさらに困難です。

freenode#Android-dev ircチャネルの「Tapas」には、次のユーティリティメソッドが付属しています。

public static void fixBackgroundRepeat(View view) {
    Drawable bg = view.getBackground();
    if (bg != null) {
        if (bg instanceof BitmapDrawable) {
            BitmapDrawable bmp = (BitmapDrawable) bg;
            bmp.mutate(); // make sure that we aren't sharing state anymore
            bmp.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
        }
    }
}

タイル化された背景が設定されているすべてのビューに適用します(例:findViewByIdそれら)。

また、AndroidManifest.xmlで「anyDensity = true」を設定した後、このバグが発生し始めたという印象があります。

39

CLAMP TileModeを除いて、まったく同じ問題が発生しました。下部を伸ばしてXMLで定義されたBitmapDrawableとして設定したいビットマップがあり、[グラフィカルプレビュー]ウィンドウでは、ViewImageのサイズに関係なく、上部にビットマップを描画します。次に、最後のピクセルを繰り返して最後まで塗りつぶします。

エミュレーターと自分の携帯電話のさまざまなSDKビルドでアプリを起動すると、完全に役に立たないストレートな「塗りつぶし」タイプの歪みが発生しました。

解決策は、コード内でImageViewのサイズを変更するたびにTileModeを再適用することであることが判明しました。

((BitmapDrawable)ascender.getDrawable()).setTileModeY(TileMode.CLAMP);

今ではすべて順調です。そうです、これは私にはバグのように見えます。

9
Zulaxia

このトピックについては、さまざまな(そして多数の)提案された解決策とともに、オンラインで多くの騒ぎがあります。

  • それでも困っている場合は、すべてのタイル化されたビットマップリソースを正方形、基数2の次元に保つをお勧めします。

つまり、xhdpiタイルアセットの場合は16px x16pxです。

Androidプラットフォームが「オーバータイル」して、ビットマップが完全にテッセレーションされなかった場合にスペースを埋めてから、無駄を削減することを望んでいました。ただし、mdpi全体で10px * 10pxのタイルビットマップを試してみました。 hdpiとxhdpi(およびv2.3からv4.0)は、「一貫性のない」このストレッチを示しました。

基数2の寸法では、さまざまな解像度を進めたり、ビューが作成されるたびに各デバイスがタイルをペイントしようとしたりするときに、全体を均等に分割できます。

Android開発では、さまざまなハードウェアと競合し、ベンダーはプラットフォームに指を浸します。この種の些細な黒魔術がうまく機能することもあります。

これで少なくとも私にとっては問題が解決したようです。試してみる価値。

6
mjw

ここにリンクが表示されなかったので、これは バグであることが確認されました Androidでは。 ICSで修正されました。詳細については、 XMLドローアブルビットマップタイルモードのバグ? を参照してください。

6
Steve Pomeroy

これはバグのように聞こえますが、自分では見たことがありません。問題を再現する簡単なAPKがある場合は、それを私(romainguy/at/Android.com)に送信するか、バグを報告してください ここ

2
Romain Guy

このブログ エントリで問題について説明しています

this solution と組み合わせると、Ivo van der Wijkによってリストされたタパスから、それは私のために動作します。

重要なのは、XMLからタイル設定をremoveし、実行時にタイル設定に設定することでした。両方がタイルに設定されている場合は機能しません。

編集:実際、私は嘘をついた。これを使用しても、タイリングに失敗することがあります。

信頼できる回避策があると非常にいいでしょう。

編集2:それを他の何か(例えばCLAMPED)に設定してから、これまでのところ元に戻すことは機能しているようです。

1
RabidMutant

Lollipopを実行している古いデバイスでもこの問題が発生し、向きが変わると発生します。プログラムでタイルモードを設定することはできませんでしたが、この答えはうまくいきました: https://stackoverflow.com/a/13480444/658727

0
batterj2

私も同じ問題を抱えていました。私が見逃していたのは、xmlビットマップが正しく機能するためにimageviewのfitXYにscaletypeを追加する必要があるということでした。

tile_bitmap.xml

<bitmap
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:src="@drawable/tile"
    Android:tileMode="repeat" />

layout.xml

<ImageView
    Android:layout_width="match_parent"
    Android:src="@drawable/tile_bitmap"
    Android:layout_height="match_parent"
    Android:scaleType="fitXY"/>
0
Nishant Chauhan

画像をdrawable-xhdpiからdrawableフォルダーに移動しましたが、すべて問題ありませんでした。

0
Waqar Khan