Android渐变drawable:在Eclipse中截图质量较差

6

我正在使用类似以下这样的drawable来制作有渐变效果的背景:

<?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对模拟器进行截屏时,结果更糟糕:

enter image description here

为什么?如何解决这个问题?尽管我在可绘制的XML中使用了android:dither="true"并在ActivityonCreate()中设置了它。
    getWindow().setFormat(PixelFormat.RGBA_8888);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);

顺便说一下,蓝色部分是原生操作栏,灰色渐变是带有背景可绘制的ListView行。

我假设你也尝试过不使用FLAG_DITHER。你必须使用Eclipse进行屏幕截图吗?使用其中一个可以让你捕捉到想要的屏幕部分(通过绘制矩形)的众多屏幕截图工具如何? - hBrent
到目前为止,我在模拟器中从未遇到过这个问题,即使是使用渐变可绘制对象也没有。但是到目前为止,我还没有使用过分辨率如此高的模拟器。也许这就是原因。或者可能是我没有正确设置模拟器。然而,我可以说的是,当我在Windows上捕获屏幕时,生成的截图不够大。因此,在Windows上比其实际分辨率小。 - caw
3
我不认为这是你的应用程序。我也在我的模拟器中尝试了一下。我试着截屏主屏幕(没有在任何应用程序中),背景有各种渐变色。它在那里的质量也很低。 - davehale23
2
模拟器上的图形处理非常耗时,因此更高分辨率的模拟器实例可能会使用相当有限的位深度(粗略的颜色选择),以避免使事情比它们已经很慢的更加痛苦。此外,DDMS截屏代码可能无法捕获实际使用的位深度。您可能需要寻找足够分辨率的物理设备,或以某种方式模拟截屏。 - Chris Stratton
1
这个模拟器具有足够高的分辨率,即800x480。与真实设备相同,但截图质量较差。结论:应该从真实设备中获取截图,因为模拟器通常具有有限的位深度。谢谢大家! - caw
显示剩余18条评论
4个回答

8

为了确保所有阅读此问题的人都能看到解决方法:

正如davehale23Chris Stratton所指出的那样,问题不在于Eclipse或应用程序被“拍照”,而是Android模拟器,显然使用了降低的位深度。

因此,如果要截取应用程序的截图,则应始终使用真实设备。


5

正如 @Marco W. 上面提到的,此问题直接涉及到 Android Eclipse 模拟器。

因此,在较新版本的 Eclipse SDK 中,改善图像质量(可能会提高模拟器性能)的解决方案是在 Android 设备管理器仿真选项中启用“使用主机 GPU”。

要为现有 AVD 启用 GPU 仿真,请执行以下操作:

  • 选择要为其启用 GPU 仿真的 AVD 名称
  • 单击“编辑”
  • 在仿真选项部分下勾选“使用主机 GPU”
  • 单击“确定”以保存 AVD 配置更改

或者在创建新 AVD 时简单地打开此选项。


1
一个注意事项:当使用“主机GPU”时,截图无法正常工作(它们会变成黑色)。 - Sébastien

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>

0

我相信屏幕截图位深问题是两方面的错误;Android DDMS/监视器以及被捕获的设备/模拟器。

如果一个设备/模拟器拥有低位深显示,则在这种特定情况下你无能为力(垃圾进垃圾出)。虽然,我明显看到在一些设备/模拟器上,DDMS获取的屏幕截图质量比实际显示要低。

在我的搜索中,我刚刚找到了一个我认为可以解决这个问题的应用程序,叫做“Android Screen Monitor”,你可以在这里获取:

http://code.google.com/p/android-screen-monitor/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接