搜索
热搜: 活动 交友 discuz
查看: 4459|回复: 0
打印 上一主题 下一主题

ViewFlipper 和 ViewPager 的区别

[复制链接]

160

主题

165

帖子

814

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
814
跳转到指定楼层
楼主
发表于 2016-8-2 11:12:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ViewFlipper继承ViewAnimator,切换view的时候是有动画效果的,适合做ppt,多界面的程序欢迎引导界面,算是个轻量级的组件,适合展示静态数据,少量数据。



ViewPager继承ViewGroup。看官网描述,这货和Fragment是好搭档,Fragment有自己的生命周期。也就是说ViewPager更适用复杂的视图切换,而且Viewpager有自己的adapter,这也让其适应复杂对象,实现数据的动态加载。

1、ViewFlipper

1)View切换的控件—ViewFlipper介绍

ViewFilpper类继承于ViewAnimator类。而ViewAnimator类继承于FrameLayout。

查看ViewAnimator类的源码可以看出此类的作用主要是为其中的View切换提供动画效果。该类有如下几个和动画相关的方法。

setInAnimation:设置View进入屏幕时候使用的动画。该方法有两个重载方法,即可以直接传入Animation对象,也可以传入定义的Animation文件的resourceID。

setOutAnimation:设置View退出屏幕时候使用的动画。使用方法和setInAnimation方法一样。

showNext:调用该方法可以显示FrameLayout里面的下一个View。

showPrevious:调用该方法可以来显示FrameLayout里面的上一个View。

查看ViewFlipper的源码可以看到,ViewFlipper主要用来实现View的自动切换。该类提供了如下几个主要的方法。

setFilpInterval:设置View切换的时间间隔。参数为毫秒。

startFlipping:开始进行View的切换,时间间隔是上述方法设置的间隔数。切换会循环进行。

stopFlipping:停止View切换。

setAutoStart:设置是否自动开始。如果设置为“true”,当ViewFlipper显示的时候View的切换会自动开始。

一般情况下,我们都会使用ViewFilpper类实现View的切换,而不使用它的父类ViewAnimator类。

2)实现滑动—GestureDetector介绍

如果想要实现滑动翻页的效果,就要了解另外一个类:Android.view.GestureDetector类。GestureDetector类中可以用来检测各种手势事件。该类有两个回调接口,分别用来通知具体的事件。

GestureDetector.OnDoubleTapListener:用来通知DoubleTap事件,类似于PC上面的鼠标的双击事件。

GestureDetector.OnGestureListener:用来通知普通的手势事件,该接口有六个回调方法,具体的可以查看API。这里想要实现滑动的判断,就需要用到其中的onFling()方法。

3)具体的实现

下面的代码片段详细说明了如何实现滑动翻页。


  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.     <ViewFlipper
  7.         android:id="@+id/viewFlipper1"
  8.         android:layout_width="fill_parent"
  9.         android:layout_height="fill_parent" >

  10.         <ImageView
  11.             android:id="@+id/imageView1"
  12.             android:layout_width="fill_parent"
  13.             android:layout_height="fill_parent"
  14.             android:src="@drawable/b" />
  15.          <ImageView
  16.             android:id="@+id/imageView2"
  17.             android:layout_width="fill_parent"
  18.             android:layout_height="fill_parent"
  19.             android:src="@drawable/c" />
  20.           <ImageView
  21.             android:id="@+id/imageView3"
  22.             android:layout_width="fill_parent"
  23.             android:layout_height="fill_parent"
  24.             android:src="@drawable/d" />
  25.           <ImageView
  26.             android:id="@+id/imageView4"
  27.             android:layout_width="fill_parent"
  28.             android:layout_height="fill_parent"
  29.             android:src="@drawable/f" />
  30.          <ImageView
  31.             android:id="@+id/imageView5"
  32.             android:layout_width="fill_parent"
  33.             android:layout_height="fill_parent"
  34.             android:src="@drawable/g" />
  35.     </ViewFlipper>

  36. </LinearLayout>
