目前,我有一个应用程序,支持android 2.3及以上版本。
在我的自定义视图绘制操作中,我需要在绘制圆时放置阴影。

ballPaint.setShadowLayer(shadowSize, shadowSize, shadowSize, historyChartBallShadow);
canvas.drawCircle(px, py, this.ballSize, ballPaint);

我也明白,在硬件加速打开的情况下,我不会产生这样的阴影效果
setShadowLayer Android API differences
然而,我意识到一旦通过view.setLayerType(View.LAYER_TYPE_SOFTWARE, null)关闭硬件加速,我的整个自定义视图绘制操作就会变得非常缓慢。
我想知道,有没有其他方法可以达到类似的阴影效果。(一个“模糊”的黑色圆圈阴影)
不关闭硬件加速?
p/s即使我想使用Android draw with blur中的BlurMaskFilter,我也意识到它不支持硬件加速。

最佳答案

我找到了一种方法来实现这一点。首先,我们构建了球+阴影的离屏图像。注意,通过使用屏幕外位图绘制技术,不涉及GPU。关键是,不要使用Canvas中的onDraw来执行drawCircle
相反,构建我们自己的Canvas,由屏幕外位图支持。

private Bitmap generateBallBitmap() {
    final int ballShadowSize = Utils.dpToPixel(BALL_SHADOW_SIZE);

    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setColor(historyChartBallColor);
    paint.setShadowLayer(ballShadowSize, ballShadowSize, ballShadowSize, historyChartBallShadow);

    Bitmap bitmap = Bitmap.createBitmap((int)((ballSize + ballShadowSize)*2f), (int)((ballSize + ballShadowSize)*2f), Bitmap.Config.ARGB_8888);
    bitmap.eraseColor(Color.TRANSPARENT);
    Canvas canvas = new Canvas(bitmap);
    canvas.drawCircle(ballSize, ballSize, ballSize, paint);

    return bitmap;
}

在custom viewonDraw函数中,只需直接绘制屏幕外位图。
if (null == this.ballBitmap) {
    this.ballBitmap = generateBallBitmap();
}
canvas.drawBitmap(this.ballBitmap, px - this.ballSize, py, null);

在整个过程中,我只依赖layer type的默认值,而不显式调用setLayerType
结果很快,但阴影效果也很明显。

10-07 19:34
查看更多