Android渐变drawables:Eclipse中的屏幕截图质量很差

时间:2012-11-24 15:54:59

标签: android eclipse gradient android-drawable

我正在使用类似下面的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)时,结果甚至更差:

enter image description here

为什么呢?以及如何解决这个问题?虽然我在drawables的XML中使用了android:dither="true"并在Activity的{​​{1}} onCreate()中进行了设置:

    getWindow().setFormat(PixelFormat.RGBA_8888);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);

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

4 个答案:

答案 0 :(得分:6)

只是为了确保阅读此问题的每个人都能看到解决方案:

正如 davehale23 Chris Stratton 所指出的,问题不在于Eclipse或应用程序被“拍照”。问题是Android模拟器,它显然使用了减少的位深度。

因此,如果获取某个应用的屏幕截图,则应始终使用真实设备。

答案 1 :(得分:3)

正如@Marco W.上面提到的,该问题直接与Android Eclipse Emulator有关。

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

要为现有AVD启用此功能:

  • 选择要为其启用GPU仿真的AVD名称
  • 点击“修改”
  • 选中“仿真选项”部分下的“使用主机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”,你可以在这里找到:

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