这个效果实现起来并不难,重要的是思路
此视图满足了多种水波纹涟漪扩散效果,这要求它能满足很多的变化
根据上面的样式,可以看出此观点需要满足以下变化
-
<李>圆圈从中心可循环向外扩散李>
<李>圆圈之间的扩散间距可以改变李>
<李>可控制扩散圆的渐变度李>
<李>圆圈可以是线条样式或者实心样式李>
<李>圆圈扩散的速度可以控制李>
<李>适配圆圈不同大小下的扩散效果李>
<>强创建自定义属性强>
首先为视图创建自定义的xml属性
在工程的值目录下新建attrs.xml文件
& lt; declare-styleable name=" mRippleView比; & lt; attr name==把丈?癱Color”格式比; & lt; attr name==罢?癱Speed”格式比; & lt; attr name==罢?癱Density”格式比; & lt; attr name==安级?癱IsFill”格式比; & lt; attr name==安级?癱IsAlpha”格式比; & lt;/declare-styleable>
各个属性的作用如下
-
<李> cColor:查看控件的颜色李>
<李> cSpeed:向外扩散的速度李>
<李> cDensity:圆形波纹扩散的间距李>
<李> cIsFill:是否开启填充模式,真正为实心圆李>
<李> cIsAlpha:是否开启渐变效果,真正为开启李>
新建RippleView类继承视图类,重写它的三个构造方法,获取用户设置的属性,同时指定默认值
公共RippleView(上下文语境、AttributeSet attrs int defStyleAttr) { 超级(上下文、attrs defStyleAttr);//获取用户配置属性 TypedArray tya=上下文。obtainStyledAttributes (attrs R.styleable.mRippleView); mColor=tya.getColor (R.styleable。mRippleView_cColor Color.BLUE); 摩根士丹利亚洲=tya.getInt (R.styleable。mRippleView_cSpeed, 1); mDensity=tya.getInt (R.styleable。mRippleView_cDensity 10); mIsFill=tya.getBoolean (R.styleable。mRippleView_cIsFill、假); mIsAlpha=tya.getBoolean (R.styleable。mRippleView_cIsAlpha、假); tya.recycle (); init (); }
使用TypedArray读取完自定义的属性后一定要记得调用回收方法释放掉
测量onMeasure,首先需要测量出观点的宽和高,并指定视图在wrap_content时的最小范围,对于视图绘制流程还不熟悉的同学,可以先去了解下具体的绘制流程
https://www.jb51.net/article/118775.htm
重写onMeasure方法,其中我们要考虑当视图的宽高被指定为wrap_content时的情况,如果我们不对wrap_content的情况进行处理,那么当使用者指定视图的宽高为wrap_content时将无法正常显示出视图
@Override 保护空白> 公共静态int dip2px(上下文背景下,浮动dpValue) { 最后的浮动比例=context.getResources () .getDisplayMetrics () .density; 返回(int) (dpValue *规模+ 0.5 f); }
设计的整体思路如下图所示
//添加第一个圆圈 ,mRipples=new ArrayList<的在(); 圆c=新圆(0,255); mRipples.add (c);
传入圆类里的两个参数,第一个0表示圆的初始宽度,第二个255表示初始透明度
-
<李>添加新圆李>
要想实现不断有圆向外扩散,就需要在第一个圆扩散到一定范围时在圆心处再添加一个圆,这个的范围可以由圆的半径来控制,当列表集合中最后一个圆的半径增加到某个值mDensity时,新的圆就从圆心处创建出来