水平跑马灯&垂直跑马灯


 水平跑马灯

                 <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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值