Android实现垂直跑马灯效果
在我们开发过程中,跑马灯这个功能非常实用的,在实现这个功能的时候,这个时候我们通常需要找demo来实现这个方法,我从github上面找到这个demo感觉很好用,所以就要实现了这个功能喽MarqueeView,看这个工具类,因为我找这个类的时候是没有点击事件的,所以我给它加了一个点击事件,看这个工具类
publicclassMarqueeViewextendsViewFlipper{
privateContextmContext;
privateListnotices;
privatebooleanisSetAnimDuration=false;
privateintcontentSize;
privateintinterval=1000;
privateintanimDuration=500;
privateinttextSize=14;
privateinttextColor=0xffffffff;
privateintgravity=Gravity.LEFT|Gravity.CENTER_VERTICAL;
//点击事件
privateOnItemClickListeneronItemClickListener;
publicMarqueeView(Contextcontext,AttributeSetattrs){
super(context,attrs);
init(context,attrs,0);
}
privatevoidinit(Contextcontext,AttributeSetattrs,intdefStyleAttr){
this.mContext=context;
if(notices==null){
notices=newArrayList<>();
}
TypedArraytypedArray=getContext().obtainStyledAttributes(attrs,R.styleable.MarqueeViewStyle,defStyleAttr,0);
interval=typedArray.getInteger(R.styleable.MarqueeViewStyle_mvInterval,interval);
isSetAnimDuration=typedArray.hasValue(R.styleable.MarqueeViewStyle_mvAnimDuration);
animDuration=typedArray.getInteger(R.styleable.MarqueeViewStyle_mvAnimDuration,animDuration);
if(typedArray.hasValue(R.styleable.MarqueeViewStyle_mvTextSize)){
textSize=(int)typedArray.getDimension(R.styleable.MarqueeViewStyle_mvTextSize,textSize);
textSize=DisplayUtil.px2sp(mContext,textSize);
}
textColor=typedArray.getColor(R.styleable.MarqueeViewStyle_mvTextColor,textColor);
typedArray.recycle();
setFlipInterval(interval);
AnimationanimIn=AnimationUtils.loadAnimation(mContext,R.anim.anim_marquee_in);
if(isSetAnimDuration)animIn.setDuration(animDuration);
setInAnimation(animIn);
AnimationanimOut=AnimationUtils.loadAnimation(mContext,R.anim.anim_marquee_out);
if(isSetAnimDuration)animOut.setDuration(animDuration);
setOutAnimation(animOut);
}
//根据公告字符串启动轮播
publicvoidstartWithText(finalStringnotice){
if(TextUtils.isEmpty(notice))return;
getViewTreeObserver().addOnGlobalLayoutListener(newViewTreeObserver.OnGlobalLayoutListener(){
@Override
publicvoidonGlobalLayout(){
getViewTreeObserver().removeGlobalOnLayoutListener(this);
startWithFixedWidth(notice,getWidth());
}
});
}
//根据公告字符串列表启动轮播
publicvoidstartWithList(Listnotices){
setNotices(notices);
start();
}
//根据宽度和公告字符串启动轮播
privatevoidstartWithFixedWidth(Stringnotice,intwidth){
intnoticeLength=notice.length();
intdpW=DisplayUtil.px2dip(mContext,width);
intlimit=dpW/textSize;
if(dpW==0){
thrownewRuntimeException("PleasesetMarqueeViewwidth!");
}
if(noticeLength<=limit){
notices.add(notice);
}else{
intsize=noticeLength/limit+(noticeLength%limit!=0?1:0);
for(inti=0;i=noticeLength?noticeLength:(i+1)*limit);
notices.add(notice.substring(startIndex,endIndex));
}
}
start();
}
//启动轮播
publicbooleanstart(){
if(notices==null||notices.size()==0)returnfalse;
removeAllViews();
for(inti=0;i1){
startFlipping();
}
returntrue;
}
//创建ViewFlipper下的TextView
privateTextViewcreateTextView(Stringtext,intposition){
TextViewtv=newTextView(mContext);
tv.setGravity(gravity);
tv.setText(text);
tv.setTextColor(textColor);
tv.setTextSize(textSize);
tv.setTag(position);
returntv;
}
publicListgetNotices(){
returnnotices;
}
publicvoidsetNotices(Listnotices){
this.notices=notices;
}
publicvoidsetOnItemClickListener(OnItemClickListeneronItemClickListener){
this.onItemClickListener=onItemClickListener;
}
publicinterfaceOnItemClickListener{
voidonItemClick(intposition,TextViewtextView);
}
}
这就是它实现的方式,我从中加了点击事件,所以它的用法是这样的
verticalSwitchTextView1=(MarqueeView)rootView.findViewById(R.id.vertical_switch_textview1); Listinfo=newArrayList<>(); info.add("1.能够适应多行长文本的AndroidTextView的例子"); info.add("2.\"科比,!"); info.add("3.GitHub帐号:zhangyuanchong"); info.add("4.\"理解的也很简单,"); info.add("5.破解密钥"); info.add("6.实现了两种方式"); verticalSwitchTextView1.startWithList(info); verticalSwitchTextView1.setOnItemClickListener(newMarqueeView.OnItemClickListener(){ @Override publicvoidonItemClick(intposition,TextViewtextView){ position=position+1; Toast.makeText(getActivity(),"点击了"+position,Toast.LENGTH_SHORT).show(); } });
这样就直接实现喽,其实还是蛮简单的呢。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。