目前,我有一个应用程序,支持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 view
onDraw
函数中,只需直接绘制屏幕外位图。if (null == this.ballBitmap) {
this.ballBitmap = generateBallBitmap();
}
canvas.drawBitmap(this.ballBitmap, px - this.ballSize, py, null);
在整个过程中,我只依赖layer type的默认值,而不显式调用
setLayerType
。结果很快,但阴影效果也很明显。