Graphics2D API:Paint之阴影与滤镜

一、关于硬件加速

官方文档

1、简述

GPU:图形处理器,用来加速图形的渲染速度
Andorid中,在API 11(3.0)之后,加入了对GPU加速的支持,在API 14(4.0)之后,硬件加速是默认开启的.

2、问题

因为在API >= 14时硬件加速默认开启,如果你的app全部是原生的组件,是不会有任何问题的,但是我们的应用中一般都会有自定义组件,而自定义组件时有些方法是不支持硬件加速或者支持的版本很高,所以这就会出现问题.

3、自定义组件时一些方法支持硬件加速的版本( 摘自官方文档 )

API代表这些方法在>=这些版本才支持硬件加速,红叉代表不支持

4、硬件加速开启与关闭

硬件加速可以在4个级别来控制

(1)Application级别
<application  android:hardwareAccelerated="false">
......
</application>

支持开启、关闭

(2)Activity级别
<activity android:hardwareAccelerated="false" />   

支持开启、关闭

(3)Window级别
getWindow().setFlags(
   WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
  WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

只支持开启

(4)View级别
setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

或者在布局文件中通过layerType属性关闭硬件加速

 android:layerType="software" 

只支持关闭

二、阴影

1、介绍

Paint中有一个专门用来实现阴影效果的方法:

public void setShadowLayer(float radius, float dx, float dy, int shadowColor)

radius:阴影半径,设为0就是取消阴影
dx:阴影x轴偏移距离,大于0向右偏移,小于0向左偏移
dy:阴影y轴偏移距离,大于0向下偏移,小于0向上偏移
color:阴影的颜色(对图片阴影无效)

从上面的硬件加速图片中可以找到这个方法:该方法对绘制文本阴影支持硬件加速,其它的都不支持硬件加速,所以,我们在自定义控件中使用到这个方法时,一般都要关闭硬件加速.

2、使用
    private void gogogo(Canvas canvas) {
        this.setLayerType(LAYER_TYPE_SOFTWARE, null);//取消硬件加速

        mPaint.setColor(Color.BLUE);
        mPaint.setTextSize(66);
        mPaint.setShadowLayer(10, 5, 5, Color.GRAY);//阴影

        canvas.drawText("随风飘扬的Smile", 100, 100, mPaint);
        canvas.drawCircle(200, 200, 50, mPaint);
    }
3、移除阴影

一旦我们定义了阴影层,后面绘制的都会带上阴影,如果想取消阴影,可以使用Paint的下面这个方法:

    public void clearShadowLayer() {
        setShadowLayer(0, 0, 0, 0);
    }
4、TextView及其子类阴影

对于原生的TextView及其子类,都支持通过XML设置阴影


    <TextView
        ......
        android:shadowColor="@color/blue"
        android:shadowDx="5"
        android:shadowDy="5"
        android:shadowRadius="10" />

这几个属性对照上面setShadowLayer的参数一看就明白了.
当然,通过代码设置也是可以的:

public void setShadowLayer(float radius, float dx, float dy, int color)

三、Alpha滤镜

1、setMaskFilter
public MaskFilter setMaskFilter(MaskFilter maskfilter)

在前一篇Paint之颜色过滤中介绍了画笔Paint如何设置颜色滤镜(setColorFilter),这里setMaskFilter介绍的也是滤镜.

和setColorFilter方法介绍的差不多,setMaskFilter方法需要一个MaskFilter 对象,而MaskFilter类中基本啥都没有,所以这里需要的其实是它的2个子类:

注意:setMaskFilter这个方法也是不支持硬件加速

2、BlurMaskFilter 模糊滤镜
public BlurMaskFilter(float radius, Blur style)

radius:模糊半径
style:模糊样式,可选值:
    BlurMaskFilter.Blur.NORMAL  内外模糊
    BlurMaskFilter.Blur.SOLID  图像边界外产生与Paint颜色一致的阴影效果
    BlurMaskFilter.Blur.OUTER  外部模糊,同时将原图像透明
    BlurMaskFilter.Blur.INNER  内部模糊

来看一下它们的效果:

    private void gogogo(Canvas canvas) {
        this.setLayerType(LAYER_TYPE_SOFTWARE, null);//取消硬件加速
        mPaint.setColor(Color.BLUE);

        mPaint.setMaskFilter(new BlurMaskFilter(66, BlurMaskFilter.Blur.NORMAL));
//        mPaint.setMaskFilter(new BlurMaskFilter(66, BlurMaskFilter.Blur.SOLID));
//        mPaint.setMaskFilter(new BlurMaskFilter(66, BlurMaskFilter.Blur.OUTER));
//        mPaint.setMaskFilter(new BlurMaskFilter(66, BlurMaskFilter.Blur.INNER));
        canvas.drawCircle(200, 200, 100, mPaint);
    }
3、EmbossMaskFilter 浮雕滤镜

EmbossMaskFilter 可以让绘制的图形体现出浮雕的效果.
浮雕效果:模拟光照效果,靠近光的一面显得亮一点,远离光的一面显得暗一点,这样就通过颜色的亮暗营造出浮雕的3D立体效果.

public EmbossMaskFilter(float[] direction, float ambient, float specular, float blurRadius)

direction:一个float类型的数组,表示光线的方向,包含三个值---[x, y, z],是一个空间立体坐标系在三个方向的值,最终形成光照方向
ambient:环境光亮度,取值是0到1,值越接近于0,环境光越暗,值越接近于1,环境光越亮
specular:镜面反射系数
blurRadius:浮雕效果中“凸”起的大小

下面来看一看具体效果:

    private void gogogo(Canvas canvas) {
        this.setLayerType(LAYER_TYPE_SOFTWARE, null);//取消硬件加速
        mPaint.setColor(Color.BLUE);
        mPaint.setTextSize(66);

        EmbossMaskFilter filter = new EmbossMaskFilter(new float[]{1, 1, 3}, 0.4f, 8, 3);//浮雕滤镜
        mPaint.setMaskFilter(filter);
        canvas.drawText("随风飘扬的笑", 100, 100, mPaint);
    }

这个滤镜在实际开发中使用率很低,因为最终效果不是很好控制.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容

  • Android显示框架:自定义View实践之绘制篇 关于作者 郭孝星,程序员,吉他手,主要从事Android平台基...
    郭孝星阅读 9,703评论 2 38
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,569评论 25 707
  • POS机业务现状: 1.pos机具的覆盖率。中国每万人所拥有的pos机是13.7 台,在美国这一数字跃升至179台...
    润海阅读 341评论 0 0
  • 秋风和煦,阳光明媚。 信步城外山野,好巧就遇上了心仪之人。 “蒹葭苍苍,白露为霜。所谓伊人,在水一方。溯洄从之,道...
    虞_兮阅读 337评论 0 4
  • #基本功# 《特质》 当你在听演讲的时候,你最喜欢演讲者身上的什么特质? 看到今天晚上的这个话题,演讲者的特质的时...
    蜜丝姜阅读 148评论 0 1