复制代码
  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.      * @return  
  46.      */  
  47.     protected Animation inFromRightAnimation() {  
  48.         Animation inFromRight = new TranslateAnimation(  
  49.                 Animation.RELATIVE_TO_PARENT, +1.0f,  
  50.                 Animation.RELATIVE_TO_PARENT, 0.0f,  
  51.                 Animation.RELATIVE_TO_PARENT, 0.0f,  
  52.                 Animation.RELATIVE_TO_PARENT, 0.0f);  
  53.         inFromRight.setDuration(200);  
  54.         inFromRight.setInterpolator(new AccelerateInterpolator());  
  55.         return inFromRight;  
  56.     }  
  57.    
  58.     /**  
  59.      * 定义从左侧退出的动画效果  
  60.      * @return  
  61.      */  
  62.     protected Animation outToLeftAnimation() {  
  63.         Animation outtoLeft = new TranslateAnimation(  
  64.                 Animation.RELATIVE_TO_PARENT, 0.0f,  
  65.                 Animation.RELATIVE_TO_PARENT, -1.0f,  
  66.                 Animation.RELATIVE_TO_PARENT, 0.0f,  
  67.                 Animation.RELATIVE_TO_PARENT, 0.0f);  
  68.         outtoLeft.setDuration(200);  
  69.         outtoLeft.setInterpolator(new AccelerateInterpolator());  
  70.         return outtoLeft;  
  71.     }  
  72.    
  73.     /**  
  74.      * 定义从左侧进入的动画效果  
  75.      * @return  
  76.      */  
  77.     protected Animation inFromLeftAnimation() {  
  78.         Animation inFromLeft = new TranslateAnimation(  
  79.                 Animation.RELATIVE_TO_PARENT, -1.0f,  
  80.                 Animation.RELATIVE_TO_PARENT, 0.0f,  
  81.                 Animation.RELATIVE_TO_PARENT, 0.0f,  
  82.                 Animation.RELATIVE_TO_PARENT, 0.0f);  
  83.         inFromLeft.setDuration(200);  
  84.         inFromLeft.setInterpolator(new AccelerateInterpolator());  
  85.         return inFromLeft;  
  86.     }  
  87.    
  88.     /**  
  89.      * 定义从右侧退出时的动画效果  
  90.      * @return  
  91.      */  
  92.     protected Animation outToRightAnimation() {  
  93.         Animation outtoRight = new TranslateAnimation(  
  94.                 Animation.RELATIVE_TO_PARENT, 0.0f,  
  95.                 Animation.RELATIVE_TO_PARENT, +1.0f,  
  96.                 Animation.RELATIVE_TO_PARENT, 0.0f,  
  97.                 Animation.RELATIVE_TO_PARENT, 0.0f);  
  98.         outtoRight.setDuration(200);  
  99.         outtoRight.setInterpolator(new AccelerateInterpolator());  
  100.         return outtoRight;  
  101.     }  
  102.    
  103.     public boolean onDown(MotionEvent e) {
  104.         // TODO Auto-generated method stub
  105.         return false;
  106.     }
  107.     /*  
  108.      * 用户按下触摸屏、快速移动后松开即触发这个事件  
  109.      * e1:第1个ACTION_DOWN MotionEvent  
  110.      * e2:最后一个ACTION_MOVE MotionEvent  
  111.      * velocityX:X轴上的移动速度,像素/秒  
  112.      * velocityY:Y轴上的移动速度,像素/秒  
  113.      * 触发条件 :  
  114.      * X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒  
  115.      */
  116.     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
  117.             float velocityY) {
  118.          if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE  
  119.                     && Math.abs(velocityX) > FLING_MIN_VELOCITY) {  
  120.                 // 当像左侧滑动的时候  
  121.                 //设置View进入屏幕时候使用的动画  
  122.                 flipper.setInAnimation(inFromRightAnimation());  
  123.                 //设置View退出屏幕时候使用的动画  
  124.                 flipper.setOutAnimation(outToLeftAnimation());  
  125.                 flipper.showNext();  
  126.             } else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE  
  127.                     && Math.abs(velocityX) > FLING_MIN_VELOCITY) {  
  128.                 // 当像右侧滑动的时候  
  129.                 flipper.setInAnimation(inFromLeftAnimation());  
  130.                 flipper.setOutAnimation(outToRightAnimation());  
  131.                 flipper.showPrevious();  
  132.             }  
  133.             return false;  
  134.     }
  135.     public void onLongPress(MotionEvent e) {
  136.         // TODO Auto-generated method stub
  137.         
  138.     }
  139.     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
  140.             float distanceY) {
  141.         // TODO Auto-generated method stub
  142.         return false;
  143.     }
  144.     public void onShowPress(MotionEvent e) {
  145.         // TODO Auto-generated method stub
  146.         
  147.     }
  148.     public boolean onSingleTapUp(MotionEvent e) {
  149.         // TODO Auto-generated method stub
  150.         return false;
  151.     }
  152.     public boolean onTouch(View v, MotionEvent event) {
  153.         // TODO Auto-generated method stub
  154.           // 一定要将触屏事件交给手势识别类去处理(自己处理会很麻烦的)  
  155.         return mGestureDetector.onTouchEvent(event);  
  156.     }
  157.    
  158.    
  159. }
