#本文基于android sdk 22
在android graphics模块中有一类特效类叫做“path effect”,他们有一个共同的基类“PathEffect”。这些path effect的唯一目的就是给path增加特效,换句话话说只有当paint的style为“STROKE”或者“FILL_AND_STROKE”时,path effect才会生效。添加path effect的方式很简单,只需要调用Paint.setPathEffect()即可。
截止到android sdk 22,共有6中内置的PathEffect。下面表格列出这六种path effect,并给出基本说明。
CornerPathEffect | 处理path的各个连接点,可以产生圆角效果,可以控制圆角半径 |
DashPathEffect | 生成虚线效果,可以分别控制实点和虚点长度,可以控制偏移量 |
PathDashPathEffect | 类似于DashPathEffect, 只不过增加了控制实点形状的能力 |
DiscretePathEffect | 沿着path产生毛边的效果,可以控制毛边颗粒间距,以及毛边颗粒偏移距离 |
ComposePathEffect | 可以将任意两种path effect的效果,比如CornerPathEffect和DashPathEffect。不过要注意的是它与SumPathEffect的不同,ComposePathEffect的叠加效果相当于,先生效效果A,然后以A为基础生效效果B。 |
SumPathEffect | 可以叠加任意两种path effect的效果,与Compose不同的是,它相当于同时生效A和B,然后在视图上将两种效果生硬的上下叠加起来。 |
下面是各种path effect的实例代码和运行结果。
CornerPathEffect
核心代码:
package com.zlsam.learngraphics.patheffect; import android.content.Context; /** private int mCornerRadius = 5; public CornerPathEffectView(Context context) { public CornerPathEffectView(Context context, AttributeSet attrs) { public CornerPathEffectView(Context context, AttributeSet attrs, int defStyleAttr) { if (isInEditMode()) { // Init paint // Init path // Init paint @Override public void setCornerRadius(int radius) { public int getCornerRadius() { |
运行效果:
DashPathEffect
核心代码:
package com.zlsam.learngraphics.patheffect; import android.content.Context; /** private float mSolidLength = 1F; public DashPathEffectView(Context context) { public DashPathEffectView(Context context, AttributeSet attrs) { public DashPathEffectView(Context context, AttributeSet attrs, int defStyleAttr) { // Init paint // Init path // Init paint @Override public void setSolidLength(float length) { public float getSolidLength() { public void setVirtualLength(float length) { public float getVirtualLength() { public void setPhase(float phase) { public float getPhase() { } |
运行效果:
PathDashPathEffect
核心代码:
package com.zlsam.learngraphics.patheffect; import android.content.Context; /** private Path mPath; public PathDashPathEffectView(Context context) { public PathDashPathEffectView(Context context, AttributeSet attrs) { public PathDashPathEffectView(Context context, AttributeSet attrs, int defStyleAttr) { // Init paint Path path = new Path(); // Init path // Init paint @Override |
运行结果:
DiscretePathEffect
核心代码:
package com.zlsam.learngraphics.patheffect; import android.content.Context; /** private float mSegmentLength = 1.0F; public DiscretePathEffectView(Context context) { public DiscretePathEffectView(Context context, AttributeSet attrs) { public DiscretePathEffectView(Context context, AttributeSet attrs, int defStyleAttr) { // Init paint // Init path // Init paint @Override public void setSegmentLength(float length) { public float getSegmentLength() { public void setDeviation(float deviation) { public float getDeviation() { |
运行结果:
ComposePathEffect
核心代码:
package com.zlsam.learngraphics.patheffect; import android.content.Context; /** private int mCornerRadius = 0; public ComposePathEffectView(Context context) { public ComposePathEffectView(Context context, AttributeSet attrs) { public ComposePathEffectView(Context context, AttributeSet attrs, int defStyleAttr) { // Init paint // Init path // Init paint @Override public void setCornerRadius(int radius) { public int getCornerRadius() { public void setSolidLength(float length) { public float getSolidLength() { public void setVirtualLength(float length) { public float getVirtualLength() { public void setPhase(float phase) { public float getPhase() { } |
运行结果:
SumPathEffect
核心代码:
package com.zlsam.learngraphics.patheffect; import android.content.Context; /** private int mCornerRadius = 0; public SumPathEffectView(Context context) { public SumPathEffectView(Context context, AttributeSet attrs) { public SumPathEffectView(Context context, AttributeSet attrs, int defStyleAttr) { if (isInEditMode()) { // Init paint // Init path // Init paint @Override public void setCornerRadius(int radius) { public int getCornerRadius() { public void setSolidLength(float length) { public float getSolidLength() { public void setVirtualLength(float length) { public float getVirtualLength() { public void setPhase(float phase) { public float getPhase() { |
运行结果:
本文的示例源码下载地址:https://github.com/zhanglong1/AndroidGraphicsDemo