如何在 Android 中获得半透明和彩色图像,就像新的 Google Play 报亭 header 一样?

How can I get a translucent and colorized image in Android like the new Google Play Newsstand header?

我正在尝试像新的 Google Play Newsstand 应用程序一样获得半透明和彩色图像,但直到现在我尝试的所有操作都无法完美运行。下面的图片更具体地说明了我的意思。

Google Play 报亭 header 看起来像这样:

但是我的代码构成了一个 header 对我来说看起来像这样:

太糟糕了!

我的代码是:

ImageUtils.getImageFiltered(this, R.drawable.disaster, R.color.transparent_teal)

在"ImageUtils"class中,方法getImageFiltered(...)是:

public static Drawable getImageFiltered(Context context, int res, int color) {
    Drawable drawable = createContrast(context, res, 50);
    color = context.getResources().getColor(color);
    ColorFilter filter = new PorterDuffColorFilter(color, PorterDuff.Mode.DARKEN);
    drawable.setColorFilter(filter);
    return drawable;
}

方法createContrast(context, res, 50);只是把图片变成黑白的。

那么,有谁知道如何像 Google 的应用那样获取图像吗?

非常感谢,抱歉我的英语不好,我还在学习中。

我认为问题出在 createContrast() 函数中,它使较浅的灰色阴影过度变亮。您可以尝试使用应用了 setSaturation(0) 的 ColorMatrix 将其修复为 return 不应用任何对比度调整的去饱和灰度图像。然后应用 PorterDuff。

或者,您可以使用 ColorMatrixColorFilter 创建效果,通过连接一个 ColorMatrix 转换为灰度和另一个按颜色调制创建,如下所示:

public static Drawable getImageFiltered(Context context, int res, int color) {
    // load image:
    Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), res);
    BitmapDrawable drawable = new BitmapDrawable(context.getResources(), bitmap);

    // create matrix to convert to greyscale:
    ColorMatrix greyscaleMatrix = new ColorMatrix();
    greyscaleMatrix.setSaturation(0);

    // create matrix to colorize and apply transluceny:
    ColorMatrix colorizeMatrix = new ColorMatrix();
    color = context.getResources().getColor(color);
    colorizeMatrix.setScale(Color.red(color) / 255.0f,
            Color.green(color) / 255.0f,
            Color.blue(color) / 255.0f,
            Color.alpha(color) / 255.0f); // <- try setting this to 1.0f for no translucency

    // concatenate the two matrices and create a ColorMatrixColorFilter from the result:
    greyscaleMatrix.postConcat(colorizeMatrix);
    ColorMatrixColorFilter filter = new ColorMatrixColorFilter(greyscaleMatrix);

    // apply the filter:
    drawable.setColorFilter(filter);
    return drawable;
}

还有必要把图片做成半透明的吗?除了黑色背景外,从后面似乎看不到任何东西。