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

在使用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。

硬件加速分为四个层级:

  • Application
  • Activity
  • Window
  • View

Application级别

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

<application android:hardwareAccelerated="true" ...>

Activity级别

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

<application android:hardwareAccelerated="true">    <activity ... />    <activity android:hardwareAccelerated="false" /></application>

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,放心大胆的开启硬件加速吧!具体是哪些绘图操作不支持硬件加速呢?以下是已知不支持硬件加速的绘图操作:

猜你喜欢

转载自blog.csdn.net/U__F_O/article/details/81479650