复制代码

2、ViewPager

说明:

ViewPager用于实现多页面的切换效果,该类存在于Google的兼容包里面,所以在引用时记得在BuilldPath中加入“android-support-v4.jar”

主布局文件

main.xml


  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.     <android.support.v4.view.ViewPager
  7.         android:id="@+id/viewpager"
  8.         android:layout_width="wrap_content"
  9.         android:layout_height="wrap_content"
  10.         android:layout_gravity="center" >

  11.         <android.support.v4.view.PagerTitleStrip
  12.             android:id="@+id/pagertitle"
  13.             android:layout_width="wrap_content"
  14.             android:layout_height="wrap_content"
  15.             android:layout_gravity="top" />
  16.     </android.support.v4.view.ViewPager>

  17. </LinearLayout>
复制代码

其中ViewPager为多页显示控件,PagerTitleStrip用于显示当前页面的标题

主窗口代码:

PagerTitleDemoActivity.java


  1. package com.ns.pager;

  2. import java.util.ArrayList;

  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.support.v4.view.PagerAdapter;
  6. import android.support.v4.view.PagerTitleStrip;
  7. import android.support.v4.view.ViewPager;
  8. import android.view.LayoutInflater;
  9. import android.view.View;

  10. public class PagerTitleDemoActivity extends Activity {
  11.     /** Called when the activity is first created. */
  12.     private ViewPager mViewPager;
  13.     private PagerTitleStrip mPagerTitleStrip;
  14.     @Override
  15.     public void onCreate(Bundle savedInstanceState) {
  16.         super.onCreate(savedInstanceState);
  17.         setContentView(R.layout.main);
  18.         mViewPager = (ViewPager)findViewById(R.id.viewpager);
  19.         mPagerTitleStrip = (PagerTitleStrip)findViewById(R.id.pagertitle);
  20.         
  21.         //将要分页显示的View装入数组中
  22.         LayoutInflater mLi = LayoutInflater.from(this);
  23.         View view1 = mLi.inflate(R.layout.view1, null);
  24.         View view2 = mLi.inflate(R.layout.view2, null);
  25.         View view3 = mLi.inflate(R.layout.view3, null);
  26.         
  27.         //每个页面的Title数据
  28.         final ArrayList<View> views = new ArrayList<View>();
  29.         views.add(view1);
  30.         views.add(view2);
  31.         views.add(view3);
  32.         
  33.         final ArrayList<String> titles = new ArrayList<String>();
  34.         titles.add("tab1");
  35.         titles.add("tab2");
  36.         titles.add("tab3");
  37.         
  38.         //填充ViewPager的数据适配器
  39.         PagerAdapter mPagerAdapter = new PagerAdapter() {
  40.             
  41.             @Override
  42.             public boolean isViewFromObject(View arg0, Object arg1) {
  43.                 return arg0 == arg1;
  44.             }
  45.             
  46.             @Override
  47.             public int getCount() {
  48.                 return views.size();
  49.             }

  50.             @Override
  51.             public void destroyItem(View container, int position, Object object) {
  52.                 ((ViewPager)container).removeView(views.get(position));
  53.             }

  54.             @Override
  55.             public CharSequence getPageTitle(int position) {
  56.                 return titles.get(position);
  57.             }

  58.             @Override
  59.             public Object instantiateItem(View container, int position) {
  60.                 ((ViewPager)container).addView(views.get(position));
  61.                 return views.get(position);
  62.             }
  63.         };
  64.         
  65.         mViewPager.setAdapter(mPagerAdapter);
  66.     }
  67. }
