在你标记为重复之前,我已尝试过几个帖子的每个答案(如Why android lose image quality when displaying a png file?,Is it possible to dither a gradient drawable?,android:dither=”true” does not dither,what’s wrong?,Color Banding Android Solution,Color banding and artifacts with gradients despite using RGBA_8888 everywhere,Color banding only on Android 4.0+,Awful background image quality in Android),但似乎都没有适用.
以下是我创建渐变的步骤
1)从最新的Android SDK加载示例’Wearable:Watch View Stub’项目
2)将rect_background.xml drawable更改为:
<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并验证图像是否已解压缩.
所有这些都以同样的方式出现.
如何让它在设备上正确显示?
还有其他人看到这个问题吗?根据this site,LG G Watch具有颜色深度或24位,每通道应为8位.设备上的正常图像显示正确 – 没有明显的条带.
解决方法
步骤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,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