Android跑马灯MarqueeView源码解析

  

跑马灯效果,大家可以去原作者浏览https://github.com/sfsheng0322/MarqueeView
  下面看自定义控件的代码

  

        公开课MarqueeView延伸ViewFlipper {      私人上下文mContext;   私人List通知;   私人布尔isSetAnimDuration=false;   私人alt=" Android跑马灯MarqueeView源码解析“>
  

  

其实ViewFlipper工作机制很简单,如上图,就是将添加到ViewFlipper中的子视图按照顺序定时的显示是其中一个子视图,其他的子视图设置为消失状态
  

  

 Android跑马灯MarqueeView源码解析

        私人上下文mContext;   私人List通知;   私人布尔isSetAnimDuration=false;   私人>   & lt; declare-styleable name=" MarqueeViewStyle比;   & lt; attr=name=" mvInterval "格式"整数|引用"/比;   & lt; attr=name=" mvAnimDuration "格式"整数|引用"/比;   & lt; attr=name=" mvTextSize "格式"维度|引用"/比;   & lt; attr name=" mvTextColor格式=把丈珅引用”/比;   & lt; attr name=" mvGravity比;   & lt;枚举名称==" https://www.yisu.com/zixun/0 "/白蟆奔壑当?   & lt;枚举名称="中心" value=" https://www.yisu.com/zixun/1 "/比;   & lt;枚举名称==" https://www.yisu.com/zixun/2 "/罢贰钡募壑当?   & lt;/attr>   & lt;/declare-styleable>      之前      

  

首先获取属性集合,获取一个mv的间隔,默认值2000

  

  

是否设置动画时间的延迟

        如果(typedArray.hasValue (R.styleable.MarqueeViewStyle_mvTextSize)) {   textSize=(int) typedArray.getDimension (R.styleable。MarqueeViewStyle_mvTextSize textSize);   textSize=DisplayUtil。px2sp (mContext textSize);   }   之前      

假如设置有自定义文字大小,就获取然后px转成sp
  获取控件位置,自由设置
  在后面要回收

         typedArray.recycle ();      

setFlipInterval(间隔);设置滚屏间隔,单位毫秒

        动画animIn=AnimationUtils。loadAnimation (mContext R.anim.anim_marquee_in);   如果isSetAnimDuration animIn.setDuration (animDuration);   setInAnimation (animIn);      动画animOut=AnimationUtils。loadAnimation (mContext R.anim.anim_marquee_out);   如果isSetAnimDuration animOut.setDuration (animDuration);   setOutAnimation (animOut);      之前      

一进一出的动画效果

  

//根据公告字符串启动轮播
  公共空间startWithText(最终字符串通知)
  暴露个公共方法,里面有测量视图的getViewTreeObserver方法,里面内部类调用了startWithFixedWidth(注意,getWidth());方法

     //根据宽度和公告字符串启动轮播   私人空间startWithFixedWidth (String注意,int宽度){   int noticeLength=notice.length ();   数字摄影测量工作站int=DisplayUtil。px2dip (mContext、宽度);   数字摄影测量工作站int限制=/textSize;   如果数字摄影测量工作站(==0){   把新RuntimeException(“请设置MarqueeView宽度!”);   }      如果(noticeLength & lt;=限制){   notices.add(通知);   其他}{   int大?noticeLength/限制+ (noticeLength %限制!=0 & # 63;1:0);   for (int i=0;我& lt;大小;我+ +){   int startIndex=我*限制;   int endIndex=((i + 1) *限制祝辞=noticeLength & # 63;noticeLength: (i + 1) *限制);   notices.add(注意。substring (startIndex endIndex));   }   }   开始();   }      之前      

转换得到一个dp的宽度,限制字数长度大小。假如字符串小于直接添加。假如过长取余得到行数,然后循环,获取那行的头尾,末尾假如2行字数还是比总体长度大就取总体长度,假如小于总体长度,就取那行的末尾下表。
  然后开始播放

     //启动轮播   公共布尔start () {   如果(通知==null | | notices.size()==0)返回false;   removeAllViews ();      for (int i=0;我& lt;notices.size ();我+ +){   最后一个TextView TextView=createTextView (notices.get(我),我);   最后一个int finalI=我;   textView.setOnClickListener (new>//创建ViewFlipper下的TextView   私人TextView createTextView(字符串文本,int位置){   TextView电视=new TextView (mContext);   tv.setGravity(重力);   tv.setText(文本);   tv.setTextColor(输入textColor);   tv.setTextSize (textSize);   tv.setTag(位置);   返回电视;   }      

Android跑马灯MarqueeView源码解析