ViewFlipper

来源:互联网 发布:qmask口罩知乎 编辑:程序博客网 时间:2024/06/06 09:05

   安装APP后,首次进入时,经常看到几个页面的关于本应用的使用介绍,可通过点击上边的按钮和手势实现滑动,到最后页面时进入应用。这种效果的实现可以使用ViewFlipper。


ViewFlipper是间接继承自FrameLayout的。

     android.widget.ViewAnimator类继承至FrameLayout,ViewAnimator类的作用是为FrameLayout里面的View切换提供动画效果。一般不直接使用ViewAnimator而是使用它的两个子类ViewFlipper和ViewSwitcher。

     ViewFlipper可以用来指定FrameLayout内多个View之间的切换效果(可以指定切换动画,切换的间隔等),可以一次性指定效果,也可以在每一个切换时指定切换效果。

      ViewSwitcher顾名思义Switcher特指在两个View之间切换。可以通过该类指定一个ViewSwitcher.ViewFactory工程类来创建这两个View。该类也具有两个子类ImageSwitcher、TextSwitcher分别用于图片和文本切换。


常用的函数:

  • isFlipping: 用来判断View切换是否正在进行。
  • setFilpInterval:设置View之间切换的时间间隔。
  • startFlipping:使用上面设置的时间间隔来开始切换所有的View,切换会循环进行。
  • stopFlipping: 停止View切换。
  •  setOutAnimation:设置View退出屏幕时候使用的动画。
  • setInAnimation:设置View进入屏幕时候使用的动画。
  • showNext: 调用该函数来显示FrameLayout里面的下一个View。
  • showPrevious:调用该函数来显示FrameLayout里面的上一个View。


下面开始介绍ViewFlipper具体的使用方法。

1.layout

在布局中使用了三个ViewGroup,每个ViewGroup中包含了一个ImageView和一个Button,其实就是这三个View之间的屏幕的切换


[java] view plaincopy
  1. <span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?>  
  2. <ViewFlipper  xmlns:android="http://schemas.android.com/apk/res/android"  
  3.        android:id="@+id/flipper"   
  4.        android:layout_width="fill_parent"     
  5.        android:layout_height="fill_parent" >  
  6.        <FrameLayout  
  7.            android:layout_width="fill_parent"  
  8.            android:layout_height="fill_parent">  
  9.             
  10.            <ImageView    
  11.               android:id="@+id/image1"     
  12.               android:src="@drawable/pic1"   
  13.               android:layout_width="fill_parent"   
  14.               android:layout_height="fill_parent"  
  15.             >    
  16.            </ImageView>   
  17.             <Button    
  18.               android:text="Next"     
  19.               android:id="@+id/Button_next1"   
  20.               android:layout_width="wrap_content"     
  21.               android:layout_height="wrap_content"  
  22.               android:layout_gravity="bottom|right"  
  23.               >    
  24.            </Button>     
  25.        </FrameLayout>  
  26.        <FrameLayout  
  27.            android:layout_width="fill_parent"  
  28.            android:layout_height="fill_parent">  
  29.            
  30.            <ImageView    
  31.               android:id="@+id/image2"     
  32.               android:src="@drawable/pic2"   
  33.               android:layout_width="fill_parent"   
  34.               android:layout_height="wrap_content">    
  35.            </ImageView>   
  36.              
  37.            <Button    
  38.               android:text="Next"     
  39.               android:id="@+id/Button_next2"   
  40.               android:layout_width="wrap_content"     
  41.               android:layout_height="wrap_content"  
  42.                android:layout_gravity="bottom|right"  
  43.               >    
  44.            </Button>     
  45.        </FrameLayout>  
  46.        <FrameLayout  
  47.            android:layout_width="fill_parent"  
  48.            android:layout_height="fill_parent">  
  49.            
  50.            <ImageView    
  51.               android:id="@+id/image3"     
  52.               android:src="@drawable/pic3"   
  53.               android:layout_width="fill_parent"   
  54.               android:layout_height="wrap_content">    
  55.            </ImageView>  
  56.              
  57.             <Button    
  58.               android:text="Next"     
  59.               android:id="@+id/Button_next3"   
  60.               android:layout_width="wrap_content"     
  61.               android:layout_height="wrap_content"  
  62.               android:layout_gravity="bottom|right">    
  63.            </Button>      
  64.        </FrameLayout>  
  65. </ViewFlipper></span>  

