Android垂直跑马灯

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);
    }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值