Android自定义观点控件实现多种水波纹涟漪扩散效果

  

  

 Android自定义观点控件实现多种水波纹涟漪扩散效果

  

  

这个效果实现起来并不难,重要的是思路
  

  

此视图满足了多种水波纹涟漪扩散效果,这要求它能满足很多的变化
  

  

根据上面的样式,可以看出此观点需要满足以下变化

  
      <李>圆圈从中心可循环向外扩散李   <李>圆圈之间的扩散间距可以改变李   <李>可控制扩散圆的渐变度   <李>圆圈可以是线条样式或者实心样式李   <李>圆圈扩散的速度可以控制李   <李>适配圆圈不同大小下的扩散效果李   
  

  

<>强创建自定义属性

  

首先为视图创建自定义的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);   }      

  

设计的整体思路如下图所示
  

  

 Android自定义观点控件实现多种水波纹涟漪扩散效果”> <br/>
  </p>
  <p>先要实现圆形向外扩散的效果</p>
  <ul>
  <李>初始化第一个圆李</>
  </ul>
  <p>这里的动画效果本来是想使用ValueAnimator属性动画的数值发生器来实现,但是我们这里有很多的计算需求,所以最后还是选择使用算法来实现,方便控制圆的一些参数<br/>
  </p>
  <p>想要实现扩散的效果,这里思路是在每次更新视图时动态改变圆的半径,同时还需要给圆设置渐变度数,所以决定用一个类来保存圆的状态,所有圆都存在一个列表里</p>
  
  <pre类=//添加第一个圆圈   ,mRipples=new ArrayList<的在();   圆c=新圆(0,255);    mRipples.add (c);      

传入圆类里的两个参数,第一个0表示圆的初始宽度,第二个255表示初始透明度

  
      <李>添加新圆李   
  

要想实现不断有圆向外扩散,就需要在第一个圆扩散到一定范围时在圆心处再添加一个圆,这个的范围可以由圆的半径来控制,当列表集合中最后一个圆的半径增加到某个值mDensity时,新的圆就从圆心处创建出来

Android自定义观点控件实现多种水波纹涟漪扩散效果