我正在使用类似下面的drawables来获得带渐变的背景:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<gradient
android:startColor="#ffffff"
android:endColor="#cccccc"
android:angle="-90"
android:dither="true" />
</shape>
这会在模拟器上产生带状渐变,当我拍摄模拟器的截图(使用Eclipse)时,结果甚至更差:
为什么呢?以及如何解决这个问题?虽然我在drawables的XML中使用了android:dither="true"
并在Activity
的{{1}} onCreate()
中进行了设置:
getWindow().setFormat(PixelFormat.RGBA_8888);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);
顺便说一句,蓝色部分是原生操作栏,灰色渐变是ListView
行,背景是可绘制的。
答案 0 :(得分:6)
只是为了确保阅读此问题的每个人都能看到解决方案:
正如 davehale23 和 Chris Stratton 所指出的,问题不在于Eclipse或应用程序被“拍照”。问题是Android模拟器,它显然使用了减少的位深度。
因此,如果获取某个应用的屏幕截图,则应始终使用真实设备。
答案 1 :(得分:3)
正如@Marco W.上面提到的,该问题直接与Android Eclipse Emulator有关。
因此,在较新版本的Eclipse SDK中,提高图像质量(以及可能更好的仿真器性能)的解决方案是在Android设备管理器仿真选项中启用“使用主机GPU”。
要为现有AVD启用此功能:
或者只需在创建新AVD时启用此选项。
答案 2 :(得分:1)
继续上面的评论,尝试这样的事情,我通常会从中获得相当好的质量,虽然没有注意到渐变的样子。 DRAWING_CACHE_QUALITY_HIGH可能会有所帮助,但不确定。
void getScreenCap(View yourView) {
yourView.setDrawingCacheEnabled(true);
yourView.setDrawingCacheQuality(LinearLayout.DRAWING_CACHE_QUALITY_HIGH);
yourView.buildDrawingCache();
Bitmap bmp = null;
if (yourView != null) {
try {
bmp = Bitmap.createBitmap(yourView.getDrawingCache());
} catch (NullPointerException e) { }
}
yourView.setDrawingCacheEnabled(false);
yourView.destroyDrawingCache();
if (bmp != null) {
String file_path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/";
File dir = new File(file_path);
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(dir, "screencap.png");
FileOutputStream fOut = null;
try { fOut = new FileOutputStream(file); } catch (FileNotFoundException e1) { }
bmp.compress(Bitmap.CompressFormat.PNG, 85, fOut);
try { fOut.flush(); fOut.close(); } catch (IOException e1) { }
}
}
我不确定这是否可以编译,但它有你需要的应用程序的屏幕上限。
您的AVD需要一张SD卡,在您的清单中您还需要:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
答案 3 :(得分:0)
我认为截图bitdepth问题是2方的错误; Android DDMS /监视器以及捕获的设备/模拟器。
如果设备/仿真器的bitdepth显示较低,那么您对该特定情况(GIGO)没有任何处理。虽然,我已经清楚地看到,在某些设备/仿真器上,DDMS采用的屏幕捕获质量低于实际显示。
在我的追捕中,我刚刚找到了一个我认为可以解决这个问题的应用程序“Android Screen Monitor”,你可以在这里找到: