歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android手勢識別ViewFlipper觸摸動畫

最近項目中用到了ViewFlipper這個類,感覺效果真的很炫,今天自己也試著做了下,確實還不錯。

首先在layout下定義viewflipper.xml        

[html]
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <ViewFlipper  
  8.         android:id="@+id/viewFlipper1"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="fill_parent" >  
  11.   
  12.         <ImageView  
  13.             android:id="@+id/imageView1"  
  14.             android:layout_width="fill_parent"  
  15.             android:layout_height="fill_parent"  
  16.             android:src="@drawable/b" />  
  17.          <ImageView  
  18.             android:id="@+id/imageView2"  
  19.             android:layout_width="fill_parent"  
  20.             android:layout_height="fill_parent"  
  21.             android:src="@drawable/c" />  
  22.           <ImageView  
  23.             android:id="@+id/imageView3"  
  24.             android:layout_width="fill_parent"  
  25.             android:layout_height="fill_parent"  
  26.             android:src="@drawable/d" />  
  27.           <ImageView  
  28.             android:id="@+id/imageView4"  
  29.             android:layout_width="fill_parent"  
  30.             android:layout_height="fill_parent"  
  31.             android:src="@drawable/f" />  
  32.          <ImageView  
  33.             android:id="@+id/imageView5"  
  34.             android:layout_width="fill_parent"  
  35.             android:layout_height="fill_parent"  
  36.             android:src="@drawable/g" />  
  37.     </ViewFlipper>  
  38.   
  39. </LinearLayout>  
ViewFlipper中包含了5張圖片  用來手勢切換。

