Android自定义textview实现竖直滚动跑马灯效果
本文实例为大家分享了Android自定义textview实现跑马灯效果的具体代码,供大家参考,具体内容如下
xml布局
自定义MarqueeLayout
publicclassMarqueeLayoutextendsFrameLayoutimplementsViewTreeObserver.OnGlobalLayoutListener{
privateViewview1;
privateViewview2;
publicintinterval=2000;
publicMarqueeLayout(Contextcontext){
this(context,null);
}
publicMarqueeLayout(Contextcontext,AttributeSetattrs){
this(context,attrs,0);
}
publicMarqueeLayout(Contextcontext,AttributeSetattrs,intdefStyleAttr){
super(context,attrs,defStyleAttr);
getViewTreeObserver().addOnGlobalLayoutListener(this);
}
@Override
protectedvoidonFinishInflate(){
super.onFinishInflate();
if(getChildCount()!=2){
thrownewIllegalArgumentException("MarqueeLayoutshouldhave2child!");
}
view1=getChildAt(0);
view2=getChildAt(1);
}
@Override
publicvoidonGlobalLayout(){
getViewTreeObserver().removeGlobalOnLayoutListener(this);
view2.setTranslationY(view2.getHeight());
}
privateHandlerhandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
super.handleMessage(msg);
startAnim();
}
};
booleanisAniming=false;
/**
*开始滚动
*/
publicvoidstart(){
getViewTreeObserver().addOnGlobalLayoutListener(newViewTreeObserver.OnGlobalLayoutListener(){
@Override
publicvoidonGlobalLayout(){
getViewTreeObserver().removeGlobalOnLayoutListener(this);
startAnim();
}
});
}
publicvoidstartAnim(){
if(isAniming)return;
isAniming=true;
inttargetY1=view1.getTranslationY()==0?-view1.getHeight():0;
inttargetY2=view2.getTranslationY()==0?-view2.getHeight():0;
ViewCompat.animate(view1)
.translationY(targetY1)
.setListener(newViewPropertyAnimatorListenerAdapter(){
@Override
publicvoidonAnimationEnd(Viewview){
super.onAnimationEnd(view);
//移动到下方
resetView(view);
}
})
.setDuration(400).start();
ViewCompat.animate(view2)
.translationY(targetY2)
.setListener(newViewPropertyAnimatorListenerAdapter(){
@Override
publicvoidonAnimationEnd(Viewview){
super.onAnimationEnd(view);
//移动到下方
resetView(view);
isAniming=false;
handler.sendEmptyMessageDelayed(0,interval);
}
})
.setDuration(400)
.start();
}
privatevoidresetView(Viewview){
if(view.getTranslationY()==-view.getHeight()){
view.setTranslationY(view.getHeight()*2);
}
}
publicvoidstop(){
handler.removeCallbacksAndMessages(null);
}
}
在Activity中的使用
publicclassMainActivityextendsAppCompatActivity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MarqueeLayoutmarqueeLayout=(MarqueeLayout)findViewById(R.id.mar);
TextViewtv1=(TextView)findViewById(R.id.tv1);
TextViewtv2=(TextView)findViewById(R.id.tv2);
marqueeLayout.start();
tv1.setVisibility(tv1.getTranslationY()==0?View.VISIBLE:View.GONE);
tv2.setVisibility(tv2.getTranslationY()==0?View.VISIBLE:View.GONE);
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。