2.Activity中的代码

以下代码中一种是通过监听按钮的点击,点击后进行屏幕的切换
还有一种方法是通过GestureDetector来监听手势,通过手势的左右滑动就能进行屏幕的切换。
android.view.GestureDetector类可以检测各种手势事件,该类有两个回调接口分别用来通知具体的事件:
      GestureDetector.OnDoubleTapListener:用来通知DoubleTap事件,类似于鼠标的双击事件,该接口有如下三个回调函数:
    1.  onDoubleTap(MotionEvent e):通知DoubleTap手势,
    2.  onDoubleTapEvent(MotionEvente):通知DoubleTap手势中的事件,包含down、up和move事件(这里指的是在双击之间发生的事件,例如在同一个地方双击会产生DoubleTap手势,而在DoubleTap手势里面还会发生down和up事件,这两个事件由该函数通知);
   3.  onSingleTapConfirmed(MotionEvente):用来判定该次点击是SingleTap而不是DoubleTap,如果连续点击两次就是DoubleTap手势,如果只点击一次,系统等待一段时间后没有收到第二次点击则判定该次点击为SingleTap而不是DoubleTap,然后触发SingleTapConfirmed事件。 

  GestureDetector.OnGestureListener:用来通知普通的手势事件,该接口有如下六个回调函数:
     1.  onDown(MotionEvent e):down事件;
     2.  onSingleTapUp(MotionEvent e):一次点击up事件;
     3.  onShowPress(MotionEvente):down事件发生而move或则up还没发生前触发该事件;
     4.  onLongPress(MotionEvent e):长按事件;
     5.  onFling(MotionEvent e1, MotionEvent e2, float velocityX, floatvelocityY):滑动手势事件;
     6.  onScroll(MotionEvent e1, MotionEvent e2, float distanceX, floatdistanceY):在屏幕上拖动事件。
 
在onCreate函数中初始化时
mGestureDetector= newGestureDetector(this); 参数是OnGestureListener,然后让ViewSliperTestActivity实现 OnGestureListener和OnDoubleTapListener接口即可。

我们在onFling回调中实现切换  

@Override  
   public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 

  {        

    // TODO Auto-generated method stub        

    if(e1.getX()-e2.getX()>120)        

   {    //从右向左滑动时            

      mViewFlipper.showNext();       
      return true;        

   }         

     else if(e1.getX()-e2.getX()<120)        

     {            

       mViewFlipper.showPrevious();            
      return true;        

    }         

   return false;    

}

注意重写下面的方法,否则onFling等接口不会有响应的。

  @Override     

public boolean onTouchEvent(MotionEvent event)

