【问题标题】:Drawing a Bitmap to a Canvas with an alpha gradient使用 alpha 渐变将位图绘制到画布上
【发布时间】:2016-11-03 14:45:32
【问题描述】:

我想在Canvas 上绘制Bitmap,并应用(线性)alpha 渐变。重要的一点是我不想用任何其他颜色覆盖图像;背景(来自View 后面的Views,我将把这个Canvas 绘制到)应该只是“闪耀”。为了说明,我的目标是这样的(棋盘格图案代表后面的View

有人会认为我可以这样做:

Bitmap bitmap = ...;
Paint paint = new Paint();
paint.setShader(new LinearGradient(0, 0, 100, 0, FROM, TO, Shader.TileMode.CLAMP));
canvas.drawBitmap(bitmap, 0, 0, paint);

但是LinearGradientFROMTO 参数需要是颜色,而不是alpha 值;所以我看不到指定的方法,例如FROM 应该是完全透明的,TO 应该是完全不透明的(不应用任何颜色覆盖)。

【问题讨论】:

标签: java android canvas bitmap gradient


【解决方案1】:

使用ComposeShader,像这样:

class V extends View {
    Bitmap bitmap;
    Paint paint = new Paint();

    public V(Context context) {
        super(context);
        bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.chrome);
        Shader shaderA = new LinearGradient(0, 0, bitmap.getWidth(), 0, 0xffffffff, 0x00ffffff, Shader.TileMode.CLAMP);
        Shader shaderB = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        paint.setShader(new ComposeShader(shaderA, shaderB, PorterDuff.Mode.SRC_IN));
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawRect(0, 0, bitmap.getWidth(), bitmap.getHeight(), paint);
    }
}

【讨论】:

  • 当然你需要改变LinearGradient构造函数参数来获得想要的渐变
  • 原则上,我比我能想出的那个更喜欢这个。但是由于不必创建屏幕外Canvas,是否也有性能优势?
  • 我认为它是:不仅在 CPU 时钟中,而且还通过与屏幕外 Bitmap 的创建相关的消耗内存,顺便说一句,你可以做你对 Canvas#saveLayer 所做的事情(无需额外的 @ 987654327@ 创建)但我仍然认为ComposeShader 更接近低级 GPU 的东西
  • 是否可以将此代码与 Picasse / Glide 结合使用?你能举个例子吗:-)?
【解决方案2】:

基于this answer about masking,我能够使用辅助屏幕外画布做到这一点:

Bitmap backing = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
{
    Canvas offscreen = new Canvas(backing);
    offscreen.drawBitmap(bitmap, 0, 0, null);
    Paint paint = new Paint();
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
    paint.setShader(new LinearGradient(0, 0, 100, 0, 0x00000000, 0xFF000000, Shader.TileMode.CLAMP));
    offscreen.drawRect(0, 0, bitmap.getWidth(), bitmap.getHeight(), paint);
}
canvas.drawBitmap(backing, 0, 0, null);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    相关资源
    最近更新 更多