我知道色带是一个问题的老栗子,之前已经讨论了很多次提供了各种解决方案(基本上归结为使用32位,或使用抖动).事实上不久前我问过并随后回答了我自己的问题.当时,我还以为我把在回答这个问题的解决方案(这是应用setFormat(PixelFormat.RGBA_8888)的Window,也给Holder在的情况下SurfaceView),在我的很好的应用已经解决了这个问题.至少解决方案使得渐变在我当时开发的设备上看起来非常好(很可能是Android 2.2).
我现在正在使用HTC One X(Android 4.0)和华硕Nexus 7(Android 4.1)进行开发.我试图做的是在a的整个区域应用灰色渐变SurfaceView.即使我认为确保包含Window和Holder配置为32位颜色,我得到可怕的绑定工件.事实上,在Nexus 7上,我甚至看到了文物的移动.这不仅发生在SurfaceView当然连续绘制的情况下,而且还发生在View我正常添加的法线中,以便为测试目的绘制完全相同的梯度,这将绘制一次.这些工件的存在方式当然看起来非常糟糕,实际上就像观看信号较差的模拟电视一样.无论是View和SurfaceView展览完全相同的器物,它们一起四处走动.
我的目的是在整个过程中使用32位,而不是使用抖动.我的印象Window是默认情况下在Android 4.0之前默认为32位.通过应用RGBA_8888在SurfaceView我本来期望一切都已经32位全境,从而避免任何文物.
我注意到在SO上还有其他一些问题,人们观察到RGBA_88884.0/4.1平台上似乎不再有效.
这是我的Nexus 7的截图,View顶部和SurfaceView下面都有法线,两者都使用相同的渐变Canvas.当然,它不会像在显示屏上那样显示工件,因此显示此屏幕抓取可能毫无意义.我想强调的是,在Nexus的屏幕上,条带确实看起来很糟糕.编辑:其实,真正的截图没有显示的文物在所有.我在Nexus 7上看到的文物并不是统一的条带; 它看起来很随意.

Activity用于创建以上内容的测试:
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Shader;
import android.os.Bundle; …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的活动中放置背景,但图像质量不是预期的.
图像在蓝色条纹上方有一个简单的渐变,目前看起来像这样:

我的活动布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="@drawable/background_register"
android:drawingCacheQuality="high" >
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
后台描述符(drawable/background_register):
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:antialias="true"
android:dither="true"
android:filter="true"
android:tileMode="repeat"
android:gravity="center"
android:src="@drawable/background_blue_565" />
Run Code Online (Sandbox Code Playgroud)
目前我有一个描述BitmapDrawable的XML文件,它是actitivy的LinearLayout背景.但我已经尝试了迄今为止我发现的一切.启用抖动,抗锯齿,平铺,RGBA_8888模式...您可以命名.有没有人有我可以尝试的不同解决方案或想法?我会非常感激的.
顺便说一句,我目前正在用Galaxy S II开发应用程序.
在运行Android 4.0或4.0.3的模拟器上,我看到了可怕的色带,我似乎无法摆脱它.在我测试的每个其他Android版本上,渐变看起来很流畅.
我有一个配置为RGBX_8888的SurfaceView,并且渲染画布中不存在条带.如果我通过在渲染结束时叠加噪声模式来手动抖动图像,我可以使渐变再次平滑,但显然代价是我宁愿避免的性能.
因此绑带将在稍后介绍.我只能假设,在4.0+上,我的SurfaceView在被绘制和显示之间的某个点处被量化为较低的位深度,我可以从屏幕截图中看到渐变是一次步进8个值每个通道,建议量化到555(而不是565).
我将以下内容添加到我的Activity onCreate函数中,但它没有任何区别.
getWindow().setFormat(PixelFormat.RGBA_8888);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);
Run Code Online (Sandbox Code Playgroud)
我也尝试将上面的内容放在onAttachedToWindow()上,但仍然没有变化.
(我相信RGBA_8888无论如何都是2.2及以上版本的默认窗口格式,因此明确设置该格式对4.0+没有影响也就不足为奇了.)
这就留下了一个问题,如果源是8888,目的地是8888,那么引入量化/条带的原因是什么,它为什么只出现在4.0+?
非常令人费解.我想知道是否有人可以放弃一些光线?

姜饼(2.3.3)模拟器左,ICS(4.0.3)模拟器右.注意红色框内的渐变淡化效果差异(在单独的窗口中打开以查看完整大小的图像).
主视图背景:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/app_bg"
android:orientation="vertical" >
...
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
app_bg.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient android:startColor="#000" android:centerColor="#333"
android:endColor="#000" android:angle="270" />
</shape>
Run Code Online (Sandbox Code Playgroud)
是什么导致了这个问题?如何解决这个问题,以便ICS渐变看起来像2.3.3版本一样平滑?问题是否仅在模拟器上发生?
android ×4
gradient ×2
surfaceview ×2
android-4.0-ice-cream-sandwich ×1
background ×1
bit-depth ×1
colors ×1
dithering ×1
image ×1
quantization ×1