Android 解決ViewPager雙層嵌套的滑動問題

來源:互聯網
上載者:User

標籤:manager   而不是   text   一個   定義   public   log   問題   xtend   

之前在做自己的一個項目的時候,遇到廣告欄圖片動態切換,我第一時間想到的就是ViewPager,整個軟體只有廣告這一部分ViewPager還好說,但是軟體越複雜出現的問題越多,尤其是遇到ViewPager雙層嵌套問題,找了很多資料

解決方案一:自訂ViewPager做為父ViewPager控制項

public class ParentViewPager extends ViewPager{    private int childVPHeight=0;    public ParentViewPager(Context context) {        super(context);        // TODO Auto-generated constructor stub        init(context);    }     public ParentViewPager(Context context, AttributeSet attrs) {        super(context, attrs);        // TODO Auto-generated constructor stub        init(context);    }     private void init(Context context) {        // TODO Auto-generated method stub        // 擷取螢幕寬高        WindowManager windowManager = (WindowManager) context.getSystemService(context.WINDOW_SERVICE);        int disWidth = windowManager.getDefaultDisplay().getWidth();        //根據螢幕的密度來過去dp值相應的px值        childVPHeight=(int) (context.getResources().getDisplayMetrics().density  * disWidth + 0.5f);    }     @Override    public boolean onInterceptTouchEvent(MotionEvent arg0) {        // TODO Auto-generated method stub        //觸摸在子ViewPager所在的頁面和子ViewPager控制項高度之內時        //返回false,此時將會將觸摸的動作傳給子ViewPager        if(getCurrentItem()==1 && arg0.getY()<childVPHeight){            return false;        }        return super.onInterceptTouchEvent(arg0);    }   

此方法雖然簡單可行,但是會出現,子ViewPager如果為ScrollView的時候,子ViewPager雖然已經滑動到看不到的地方,但是設定的高度內還是不能讓父ViewPager左右滑動,onTouch的動作透過了父Viewpager傳遞到了子控制項

解決方案二:自訂Viewpager做為子控制項

public class ChildViewPager extends ViewPager{    /** 觸摸時按下的點 **/    PointF downP = new PointF();    /** 觸摸時當前的點 **/    PointF curP = new PointF();     OnSingleTouchListener onSingleTouchListener;     public ChildViewPager(Context context, AttributeSet attrs) {        super(context, attrs);        // TODO Auto-generated constructor stub    }     public ChildViewPager(Context context) {        super(context);        // TODO Auto-generated constructor stub    }     @Override    public boolean onInterceptTouchEvent(MotionEvent arg0) {        // TODO Auto-generated method stub        //當攔截觸摸事件到達此位置的時候,返回true,        //說明將onTouch攔截在此控制項,進而執行此控制項的onTouchEvent        return true;    }     @Override    public boolean onTouchEvent(MotionEvent arg0) {        // TODO Auto-generated method stub        //每次進行onTouch事件都記錄當前的按下的座標        curP.x = arg0.getX();        curP.y = arg0.getY();         if(arg0.getAction() == MotionEvent.ACTION_DOWN){            //記錄按下時候的座標            //切記不可用 downP = curP ,這樣在改變curP的時候,downP也會改變            downP.x = arg0.getX();            downP.y = arg0.getY();            //此句代碼是為了通知他的父ViewPager現在進行的是本控制項的操作,不要對我的操作進行幹擾            getParent().requestDisallowInterceptTouchEvent(true);        }         if(arg0.getAction() == MotionEvent.ACTION_MOVE){            //此句代碼是為了通知他的父ViewPager現在進行的是本控制項的操作,不要對我的操作進行幹擾            getParent().requestDisallowInterceptTouchEvent(true);        }         if(arg0.getAction() == MotionEvent.ACTION_UP){            //在up時判斷是否按下和鬆手的座標為一個點            //如果是一個點,將執行點擊事件,這是我自己寫的點擊事件,而不是onclick            if(downP.x==curP.x && downP.y==curP.y){                onSingleTouch();                return true;            }        }         return super.onTouchEvent(arg0);    }         /**     * 單擊     */    public void onSingleTouch() {        if (onSingleTouchListener!= null) {             onSingleTouchListener.onSingleTouch();        }    }     /**     * 建立點擊事件介面     * @author wanpg     *     */    public interface OnSingleTouchListener {        public void onSingleTouch();    }     public void setOnSingleTouchListener(OnSingleTouchListener onSingleTouchListener) {        this.onSingleTouchListener = onSingleTouchListener;    } }

為什麼要自己定義onSingleTouch呢?

因為在ViewPager的onTouchEvent中我對onDown進行了操作,進行了操作後就無法將touch事件繼續往下傳給onClick和其內部控制項的任何事件,所以自己做了判斷,做了個singleTouch來實現點擊的事件

方法二可以完美解決雙層ViewPager嵌套後子ViewPager的觸摸滑動問題

Android 解決ViewPager雙層嵌套的滑動問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.