安卓关于canvas绘制时,模糊遮罩滤镜和浮雕遮罩滤镜

您所在的位置:网站首页 安卓canvas目录 安卓关于canvas绘制时,模糊遮罩滤镜和浮雕遮罩滤镜

安卓关于canvas绘制时,模糊遮罩滤镜和浮雕遮罩滤镜

2024-06-18 19:10| 来源: 网络整理| 查看: 265

在使用canvas绘图时实现如图效果,

模糊遮罩滤镜(BlurMaskFilter)

BlurMaskFilter.Blur 模式

NORMAL: 内外都模糊绘制  SOLID: 内部正常绘制,外部模糊  OUTER: 内部不绘制,外部模糊  INNER: 内部模糊,外部不绘制

mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG); mCirclePaint.setColor(getResources().getColor(R.color.tab_bottom_select)); // mCirclePaint.setStyle(Paint.Style.FILL); //模糊遮罩滤镜(BlurMaskFilter),.浮雕遮罩滤镜(EmbossMaskFilter) /* NORMAL: 内外都模糊绘制 SOLID: 内部正常绘制,外部模糊 OUTER: 内部不绘制,外部模糊 INNER: 内部模糊,外部不绘制*/ mCirclePaint.setMaskFilter(new BlurMaskFilter(8, BlurMaskFilter.Blur.SOLID));

后续调用绘图方法即可,注意:在自定义view的过程中,光上面配置还不够,若需达到上面图片效果,还需要,关闭硬件加速

setLayerType(View.LAYER_TYPE_SOFTWARE,null);关闭硬件加速会有一些弊端,目前我在自定义view的过程中还调用了drawBitmap等方法,关闭硬件加速后会导致drawBitmap失效,即没有绘制成功Bitmap。

硬件加速分为四个层级:

ApplicationActivityWindowView Application级别

往您的应用程序AndroidManifest.xml文件为application标签添加如下的属性即可为整个应用程序开启硬件加速:

Activity级别

您还可以控制每个activity是否开启硬件加速,只需在activity元素中添加android:hardwareAccelerated属性即可办到。比如下面的例子,在application级别开启硬件加速,但在某个activity上关闭硬件加速。

        Window级别

如果您需要更小粒度的控制,可以使用如下代码开启某个window的硬件加速:

getWindow().setFlags(    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

注:目前还不能在window级别关闭硬件加速。

View级别

您可以在运行时用以下的代码关闭单个view的硬件加速:

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

注:您不能在view级别开启硬件加速

为什么需要这么多级别的控制?

很明显,硬件加速能够带来性能提升,android为什么要弄出这么多级别的控制,而不是默认就是全部硬件加速呢?原因是并非所有的2D绘图操作支持硬件加速,如果您的程序中使用了自定义视图或者绘图调用,程序可能会工作不正常。如果您的程序中只是用了标准的视图和Drawable,放心大胆的开启硬件加速吧!具体是哪些绘图操作不支持硬件加速呢?以下是已知不支持硬件加速的绘图操作:

Canvas clipPath()clipRegion()drawPicture()drawPosText()drawTextOnPath()drawVertices()Paint setLinearText()setMaskFilter()setRasterizer()

另外还有一些绘图操作,开启和不开启硬件加速,效果不一样:

Canvas clipRect(): XOR, Difference和ReverseDifference裁剪模式被忽略,3D变换将不会应用在裁剪的矩形上。drawBitmapMesh():colors数组被忽略drawLines():反锯齿不支持setDrawFilter():可以设置,但无效果 Paint setDither(): 忽略setFilterBitmap():过滤永远开启setShadowLayer():只能用在文本上ComposeShader ComposeShader只能包含不同类型的shader (比如一个BitmapShader和一个LinearGradient,但不能是两个BitmapShader实例)ComposeShader不能包含ComposeShader

如果应用程序受到这些影响,您可以在受影响的部分调用setLayerType(View.LAYER_TYPE_SOFTWARE, null),这样在其它地方仍然可以享受硬件加速带来的好处



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3