ViewFlipper

         安装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之间的屏幕的切换


<?xml version="1.0" encoding="utf-8"?>
<ViewFlipper  xmlns:android="http://schemas.android.com/apk/res/android"
       android:id="@+id/flipper" 
       android:layout_width="fill_parent"   
       android:layout_height="fill_parent" >
       <FrameLayout
           android:layout_width="fill_parent"
           android:layout_height="fill_parent">
          
           <ImageView  
              android:id="@+id/image1"   
              android:src="@drawable/pic1" 
              android:layout_width="fill_parent" 
              android:layout_height="fill_parent"
            >  
           </ImageView> 
            <Button  
              android:text="Next"   
              android:id="@+id/Button_next1" 
              android:layout_width="wrap_content"   
              android:layout_height="wrap_content"
              android:layout_gravity="bottom|right"
              >  
           </Button>   
       </FrameLayout>
       <FrameLayout
           android:layout_width="fill_parent"
           android:layout_height="fill_parent">
         
           <ImageView  
              android:id="@+id/image2"   
              android:src="@drawable/pic2" 
              android:layout_width="fill_parent" 
              android:layout_height="wrap_content">  
           </ImageView> 
           
           <Button  
              android:text="Next"   
              android:id="@+id/Button_next2" 
              android:layout_width="wrap_content"   
              android:layout_height="wrap_content"
               android:layout_gravity="bottom|right"
              >  
           </Button>   
       </FrameLayout>
       <FrameLayout
           android:layout_width="fill_parent"
           android:layout_height="fill_parent">
         
           <ImageView  
              android:id="@+id/image3"   
              android:src="@drawable/pic3" 
              android:layout_width="fill_parent" 
              android:layout_height="wrap_content">  
           </ImageView>
           
            <Button  
              android:text="Next"   
              android:id="@+id/Button_next3" 
              android:layout_width="wrap_content"   
              android:layout_height="wrap_content"
              android:layout_gravity="bottom|right">  
           </Button>    
       </FrameLayout>
</ViewFlipper>

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);   

}


package com.liupan.viewslip;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.OnDoubleTapListener;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.Toast;
import android.widget.ViewFlipper;

public class ViewSliperTestActivity extends Activity implements  OnGestureListener,OnDoubleTapListener{
    /** Called when the activity is first created. */
    ViewFlipper mViewFlipper;
    private GestureDetector mGestureDetector;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        mGestureDetector = new GestureDetector(this);
        Button buttonNext1 = (Button) findViewById(R.id.Button_next1);   
        mViewFlipper = (ViewFlipper) findViewById(R.id.flipper);   
        buttonNext1.setOnClickListener(new View.OnClickListener() {   
            public void onClick(View view) {   
             //可以在layout中定义相应的属性,也可以在代码中指定  
              //设置滑入动画 
             mViewFlipper.setInAnimation(getApplicationContext(), R.anim.push_left_in); 
               //设置滑出动画   
             mViewFlipper.setOutAnimation(getApplicationContext(), R.anim.push_left_out);  
                //设置需要保存缓存
             mViewFlipper.setPersistentDrawingCache(ViewGroup.PERSISTENT_ALL_CACHES);
                //设置切换间隔
             mViewFlipper.setFlipInterval(1000);  
             // 显示下一个View
                mViewFlipper.showNext();   
//                mViewFlipper.showPrevious();// 显示上一个View
                //循环显示mViewFlipper内的所有View。   
//             mViewFlipper.startFlipping();   
        }   
        });   
    
        Button buttonNext2 = (Button) findViewById(R.id.Button_next2);   
        buttonNext2.setOnClickListener(new View.OnClickListener() {   
            public void onClick(View view) {   
                mViewFlipper.showNext();   
        }   
    
        });      
        Button buttonNext3 = (Button) findViewById(R.id.Button_next3);   
        buttonNext3.setOnClickListener(new View.OnClickListener() {   
            public void onClick(View view) {   
                mViewFlipper.showNext();   
        }   
    
        });   
    }
    @Override
    public boolean onDown(MotionEvent e) {
        // TODO Auto-generated method stub
        return false;
    }
    @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;
    }
    @Override
    public void onLongPress(MotionEvent e) {
        // TODO Auto-generated method stub
        
    }
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
            float distanceY) {
        // TODO Auto-generated method stub
        return false;
    }
    @Override
    public void onShowPress(MotionEvent e) {
        // TODO Auto-generated method stub
        
    }
    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        // TODO Auto-generated method stub
        return false;
    }
    @Override
    public boolean onDoubleTap(MotionEvent e) {
        // TODO Auto-generated method stub
        if(mViewFlipper.isFlipping())
        {
            mViewFlipper.stopFlipping();
            return true;
        }
        else if(!mViewFlipper.isFlipping())
        {
            mViewFlipper.startFlipping();
            return true;
        }
        return false;
    }
    @Override
    public boolean onDoubleTapEvent(MotionEvent e) {
        // TODO Auto-generated method stub
        return false;
    }
    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
        // TODO Auto-generated method stub
        return false;
    }
    //重写本方法,否则GestureDetector检测不到触摸
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        return mGestureDetector.onTouchEvent(event);
    }
}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值