9

Android 5.0.1 を実行している LG G Watch でグラデーションを滑らかに表示するのに苦労しています。

重複としてマークする前に、いくつかの投稿に対してすべての回答を試しました(pngファイルを表示するときにandroidが画像品質を失うのはなぜですか?グラデーションドローアブルをディザリングすることは可能ですか?android:dither="true"はディザリングしません、何が問題なの? ,カラー バンディング Android ソリューション, RGBA_8888 をどこでも使用しているにもかかわらず、カラー バンディングとグラデーションのアーティファクト, Android 4.0+でのみカラー バンディング , Androidのひどい背景画像品質)、しかしどれも適用されないようです.


グラデーションを作成するための私の手順は次のとおりです

1) 最新の Android SDK からサンプル 'Wearable: Watch View Stub' プロジェクトをロードします。

2)rect_background.xmlドローアブルを次のように変更します。

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="@dimen/rect_corner_radius"/>
    <gradient android:startColor="@color/light_grey"
        android:endColor="@color/white"
        android:angle="90"/>
</shape>

3) エミュレーターでの表示は次のとおりです。

ここに画像の説明を入力

4) デバイスからスクリーン キャプチャを行うと、次のようになります。 ここに画像の説明を入力

5) しかし、私がそれを直接見ると、ひどいバンディングが見られます: (実物はもっとひどいものに見えます; 画像ではうまくいきません) ここに画像の説明を入力 ここに画像の説明を入力

以下は、実際にどのように見えるかをシミュレートした画像です (128 色)。 ここに画像の説明を入力

私も試しました:

  • PNG ビットマップ (24 ビット) の使用
  • 1 つの透明ピクセル (32 ビット) を持つ png ビットマップの使用
  • すべて半透明のピクセル (32 ビット) で png ビットマップを使用する
  • ビット深度を減らした png ビットマップ (256 色) の使用
  • 100 品質の jpeg を使用します。

  • レイアウトを作成する前後にアクティビティで PixelFormat を RGBA_8888 に手動で設定する

  • アクティビティでディザリングをオンにする
  • カスタム ビットマップ ローダーを使用してコードからビットマップをロードする (ピクセル形式の設定、ディザリングなど、Android での背景画像の品質の悪さを参照)
  • ImageView のあらゆる種類のスケーリングをオフにする
  • drawable、drawable-hdpi、および raw フォルダーに画像を配置する
  • APK を解凍し、イメージが圧縮されていないことを確認します。

これらはすべて同じように表示されます。


これをデバイスに正しく表示するにはどうすればよいですか?

他の誰かがこの問題を見ていますか? このサイトによると、LG G Watch には色深度または 24 ビットがあり、チャネルごとにフル 8 ビットである必要があります。デバイス上の通常の画像は正しく表示されます。目立つバンディングはありません。

4

1 に答える 1

4

次のように、LG G Watchで滑らかなガーディエントを生成できました。

ステップ1:

ピクセル形式を手動で RGB_565 に設定します

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    getWindow().setFormat(PixelFormat.RGB_565);
}

ステップ2:

Wear AndroidManifest.xml でハードウェア アクセラレーションを無効にする必要があります。次のプロパティを application タグに追加します。

android:hardwareAccelerated="false"

ステップ 3:

背景を描画する新しいメソッドを定義します。

public static Bitmap drawableToBitmap (Drawable drawable, int height, int width) {
    if (drawable instanceof BitmapDrawable) {
        return ((BitmapDrawable)drawable).getBitmap();
    }
    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);

    return bitmap;
}

ステップ 4:

レイアウトに適用します。

Bitmap bpBackground = drawableToBitmap(getResources().getDrawable(R.drawable.rect_background), 280, 280);
BitmapDrawable bdBackgorund = new BitmapDrawable(getResources(), bpBackground);
myLayout.setBackground(bdBackgorund);

残念ながら、WatchViewStub 内で動作させることはできませんでしたが、これはおそらく問題の解決に役立つと思います。

ステップ 1 と 2 は適切な結果を得るために必要であり、ステップ 3 と 4 は再び品質を向上させます。

ここでソリューション全体を見つけることができます: https://github.com/lukeisontheroad/WatchViewStubStackOverflowSolution

于 2015-01-04T23:38:41.123 に答える