android – GestureDetector 實現介面左右滑動效果的最佳化

來源:互聯網
上載者:User

首先上:

為了我表述方便,我將的顯示地區進行標識,如:

中的左右箭頭表示使用者手勢的方向和位置,當我們在View1的箭頭位置進行手勢時可以實現左右滑動的介面轉場效果,但是在View2的箭頭位置進行手勢時無法被識別到,如果在View1中還有其它的控制項,如按鈕,也同樣會出現這樣的問題,為什嗎?怎麼解決?

其實原因也很簡單,大家也可以猜得到,就是,View2中的TextView控制項將Touch訊息處理了,或者說TextView控制項沒有響應左右滑動的手勢。

在網上也有相關的資料和文章來說明上面的問題怎麼解決,在這裡給大家分享一下我的解決方案。

我們要在中實現左右滑動的介面轉場效果,那麼我們就要增加一下GestureDetector來檢測用的手勢,如下代碼:

方法1:

GestureDetector gesture_detector = null;gesture_detector = new GestureDetector(this,new MyGestureListener());

或者使用下面的代碼:

方法2:

gesture_detector = new GestureDetector(this);

個人比較喜歡使用方法1,那麼方法1就要實現MyGestureListener()的手勢監聽函數,代碼如下:

    class MyGestureListener implements View.OnTouchListener,OnGestureListener     {                //@Override        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {                                //在這裡,可以判斷左右手勢,或者增加自己的手勢判斷                //同時,在這裡增加相應的手勢處理函數來完成相應的介面轉場效果if(e1.getX() - e2.getX() > 100 && Math.abs(velocityX) > 50 ){          //animShowNextPage();}else if(e2.getX() - e1.getX() > 100 && Math.abs(velocityX) > 50 ){          //animShowPrePage();}          return false;        }//@Override               public boolean onDown(MotionEvent e)    {           return false;    }        //@Override    public void onLongPress(MotionEvent e)    {        }    //@Override    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,    float distanceY)    {    return false;    }    public void onShowPress(MotionEvent e)    {    }    public boolean onSingleTapUp(MotionEvent e)    {    return false;    }    public boolean onTouch(View v, MotionEvent event)    {                        //這裡面第一個參數v,就是使用者單擊的那個view,             //在本例中就是那View2中的TextView             //同時,你也可以使用這個參數來判定使用者單擊了哪一個View                if(event.getAction() == MotionEvent.ACTION_DOWN)            {  //如有需要,可以在這樣增加相關的代碼進行處理            }            else if(event.getAction() == MotionEvent.ACTION_UP)            {                        }                               gesture_detector.onTouchEvent(event);        return false;    }        }    

代碼中有相關的注釋,這裡不在多 說,需要說明一點的是,在該手勢監聽的類中多增加了onTouch的事件,這是因為在類的implements中增加了View.OnTouchListener,增加這個也是為了讓TextView可以使用這個監聽函數,同時其它的View也可以使用這個監聽函數。

然後,在Activity中增加下面的代碼:

    @Override    public boolean onTouchEvent(MotionEvent me){    return gesture_detector.onTouchEvent(me);    }  

此時,我們在View1的箭頭位置進行手勢時就可以實現左右滑動的介面轉場效果了。

另外,還需要在onCreate的函數中為View2中的TextView增加事件監聽函數,代碼如下:

TextView txtview = (TextView)findViewById(R.id.content_view);txtview.setText(getShowText());txtview.setOnTouchListener(new MyGestureListener());  

如果在View1中還有其它的View的話,使用上面的方法為該View增加事件的監聽函數即可。

如果你在上面使用方法2建立GestureDetector的話,那麼你就可以使用下面的代碼設定View的監聽函數:

TextView txtview = (TextView)findViewById(R.id.content_view);txtview.setOnTouchListener(this);  

到此,問題就已經解決了。

小結一下:出現該問題的原因是,沒有為TextView增加手勢監聽的函數,解決方案就為View1地區中的每一個View都增加手勢監聽的函數即可。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.