android 滑動翻頁手勢實現

jopen 12年前發布 | 67K 次閱讀 Android Android開發 移動開發

  這個例子是用手勢實現翻頁效果,相當酷,個人覺得比gallery漂亮,可以用于廣告場合。思路:把Activity的TouchEvent交給GestureDetector處理。

這個程序使用了ViewFlipper組件,其實這個組件就是容器組件,可以調用addView(View v)添加多個組件,然后就可以用ViewFlipper使用動畫控制多個組件之間的切換效果

首先第一步是布局main.xml文件

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

第二步:添加照片和在res文件夾下建立一個anim文件,里面放四個動畫xml文件,分別為left_in.xml,left_out.xml,right_in.xml.right_out.xml

<?xml version="1.0" encoding="utf-8"?>
 <!-- 左邊的進來left_in -->
 <set
     xmlns:android="http://schemas.android.com/apk/res/android">
     <translate
         android:fromXDelta="100%p"
         android:toXDelta="0"
         android:duration="500" />
     <alpha
         android:fromAlpha="0.0"
         android:toAlpha="1.0"
         android:duration="500" />
 </set>  


 <?xml version="1.0" encoding="utf-8"?>
 <!-- 左邊的出去left_out -->
 <set
     xmlns:android="http://schemas.android.com/apk/res/android">
     <translate
         android:fromXDelta="0"
         android:toXDelta="-100%p"
         android:duration="500" />
     <alpha
         android:fromAlpha="1.0"
         android:toAlpha="0.0"
         android:duration="500" />
 </set>  

 <?xml version="1.0" encoding="utf-8"?>
 <!-- 右邊的出去left_in -->
 <set
     xmlns:android="http://schemas.android.com/apk/res/android">
     <translate
         android:fromXDelta="-100%p"
         android:toXDelta="0"
         android:duration="500" />
     <alpha
         android:fromAlpha="0.0"
         android:toAlpha="1.0"
         android:duration="500" />
 </set>  

 <?xml version="1.0" encoding="utf-8"?>
 <!-- 右邊的出去left_out -->
 <set
     xmlns:android="http://schemas.android.com/apk/res/android">
     <translate
         android:fromXDelta="0"
         android:toXDelta="100%p"
         android:duration="500" />
     <alpha
         android:fromAlpha="1.0"
         android:toAlpha="0.0"
         android:duration="500" />
 </set>

第三步:編寫GestureActivity.java文件

package cn.shaoyangjiang.com;

 import android.app.Activity;
 import android.os.Bundle;
 import android.view.GestureDetector;
 import android.view.GestureDetector.OnGestureListener;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.animation.Animation;
 import android.view.animation.AnimationUtils;
 import android.widget.ImageView;
 import android.widget.ViewFlipper;

 public class GestureActivity extends Activity implements OnGestureListener{
     // ViewFlipper實例
     ViewFlipper flipper;
     // 定義手勢檢測器實例
     GestureDetector detector;
     //定義一個動畫數組,用于為ViewFlipper指定切換動畫效果
     Animation[] animations = new Animation[4];
     //定義手勢動作兩點之間的最小距離
     final int FLIP_DISTANCE = 50;
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
         //創建手勢檢測器
         detector = new GestureDetector(this);
      // 獲得ViewFlipper實例
         flipper = (ViewFlipper)findViewById(R.id.flipper);
      // 為ViewFlipper添加5個ImageView組件
         flipper.addView(addImageView(R.drawable.katong));
         flipper.addView(addImageView(R.drawable.meinv));
         flipper.addView(addImageView(R.drawable.shan));
         flipper.addView(addImageView(R.drawable.tian));
         flipper.addView(addImageView(R.drawable.touming));
         //初始化Animation數組
         animations[0] = AnimationUtils.loadAnimation(this,R.anim.left_in);
         animations[1] = AnimationUtils.loadAnimation(this,R.anim.left_out);
         animations[2] = AnimationUtils.loadAnimation(this,R.anim.right_in);
         animations[3] = AnimationUtils.loadAnimation(this,R.anim.right_in);

     }
     // 定義添加ImageView的工具方法
     private View addImageView(int resId){
         ImageView imageView = new ImageView(this);
         imageView.setImageResource(resId);
         imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
         return imageView;
     }

     @Override
     public boolean onDown(MotionEvent arg0) {
         // TODO Auto-generated method stub
         return false;
     }
     @Override
     public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX,
             float velocityY) {
         /*
          * 如果第一個觸點事件的X座標大于第二個觸點事件的X座標超過FLIP_DISTANCE
          * 也就是手勢從右向左滑。
 */
         if (event1.getX() - event2.getX() > FLIP_DISTANCE)
         {
             // 為flipper設置切換的的動畫效果
             flipper.setInAnimation(animations[0]);
             flipper.setOutAnimation(animations[1]);
             flipper.showPrevious();
             return true;
         }
         /*
          * 如果第二個觸點事件的X座標大于第一個觸點事件的X座標超過FLIP_DISTANCE 
          * 也就是手勢從右向左滑。
 */
         else if (event2.getX() - event1.getX() > FLIP_DISTANCE)
         {
             // 為flipper設置切換的的動畫效果
             flipper.setInAnimation(animations[2]);
             flipper.setOutAnimation(animations[3]);
             flipper.showNext();
             return true;
         }
         return false;
     }
     @Override
     public void onLongPress(MotionEvent event) {

     }
     @Override
     public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,
             float arg3) {
         return false;
     }
     @Override
     public void onShowPress(MotionEvent arg0) {

     }
     @Override
     public boolean onSingleTapUp(MotionEvent event) {
         return false;
     }

     @Override
     public boolean onTouchEvent(MotionEvent event) {
         //將該Activity上的觸碰事件交給GestureDetector處理
         return detector.onTouchEvent(event);
     }
 }

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!