{    
     // TODO Auto-generated method stub        

    return mGestureDetector.onTouchEvent(event);    




[java] view plaincopy
  1. <span style="font-size:18px;">package com.liupan.viewslip;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.SharedPreferences;  
  5. import android.os.Bundle;  
  6. import android.util.Log;  
  7. import android.view.GestureDetector;  
  8. import android.view.GestureDetector.OnDoubleTapListener;  
  9. import android.view.GestureDetector.OnGestureListener;  
  10. import android.view.MotionEvent;  
  11. import android.view.View;  
  12. import android.view.animation.AnimationUtils;  
  13. import android.widget.Button;  
  14. import android.widget.Toast;  
  15. import android.widget.ViewFlipper;  
  16.   
  17. public class ViewSliperTestActivity extends Activity implements  OnGestureListener,OnDoubleTapListener{  
  18.     /** Called when the activity is first created. */  
  19.     ViewFlipper mViewFlipper;  
  20.     private GestureDetector mGestureDetector;  
  21.     @Override  
  22.     public void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         setContentView(R.layout.main);  
  25.       
  26.         mGestureDetector = new GestureDetector(this);  
  27.         Button buttonNext1 = (Button) findViewById(R.id.Button_next1);     
  28.         mViewFlipper = (ViewFlipper) findViewById(R.id.flipper);     
  29.         buttonNext1.setOnClickListener(new View.OnClickListener() {     
  30.             public void onClick(View view) {     
  31.              //可以在layout中定义相应的属性,也可以在代码中指定    
  32.               //设置滑入动画   
  33.              mViewFlipper.setInAnimation(getApplicationContext(), R.anim.push_left_in);   
  34. <span></span></span><pre name="code" class="java"><span style="font-size:18px;">               //设置滑出动画     
  35.              mViewFlipper.setOutAnimation(getApplicationContext(), R.anim.push_left_out);    
  36.                 //设置需要保存缓存  
  37.              mViewFlipper.setPersistentDrawingCache(ViewGroup.PERSISTENT_ALL_CACHES);  
  38.                 //设置切换间隔  
  39.              mViewFlipper.setFlipInterval(1000);    
  40.              // 显示下一个View  
  41.                 mViewFlipper.showNext();     
  42. //                mViewFlipper.showPrevious();// 显示上一个View<span></span><span></span>  
  43.                 //循环显示mViewFlipper内的所有View。     
  44. //             mViewFlipper.startFlipping();     
  45.         }     
  46.         });     
  47.       
  48.         Button buttonNext2 = (Button) findViewById(R.id.Button_next2);     
  49.         buttonNext2.setOnClickListener(new View.OnClickListener() {     
  50.             public void onClick(View view) {     
  51.                 mViewFlipper.showNext();     
  52.         }     
  53.       
  54.         });        
  55.         Button buttonNext3 = (Button) findViewById(R.id.Button_next3);     
  56.         buttonNext3.setOnClickListener(new View.OnClickListener() {     
  57.             public void onClick(View view) {     
  58.                 mViewFlipper.showNext();     
  59.         }     
  60.       
  61.         });     
  62.     }  
  63.     @Override  
  64.     public boolean onDown(MotionEvent e) {  
  65.         // TODO Auto-generated method stub  
  66.         return false;  
  67.     }  
  68.     @Override  
  69.     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,  
  70.             float velocityY) {  
  71.         // TODO Auto-generated method stub  
  72.         if(e1.getX()-e2.getX()>120)  
  73.         {  
  74.         //从右向左滑动时  
  75.             mViewFlipper.showNext();  
  76.             return true;  
  77.         }  
  78.         else if(e1.getX()-e2.getX()<120)  
  79.         {  
  80.             mViewFlipper.showPrevious();  
  81.             return true;  
  82.         }  
  83.         return false;  
  84.     }  
  85.     @Override  
  86.     public void onLongPress(MotionEvent e) {  
  87.         // TODO Auto-generated method stub  
  88.           
  89.     }  
  90.     @Override  
  91.     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,  
  92.             float distanceY) {  
  93.         // TODO Auto-generated method stub  
  94.         return false;  
  95.     }  
  96.     @Override  
  97.     public void onShowPress(MotionEvent e) {  
  98.         // TODO Auto-generated method stub  
  99.           
  100.     }  
  101.     @Override  
  102.     public boolean onSingleTapUp(MotionEvent e) {  
  103.         // TODO Auto-generated method stub  
  104.         return false;  
  105.     }  
  106.     @Override  
  107.     public boolean onDoubleTap(MotionEvent e) {  
  108.         // TODO Auto-generated method stub  
  109.         if(mViewFlipper.isFlipping())  
  110.         {  
  111.             mViewFlipper.stopFlipping();  
  112.             return true;  
  113.         }  
  114.         else if(!mViewFlipper.isFlipping())  
  115.         {  
  116.             mViewFlipper.startFlipping();  
  117.             return true;  
  118.         }  
  119.         return false;  
  120.     }  
  121.     @Override  
  122.     public boolean onDoubleTapEvent(MotionEvent e) {  
  123.         // TODO Auto-generated method stub  
  124.         return false;  
  125.     }  
  126.     @Override  
  127.     public boolean onSingleTapConfirmed(MotionEvent e) {  
  128.         // TODO Auto-generated method stub  
  129.         return false;  
  130.     }  
  131.     //重写本方法,否则GestureDetector检测不到触摸  
  132.     @Override  
  133.     public boolean onTouchEvent(MotionEvent event) {  
  134.         // TODO Auto-generated method stub  
  135.         return mGestureDetector.onTouchEvent(event);  
  136.     }  
  137. </span></pre><span style="font-size:18px">} <br>  
  138. </span>  
  139. <pre></pre>  
0 0
原创粉丝点击