[html]

  1. public class ViewFlipperActivity extends Activity implements OnTouchListener, android.view.GestureDetector.OnGestureListener {  
  2.     private ViewFlipper flipper;  
  3.     GestureDetector mGestureDetector;    
  4.     private int mCurrentLayoutState;    
  5.     private static final int FLING_MIN_DISTANCE = 80;    
  6.     private static final int FLING_MIN_VELOCITY = 150;    
  7.     @Override  
  8.     protected void onCreate(Bundle savedInstanceState) {  
  9.         // TODO Auto-generated method stub  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(R.layout.viewflipper);  
  12.           
  13.         flipper=(ViewFlipper) this.findViewById(R.id.viewFlipper1);  
  14.          //注冊一個用於手勢識別的類    
  15.         mGestureDetector = new GestureDetector(this);    
  16.         //給mFlipper設置一個listener    
  17.         flipper.setOnTouchListener(this);    
  18.         mCurrentLayoutState = 0;    
  19.         //允許長按住ViewFlipper,這樣才能識別拖動等手勢    
  20.         flipper.setLongClickable(true);    
  21.           
  22.     }  
  23.     /**    
  24.      * 此方法在本例中未用到,可以指定跳轉到某個頁面    
  25.      * @param switchTo    
  26.      */    
  27.     public void switchLayoutStateTo(int switchTo) {    
  28.         while (mCurrentLayoutState != switchTo)   {    
  29.             if (mCurrentLayoutState > switchTo) {    
  30.                 mCurrentLayoutState--;    
  31.                 flipper.setInAnimation(inFromLeftAnimation());    
  32.                 flipper.setOutAnimation(outToRightAnimation());    
  33.                 flipper.showPrevious();    
  34.             } else {    
  35.                 mCurrentLayoutState++;    
  36.                 flipper.setInAnimation(inFromRightAnimation());    
  37.                 flipper.setOutAnimation(outToLeftAnimation());    
  38.                 flipper.showNext();    
  39.             }    
  40.      
  41.         }    
  42.    
  43.     }   
  44.     /**    
  45.      * 定義從右側進入的動畫效果    
  46.      * @return    
  47.      */    
  48.     protected Animation inFromRightAnimation() {    
  49.         Animation inFromRight = new TranslateAnimation(    
  50.                 Animation.RELATIVE_TO_PARENT, +1.0f,    
  51.                 Animation.RELATIVE_TO_PARENT, 0.0f,    
  52.                 Animation.RELATIVE_TO_PARENT, 0.0f,    
  53.                 Animation.RELATIVE_TO_PARENT, 0.0f);    
  54.         inFromRight.setDuration(200);    
  55.         inFromRight.setInterpolator(new AccelerateInterpolator());    
  56.         return inFromRight;    
  57.     }    
  58.      
  59.     /**    
  60.      * 定義從左側退出的動畫效果    
  61.      * @return    
  62.      */    
  63.     protected Animation outToLeftAnimation() {    
  64.         Animation outtoLeft = new TranslateAnimation(    
  65.                 Animation.RELATIVE_TO_PARENT, 0.0f,    
  66.                 Animation.RELATIVE_TO_PARENT, -1.0f,    
  67.                 Animation.RELATIVE_TO_PARENT, 0.0f,    
  68.                 Animation.RELATIVE_TO_PARENT, 0.0f);    
  69.         outtoLeft.setDuration(200);    
  70.         outtoLeft.setInterpolator(new AccelerateInterpolator());    
  71.         return outtoLeft;    
  72.     }    
  73.      
  74.     /**    
  75.      * 定義從左側進入的動畫效果    
  76.      * @return    
  77.      */    
  78.     protected Animation inFromLeftAnimation() {    
  79.         Animation inFromLeft = new TranslateAnimation(    
  80.                 Animation.RELATIVE_TO_PARENT, -1.0f,    
  81.                 Animation.RELATIVE_TO_PARENT, 0.0f,    
  82.                 Animation.RELATIVE_TO_PARENT, 0.0f,    
  83.                 Animation.RELATIVE_TO_PARENT, 0.0f);    
  84.         inFromLeft.setDuration(200);    
  85.         inFromLeft.setInterpolator(new AccelerateInterpolator());    
  86.         return inFromLeft;    
  87.     }    
  88.       
  89.     /**    
  90.      * 定義從右側退出時的動畫效果    
  91.      * @return    
  92.      */    
  93.     protected Animation outToRightAnimation() {    
  94.         Animation outtoRight = new TranslateAnimation(    
  95.                 Animation.RELATIVE_TO_PARENT, 0.0f,    
  96.                 Animation.RELATIVE_TO_PARENT, +1.0f,    
  97.                 Animation.RELATIVE_TO_PARENT, 0.0f,    
  98.                 Animation.RELATIVE_TO_PARENT, 0.0f);    
  99.         outtoRight.setDuration(200);    
  100.         outtoRight.setInterpolator(new AccelerateInterpolator());    
  101.         return outtoRight;    
  102.     }    
  103.       
  104.     public boolean onDown(MotionEvent e) {  
  105.         // TODO Auto-generated method stub  
  106.         return false;  
  107.     }  
  108.     /*    
  109.      * 用戶按下觸摸屏、快速移動後松開即觸發這個事件    
  110.      * e1:第1個ACTION_DOWN MotionEvent    
  111.      * e2:最後一個ACTION_MOVE MotionEvent    
  112.      * velocityX:X軸上的移動速度,像素/秒    
  113.      * velocityY:Y軸上的移動速度,像素/秒    
  114.      * 觸發條件 :    
  115.      * X軸的坐標位移大於FLING_MIN_DISTANCE,且移動速度大於FLING_MIN_VELOCITY個像素/秒    
  116.      */  
  117.     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,  
  118.             float velocityY) {  
  119.          if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE    
  120.                     && Math.abs(velocityX) > FLING_MIN_VELOCITY) {    
  121.                 // 當像左側滑動的時候    
  122.                 //設置View進入屏幕時候使用的動畫    
  123.                 flipper.setInAnimation(inFromRightAnimation());    
  124.                 //設置View退出屏幕時候使用的動畫    
  125.                 flipper.setOutAnimation(outToLeftAnimation());    
  126.                 flipper.showNext();    
  127.             } else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE    
  128.                     && Math.abs(velocityX) > FLING_MIN_VELOCITY) {    
  129.                 // 當像右側滑動的時候    
  130.                 flipper.setInAnimation(inFromLeftAnimation());    
  131.                 flipper.setOutAnimation(outToRightAnimation());    
  132.                 flipper.showPrevious();    
  133.             }    
  134.             return false;    
  135.     }  
  136.     public void onLongPress(MotionEvent e) {  
  137.         // TODO Auto-generated method stub  
  138.           
  139.     }  
  140.     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,  
  141.             float distanceY) {  
  142.         // TODO Auto-generated method stub  
  143.         return false;  
  144.     }  
  145.     public void onShowPress(MotionEvent e) {  
  146.         // TODO Auto-generated method stub  
  147.           
  148.     }  
  149.     public boolean onSingleTapUp(MotionEvent e) {  
  150.         // TODO Auto-generated method stub  
  151.         return false;  
  152.     }  
  153.     public boolean onTouch(View v, MotionEvent event) {  
  154.         // TODO Auto-generated method stub  
  155.           // 一定要將觸屏事件交給手勢識別類去處理(自己處理會很麻煩的)    
  156.         return mGestureDetector.onTouchEvent(event);    
  157.     }  
  158.       
  159.       
  160. }  
這樣就OK了 看下效果

因為是手勢識別效果不太好演示,所以大家自己實現了以後就可以看到效果啦!

Copyright © Linux教程網 All Rights Reserved