跑马灯效果,大家可以去原作者浏览https://github.com/sfsheng0322/MarqueeView
下面看自定义控件的代码
公开课MarqueeView延伸ViewFlipper { 私人上下文mContext; 私人List通知; 私人布尔isSetAnimDuration=false; 私人alt=" Android跑马灯MarqueeView源码解析“>
其实ViewFlipper工作机制很简单,如上图,就是将添加到ViewFlipper中的子视图按照顺序定时的显示是其中一个子视图,其他的子视图设置为消失状态
私人上下文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源码解析