6

我正在使用如下可绘制的渐变背景:

<?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)时,结果更差:

在此处输入图像描述

为什么?以及如何解决这个问题?尽管我android:dither="true"在可绘制对象的 XML 中使用并将其设置在Activity's中onCreate()

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

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

4

4 回答 4

8

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

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

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

于 2012-12-03T14:58:44.237 回答
5

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

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

要为现有的 AVD 打开此功能:

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

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

于 2013-06-18T10:11:59.063 回答
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 需要 SDCARD,并且在清单中您还需要:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
于 2012-12-02T07:01:24.327 回答
0

我认为截图位深度问题是两方的错;Android DDMS/监视器以及被捕获的设备/模拟器。

如果设备/仿真器的显示位深度较低,那么您对这种特定情况(GIGO)无能为力。虽然,我已经清楚地看到,在某些设备/模拟器上,DDMS 拍摄的屏幕捕获质量低于实际显示。

在我的搜寻中,我刚刚找到了一个我认为可以解决这个问题的应用程序,称为“Android 屏幕监视器”,您可以在此处获取:

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

于 2013-01-27T18:45:04.177 回答