安卓关于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标签添加如下的属性即可为整个应用程序开启硬件加速:

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

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

你可能感兴趣的:(安卓关于canvas绘制时,模糊遮罩滤镜和浮雕遮罩滤镜)