zoukankan      html  css  js  c++  java
  • Android 为TV端助力之解决ViewPager嵌套RecyclerView水平滑动问题


    public class MyViewPager extends ViewPager {
    private RecyclerView recyclerView;
    public MyViewPager(@NonNull Context context) {
    super(context);
    }

    public MyViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    }

    public void setView(RecyclerView recyclerView){
    this.recyclerView = recyclerView;
    }



    private int startX, startY;
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
    if(null != recyclerView){
    switch (ev.getAction()) {
    case MotionEvent.ACTION_DOWN:
    startX = (int) ev.getX();
    startY = (int) ev.getY();
    getParent().requestDisallowInterceptTouchEvent(true);
    break;
    case MotionEvent.ACTION_MOVE:
    int endX = (int) ev.getX();
    //第一种方法
    // int endY = (int) ev.getY();
    // int disX = Math.abs(endX - startX);
    // int disY = Math.abs(endY - startY);
    // if(disX > disY){
    // getParent().requestDisallowInterceptTouchEvent(canScrollHorizontally(startX -endX));
    // }else {
    // getParent().requestDisallowInterceptTouchEvent(canScrollVertically(startY -endY));
    // }

    //第二种方法
    if(endX>startX){ //表示向左滑动
    isVisTop(recyclerView);
    }else if(endX<startX){//向右滑动
    isVisBottom(recyclerView);
    }
    break;
    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_CANCEL:
    getParent().requestDisallowInterceptTouchEvent(false);
    break;
    }
    return super.onInterceptTouchEvent(ev);
    }else{
    return super.onInterceptTouchEvent(ev);
    }
    }

    public static boolean isVisBottom(RecyclerView recyclerView){
    LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
    //屏幕中最后一个可见子项的position
    int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();
    //当前屏幕所看到的子项个数
    int visibleItemCount = layoutManager.getChildCount();
    //当前RecyclerView的所有子项个数
    int totalItemCount = layoutManager.getItemCount();
    //RecyclerView的滑动状态
    int state = recyclerView.getScrollState();
    if(visibleItemCount > 0 && lastVisibleItemPosition == totalItemCount - 1 ){
    return true;
    }else {
    return false;
    }
    }
    public static boolean isVisTop(RecyclerView recyclerView){
    LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
    //屏幕中最后一个可见子项的position
    int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();
    //当前屏幕所看到的子项个数
    int visibleItemCount = layoutManager.getChildCount();
    //当前RecyclerView的所有子项个数
    int totalItemCount = layoutManager.getItemCount();
    //RecyclerView的滑动状态
    int state = recyclerView.getScrollState();
    if(visibleItemCount > 0 && lastVisibleItemPosition <visibleItemCount){
    return true;
    }else {
    return false;
    }
    }
    }

    重新viewPager拦截器onInterceptTouchEvent方法,如上面所示,滑动最左边或者最右边的时候就返回true拦截监听,交给viewPager自己处理,如果不是那就返回false,向下传递


  • 相关阅读:
    SQL Pass北京举办第11次线下活动,欢迎报名(本次活动特别邀请了来自微软总部Xin Jin博士)
    【转】go中struct初始化的3种方式
    ubuntu网络的nameserver配置
    【转】路由器LAN口IP地址到底是什么?
    SSH -R 反向端口转发---通过一台阿里云的服务器来访问公司内部网络种的电脑
    ubuntu桌面系统rdesktop远程到win10报错
    非正常退出网页
    【转】xargs命令
    shell 管道符| 后面的xargs 一次执行多条命令,用xargs获取到的参数
    【转】做一名合格的程序员(learning of a previous team)
  • 原文地址:https://www.cnblogs.com/xiaoxiaing/p/11982760.html
Copyright © 2011-2022 走看看