9

我一直在努力让渐变在运行 Android 5.0.1 的 LG G Watch 上显得平滑。

在您标记为重复之前,我已经尝试了几个帖子的每个答案(例如为什么 android 在显示 png 文件时会丢失图像质量?是否可以抖动渐变可绘制对象?android:dither="true" 不会抖动,怎么了?彩色条带 Android 解决方案彩色条带和带有渐变的伪影,尽管到处都使用 RGBA_8888彩色条带仅在 Android 4.0+ 上, Android 中的背景图像质量糟糕),但似乎没有一个适用。


这是我创建渐变的步骤

1) 从最新的 Android SDK 加载示例 'Wearable: Watch View Stub' 项目

2)将rect_background.xmldrawable更改为:

<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。

  • 创建布局前后在Activity中手动设置PixelFormat为RGBA_8888

  • 在活动中打开抖动
  • 使用自定义位图加载器从代码中加载位图(设置像素格式、抖动等,请参阅Awful background image quality in Android
  • 关闭 ImageView 的任何缩放
  • 将图像放入 drawable、drawable-hdpi 和 raw 文件夹
  • 解压缩 APK 并验证图像是否已解压缩。

所有这些都以相同的方式显示。


如何让它在设备上正确显示?

还有其他人看到这个问题吗?根据这个网站,LG G Watch 有一个颜色深度或 24 位,每个通道应该是完整的 8 位。设备上的正常图像看起来是正确的——没有明显的条纹。

4

1 回答 1

4

我能够像这样在我的 LG G 手表上生成平滑的 gardient:

步骤1:

手动设置像素格式为 RGB_565

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

第2步:

您必须在 Wear AndroidManifest.xml 中停用硬件加速。将此属性添加到应用程序标记:

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 回答