【Android】滑動螢幕效果GestureDetector、OnGestureListener、ViewFlipper

來源:互聯網
上載者:User

螢幕切換指的是在同一個Activity內螢幕見的切換。

通過GestureDetector、OnGestureListener實現滑屏事件。ViewFlipper是繼承至FrameLayout的,所以它是一個Layout裡面可以放置多個View。樣本中第一頁僅放了一個按鈕BUTTON,向下滑屏時,每頁都只放了一個TEXTVIEW。

頁面:

<?xml version="1.0" encoding="utf-8"?><br /><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"<br /> android:orientation="vertical"<br /> android:layout_width="fill_parent"<br /> android:layout_height="fill_parent"<br /> ><br /><ViewFlipper android:id="@+id/ViewFlipper01"<br />android:layout_width="fill_parent" android:layout_height="fill_parent"><br /></ViewFlipper><br /></LinearLayout><br /> 

Activity代碼:

package com.yfz;<br />import android.app.Activity;<br />import android.os.Bundle;<br />import android.util.Log;<br />import android.view.GestureDetector;<br />import android.view.MotionEvent;<br />import android.view.View;<br />import android.view.GestureDetector.OnGestureListener;<br />import android.view.ViewGroup.LayoutParams;<br />import android.view.animation.AnimationUtils;<br />import android.widget.Button;<br />import android.widget.ExpandableListView;<br />import android.widget.TextView;<br />import android.widget.ViewFlipper;<br />public class Flip extends Activity implements OnGestureListener {</p><p>private GestureDetector detector;<br />private ViewFlipper flipper;</p><p> /** Called when the activity is first created. */<br /> @Override<br /> public void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);<br /> setContentView(R.layout.main);</p><p> flipper = (ViewFlipper) this.findViewById(R.id.ViewFlipper01);</p><p> flipper.addView(addButtonByText("按鈕"),new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));</p><p> detector = new GestureDetector(this);<br /> }</p><p> public View addButtonByText(String text){<br /> Button btn = new Button(this);<br /> btn.setText(text);<br /> return btn;<br /> }<br /> public View addTextByText(String text){<br /> TextView tv = new TextView(this);<br /> tv.setText(text);<br /> tv.setGravity(1);<br /> return tv;<br /> } </p><p>@Override<br />public boolean onTouchEvent(MotionEvent event) {<br />Log.i("Fling", "Activity onTouchEvent!");<br />return this.detector.onTouchEvent(event);<br />}<br />@Override<br />public boolean onDown(MotionEvent e) {<br />// TODO Auto-generated method stub<br />return false;<br />}</p><p>/**<br /> * 監聽滑動<br /> */<br />@Override<br />public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,<br />float velocityY) {<br />// TODO Auto-generated method stub<br />Log.i("Fling", "Fling Happened!");<br />if (e1.getX() - e2.getX() > 120) {<br />this.flipper.setInAnimation(AnimationUtils.loadAnimation(this,R.anim.push_left_in));<br />this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this,R.anim.push_left_out));<br />this.flipper.addView(addTextByText("文字框"),new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));<br />this.flipper.showNext();<br />return true;<br />} else if (e1.getX() - e2.getX() < -120) {<br />this.flipper.setInAnimation(AnimationUtils.loadAnimation(this,R.anim.push_right_in));<br />this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this,R.anim.push_right_out));<br />this.flipper.showPrevious();<br />return true;<br />}<br />return true;<br />}<br />@Override<br />public void onLongPress(MotionEvent e) {<br />// TODO Auto-generated method stub</p><p>}<br />@Override<br />public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,<br />float distanceY) {<br />// TODO Auto-generated method stub<br />return false;<br />}<br />@Override<br />public void onShowPress(MotionEvent e) {<br />// TODO Auto-generated method stub</p><p>}<br />@Override<br />public boolean onSingleTapUp(MotionEvent e) {<br />// TODO Auto-generated method stub<br />return false;<br />}<br />} 

這裡實現的功能是從右往左滑動則切換到上一個View,從左往右滑動則切換到下一個View,並且使用不同的in、out 動畫使轉場效果看起來統一一些。

滑屏實現:

通過android.view.GestureDetector類可以檢測各種手勢事件,該類有兩個回調介面分別用來通知具體的事件:  GestureDetector.OnDoubleTapListener:用來通知DoubleTap事件,類似於滑鼠的雙擊事件,該介面有如下三個回呼函數: 1.   onDoubleTap(MotionEvent e):通知DoubleTap手勢,2.   onDoubleTapEvent(MotionEvent e):通知DoubleTap手勢中的事件,包含down、up和move事件(這裡指的是在雙擊之間發生的事件,例如在同一個地方雙擊會產生DoubleTap手勢,而在DoubleTap手勢裡面還會發生down和up事件,這兩個事件由該函數通知);3.   onSingleTapConfirmed(MotionEvent e):用來判定該次點擊是SingleTap而不是DoubleTap,如果連續點擊兩次就是DoubleTap手勢,如果只點擊一次,系統等待一段時間後沒有收到第二次點擊則判定該次點擊為SingleTap而不是DoubleTap,然後觸發SingleTapConfirmed事件。 GestureDetector.OnGestureListener:用來通知普通的手勢事件,該介面有如下六個回呼函數:1.   onDown(MotionEvent e):down事件;2.   onSingleTapUp(MotionEvent e):一次點擊up事件;3.   onShowPress(MotionEvent e):down事件發生而move或則up還沒發生前觸發該事件;4.   onLongPress(MotionEvent e):長按事件;5.   onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY):滑動手勢事件;6.   onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY):在螢幕上拖動事件。本次僅用到了 OnGestureListener類中的onFling方法。  其他手勢事件各位可以自己回去實驗。 簡單說明:要實現螢幕切換的話,首先需要定義一個GestureDetector: private GestureDetector mGestureDetector; 並在onCreate函數中初始化:mGestureDetector =  new GestureDetector( this); 同時Activity要繼承OnGestureListener介面,並實現其中的onFling方法。另外Activity的onTouchEvent事件也要實現!!另外本例View切換時還有動畫效果。使用Animation類實現,相關的函數: 
  • setInAnimation:設定View進入螢幕時候使用的動畫,該函數有兩個版本:
