水平跑马灯
<TextView
android:id="@+id/channels_item_types2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:ellipsize="marquee"
android:focusableInTouchMode="true"
android:gravity="center"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:singleLine="true"
android:text=" Apple iPhone 8 Plus (A1864) 64GB 金色 移动联通电信4G手机 【iPhone新品上市】新一代iPhone,让智能看起来更不一样"
android:textColor="#10bcb0" />
垂直跑马灯 (举例效果)
Activity代码:
package com.audrey.projectjd.view.widget;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPropertyAnimatorListenerAdapter;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.FrameLayout;
/**
* 垂直走马灯网址http://www.jb51.net/article/117580.htm
* Created by dell on 2017/11/10.
*/
public class MarqueeLayout extends FrameLayout implements ViewTreeObserver.OnGlobalLayoutListener{
private View view1;
private View view2;
public int interval = 2000;
public MarqueeLayout(Context context) {
this(context,null);
}
public MarqueeLayout(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public MarqueeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
getViewTreeObserver().addOnGlobalLayoutListener(this);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
if(getChildCount()!=2){
throw new IllegalArgumentException("MarqueeLayout should have 2 child!");
}
view1 = getChildAt(0);
view2 = getChildAt(1);
}
@Override
public void onGlobalLayout() {
getViewTreeObserver().removeGlobalOnLayoutListener(this);
view2.setTranslationY(view2.getHeight());
}
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
startAnim();
}
};
boolean isAniming = false;
/**
* 开始滚动
*/
public void start(){
getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
getViewTreeObserver().removeGlobalOnLayoutListener(this);
startAnim();
}
});
}
public void startAnim(){
if(isAniming)return;
isAniming = true;
int targetY1 = view1.getTranslationY()==0?-view1.getHeight():0;
int targetY2 = view2.getTranslationY()==0?-view2.getHeight():0;
ViewCompat.animate(view1)
.translationY(targetY1)
.setListener(new ViewPropertyAnimatorListenerAdapter(){
@Override
public void onAnimationEnd(View view) {
super.onAnimationEnd(view);
//移动到下方
resetView(view);
}
})
.setDuration(400).start();
ViewCompat.animate(view2)
.translationY(targetY2)
.setListener(new ViewPropertyAnimatorListenerAdapter(){
@Override
public void onAnimationEnd(View view) {
super.onAnimationEnd(view);
//移动到下方
resetView(view);
isAniming = false;
handler.sendEmptyMessageDelayed(0,interval);
}
})
.setDuration(400)
.start();
}
private void resetView(View view) {
if(view.getTranslationY()==-view.getHeight()){
view.setTranslationY(view.getHeight()*2);
}
}
public void stop(){
handler.removeCallbacksAndMessages(null);
}
}
XML文件:
<com.audrey.projectjd.view.widget.MarqueeLayout
android:id="@+id/mar2"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1">
<TextView
android:id="@+id/tv3"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="【iPhone新品上市】 劲爆价 2999¥ "
android:textSize="16sp"
android:visibility="gone" />
<TextView
android:id="@+id/tv4"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:gravity="center"
android:textSize="16sp"
android:text="iPhone7 Plus 64GB 金色 劲爆价 99 ¥ "
android:visibility="gone" />
</com.audrey.projectjd.view.widget.MarqueeLayout