Banner触摸和手指离开屏幕时启停外部指示器动画

外部指示器进度动画启停触发
开发中需要外部添加指示器动画,指示器跟着banner时长显示增长进度动画,但是遇到banner无法监听到触摸事件,banner内部包裹viewpager 设置touchevent没有回调。
方案1
子视图itemview设置触摸事件,

            holder.itemView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    int action = event.getAction();
                    if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL
                            || action == MotionEvent.ACTION_OUTSIDE) {
                        indicator.setLottieState(0);
//                start();
                    } else if (action == MotionEvent.ACTION_DOWN) {
                        indicator.setLottieState(1);
//                stop();
                    }
                    return false;
                }
            });

这样可以监听到触摸,但是触摸滑动被释放,不能达到预期效果,再加上banner滑动事件监听,效果不佳

            @Override
            public void onPageScrollStateChanged(int state) {
//                if (state == ViewPager2.SCROLL_STATE_DRAGGING) {
//                    indicator.setLottieState(1);//stop
//                } else if (state == ViewPager2.SCROLL_STATE_IDLE){
//                    indicator.setLottieState(0);//start
//                }

方案2
直接重写banner类和scrollManager类,增加dispatchTouchEvent回调从里面处理触摸和离开事件

  //增加接口回调
    private OnTouchListener onTouchListener;

    public void setOnBannerTouchListener(OnTouchListener onTouchListener) {
        this.onTouchListener = onTouchListener;
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (!getViewPager2().isUserInputEnabled()) {
            return super.dispatchTouchEvent(ev);
        }
		 if (onTouchListener!=null){//回调给外部
            //返回啥都无所谓 不用
           boolean none = onTouchListener.onTouch(this,ev);
        }
        int action = ev.getActionMasked();
        if (action == MotionEvent.ACTION_UP
                || action == MotionEvent.ACTION_CANCEL
                || action == MotionEvent.ACTION_OUTSIDE) {
            start();
        } else if (action == MotionEvent.ACTION_DOWN) {
            stop();
        }
        return super.dispatchTouchEvent(ev);
    }
//设置监听
banner.setOnBannerTouchListener((v1, event) -> {
            int action = event.getAction();
            if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL
                    || action == MotionEvent.ACTION_OUTSIDE) {
                indicator.setLottieState(0);
            } else if (action == MotionEvent.ACTION_DOWN) {
                indicator.setLottieState(1);
            }
            return false;
        });

方案3

/**
 * @author mahongyin
 * 重写事件分发
 */

public class DisPatchTouchBanner<T,VB extends BannerAdapter> extends Banner<T,VB> {
    public DisPatchTouchBanner(Context context) {
        super(context);
    }

    public DisPatchTouchBanner(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public DisPatchTouchBanner(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    private OnTouchListener onTouchListener;

    public void setOnBannerTouchListener(OnTouchListener onTouchListener) {
        this.onTouchListener = onTouchListener;
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (!getViewPager2().isUserInputEnabled()) {//同样优先viewpager
            return super.dispatchTouchEvent(ev);
        }
        if (onTouchListener!=null){//回调给外部
            //返回啥都无所谓 不用
           boolean none = onTouchListener.onTouch(this,ev);
        }
        return super.dispatchTouchEvent(ev);
    }
}
//设置监听
//只能在事件分发时处理  因为在子itemview的触摸事件有些event事件vp的内部处理不了的
        banner.setOnBannerTouchListener((v1, event) -> {
            int action = event.getAction();
            if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL
                    || action == MotionEvent.ACTION_OUTSIDE) {
                indicator.setLottieState(0);
            } else if (action == MotionEvent.ACTION_DOWN) {
                indicator.setLottieState(1);
            }
            return false;
        });

题外话

    //给banner设置圆角
banner.setOutlineProvider(new ViewOutlineProvider() {

    @Override
    public void getOutline(View view, Outline outline) {
    
        outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), 12);
    }
    
});
banner.setClipToOutline(true);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1976222027

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值