一個接受單個參數,類型為android.view.animation.Animation;一個接受兩個參數,類型為Context和int,分別為Context對象和定義Animation的resourceID。
  • setOutAnimation: 設定View退出螢幕時候使用的動畫,參數setInAnimation函數一樣。
  • showNext: 調用該函數來顯示FrameLayout裡面的下一個View。
  • showPrevious: 調用該函數來顯示FrameLayout裡面的上一個View。

動畫源檔案: (在res目錄下,建立一個anim檔案夾,把下面的檔案都放在這裡)

push_left_in.xml

<?xml version="1.0" encoding="utf-8"?><br /><set xmlns:android="http://schemas.android.com/apk/res/android"><br /><translate android:fromXDelta="100%p" android:toXDelta="0"<br />android:duration="500" /><br /><alpha android:fromAlpha="0.1" android:toAlpha="1.0"<br />android:duration="500" /><br /></set> 

push_left_out.xml:

<?xml version="1.0" encoding="utf-8"?><br /><set xmlns:android="http://schemas.android.com/apk/res/android"><br /><translate android:fromXDelta="0" android:toXDelta="-100%p"<br />android:duration="500" /><br /><alpha android:fromAlpha="1.0" android:toAlpha="0.1"<br />android:duration="500" /><br /></set> 

push_right_in.xml:

<?xml version="1.0" encoding="utf-8"?><br /><set xmlns:android="http://schemas.android.com/apk/res/android"><br /><translate android:fromXDelta="-100%p" android:toXDelta="0"<br />android:duration="500" /><br /><alpha android:fromAlpha="0.1" android:toAlpha="1.0"<br />android:duration="500" /><br /></set> 

push_right_out.xml:

<?xml version="1.0" encoding="utf-8"?><br /><set xmlns:android="http://schemas.android.com/apk/res/android"><br /><translate android:fromXDelta="0" android:toXDelta="100%p"<br />android:duration="500" /><br /><alpha android:fromAlpha="1.0" android:toAlpha="0.1"<br />android:duration="500" /><br /></set> 

好了,就寫這麼多。

相關文章

聯繫我們

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