复制代码

运行效果:



3、Gallery

  1. package xiaosi.gallery;

  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.content.res.TypedArray;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.view.ViewGroup;
  8. import android.widget.AdapterView;
  9. import android.widget.AdapterView.OnItemClickListener;
  10. import android.widget.BaseAdapter;
  11. import android.widget.Gallery;
  12. import android.widget.ImageView;
  13. import android.widget.Toast;

  14. public class GalleryActivity extends Activity {
  15.     /** Called when the activity is first created. */
  16.     private Gallery gallery =null;
  17.     @Override
  18.     public void onCreate(Bundle savedInstanceState) {
  19.         super.onCreate(savedInstanceState);
  20.         setContentView(R.layout.main);
  21.         
  22.         gallery = (Gallery)findViewById(R.id.gallery);
  23.         //设置图片适配器
  24.         gallery.setAdapter(new ImageAdapter(this));
  25.         gallery.setSpacing(5);
  26.         
  27.         //设置监听器
  28.         gallery.setOnItemClickListener(new OnItemClickListener() {
  29.             
  30.             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,    long arg3) {
  31.                 Toast.makeText(GalleryActivity.this, "点击了第"+arg2+"张图片", Toast.LENGTH_LONG).show();
  32.             }
  33.         });
  34.     }
  35. }

  36. class ImageAdapter extends BaseAdapter{
  37.    
  38.     int mGalleryItemBackground;
  39.     private Context context;
  40.     //图片源数组
  41.     private Integer[] imageInteger={
  42.             R.drawable.a,
  43.             R.drawable.b,
  44.             R.drawable.c,
  45.             R.drawable.d
  46.     };
  47.     public ImageAdapter(Context c){
  48.         context = c;
  49.         TypedArray attr = context.obtainStyledAttributes(R.styleable.HelloGallery);        
  50.         mGalleryItemBackground = attr.getResourceId(R.styleable.HelloGallery_android_galleryItemBackground, 0);        
  51.         attr.recycle();
  52.     }
  53.     // 获取图片的个数
  54.     public int getCount() {
  55.         return imageInteger.length;
  56.     }
  57.     // 获取图片在库中的位置  
  58.     public Object getItem(int position) {
  59.         return position;
  60.     }
  61.     // 获取图片ID  
  62.     public long getItemId(int position) {
  63.         return position;
  64.     }
  65.     public View getView(int position, View convertView, ViewGroup parent) {
  66.         
  67.         ImageView imageView = new ImageView(context);
  68.         // 给ImageView设置资源
  69.         imageView.setImageResource(imageInteger[position]);
  70.         // 设置显示比例类型  
  71.         imageView.setScaleType(ImageView.ScaleType.FIT_XY);
  72.         // 设置布局 图片120*80
  73.         imageView.setLayoutParams(new Gallery.LayoutParams(180, 100));
  74.         imageView.setBackgroundResource(mGalleryItemBackground);        
  75.         return imageView;
  76.     }
  77. }
复制代码

mian.xml


  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.     <Gallery
  7.         android:id="@+id/gallery"
  8.         android:layout_width="fill_parent"
  9.         android:layout_height="wrap_content"
  10.         android:gravity="bottom"
  11.         android:background="?android:galleryItemBackground"/>
  12. </LinearLayout>
复制代码

创建一个新的XML文件在res/values/目录下 attrs.xml命名。

这是一个定制的styleable资源,可以应用于一个布局。



  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>   
  3.     <declare-styleable name="HelloGallery">      
  4.          <attr name="android:galleryItemBackground" />   
  5.     </declare-styleable>
  6. </resources>
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|安卓论坛  

GMT+8, 2024-4-29 16:37 , Processed in 0.068737 second(s), 33 queries .

Powered by Discuz! X3.2

© 2001-2013 Design S!|ƽ̶

快速回复 返回顶部 返回列表