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)具体的实现

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><ViewFlipperandroid:id="@+id/viewFlipper1"android:layout_width="fill_parent"android:layout_height="fill_parent" ><ImageViewandroid:id="@+id/imageView1"android:layout_width="fill_parent"android:layout_height="fill_parent"android:src="@drawable/b" /><ImageViewandroid:id="@+id/imageView2"android:layout_width="fill_parent"android:layout_height="fill_parent"android:src="@drawable/c" /><ImageViewandroid:id="@+id/imageView3"android:layout_width="fill_parent"android:layout_height="fill_parent"android:src="@drawable/d" /><ImageViewandroid:id="@+id/imageView4"android:layout_width="fill_parent"android:layout_height="fill_parent"android:src="@drawable/f" /><ImageViewandroid:id="@+id/imageView5"android:layout_width="fill_parent"android:layout_height="fill_parent"android:src="@drawable/g" /></ViewFlipper></LinearLayout>
public class ViewFlipperActivity extends Activity implements OnTouchListener, android.view.GestureDetector.OnGestureListener {private ViewFlipper flipper;GestureDetector mGestureDetector;  private int mCurrentLayoutState;  private static final int FLING_MIN_DISTANCE = 80;  private static final int FLING_MIN_VELOCITY = 150;  @Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.viewflipper);flipper=(ViewFlipper) this.findViewById(R.id.viewFlipper1);//注册一个用于手势识别的类  mGestureDetector = new GestureDetector(this);  //给mFlipper设置一个listener  flipper.setOnTouchListener(this);  mCurrentLayoutState = 0;  //允许长按住ViewFlipper,这样才能识别拖动等手势  flipper.setLongClickable(true);  }/**  * 此方法在本例中未用到,可以指定跳转到某个页面  * @param switchTo  */  public void switchLayoutStateTo(int switchTo) {  while (mCurrentLayoutState != switchTo)   {  if (mCurrentLayoutState > switchTo) {  mCurrentLayoutState--;  flipper.setInAnimation(inFromLeftAnimation());  flipper.setOutAnimation(outToRightAnimation());  flipper.showPrevious();  } else {  mCurrentLayoutState++;  flipper.setInAnimation(inFromRightAnimation());  flipper.setOutAnimation(outToLeftAnimation());  flipper.showNext();  }  }  } /**  * 定义从右侧进入的动画效果  * @return  */  protected Animation inFromRightAnimation() {  Animation inFromRight = new TranslateAnimation(  Animation.RELATIVE_TO_PARENT, +1.0f,  Animation.RELATIVE_TO_PARENT, 0.0f,  Animation.RELATIVE_TO_PARENT, 0.0f,  Animation.RELATIVE_TO_PARENT, 0.0f);  inFromRight.setDuration(200);  inFromRight.setInterpolator(new AccelerateInterpolator());  return inFromRight;  }  /**  * 定义从左侧退出的动画效果  * @return  */  protected Animation outToLeftAnimation() {  Animation outtoLeft = new TranslateAnimation(  Animation.RELATIVE_TO_PARENT, 0.0f,  Animation.RELATIVE_TO_PARENT, -1.0f,  Animation.RELATIVE_TO_PARENT, 0.0f,  Animation.RELATIVE_TO_PARENT, 0.0f);  outtoLeft.setDuration(200);  outtoLeft.setInterpolator(new AccelerateInterpolator());  return outtoLeft;  }  /**  * 定义从左侧进入的动画效果  * @return  */  protected Animation inFromLeftAnimation() {  Animation inFromLeft = new TranslateAnimation(  Animation.RELATIVE_TO_PARENT, -1.0f,  Animation.RELATIVE_TO_PARENT, 0.0f,  Animation.RELATIVE_TO_PARENT, 0.0f,  Animation.RELATIVE_TO_PARENT, 0.0f);  inFromLeft.setDuration(200);  inFromLeft.setInterpolator(new AccelerateInterpolator());  return inFromLeft;  }  /**  * 定义从右侧退出时的动画效果  * @return  */  protected Animation outToRightAnimation() {  Animation outtoRight = new TranslateAnimation(  Animation.RELATIVE_TO_PARENT, 0.0f,  Animation.RELATIVE_TO_PARENT, +1.0f,  Animation.RELATIVE_TO_PARENT, 0.0f,  Animation.RELATIVE_TO_PARENT, 0.0f);  outtoRight.setDuration(200);  outtoRight.setInterpolator(new AccelerateInterpolator());  return outtoRight;  }  public boolean onDown(MotionEvent e) {// TODO Auto-generated method stubreturn false;}/*  * 用户按下触摸屏、快速移动后松开即触发这个事件  * e1:第1个ACTION_DOWN MotionEvent  * e2:最后一个ACTION_MOVE MotionEvent  * velocityX:X轴上的移动速度,像素/秒  * velocityY:Y轴上的移动速度,像素/秒  * 触发条件 :  * X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒  */public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE  && Math.abs(velocityX) > FLING_MIN_VELOCITY) {  // 当像左侧滑动的时候  //设置View进入屏幕时候使用的动画
                flipper.setInAnimation(inFromRightAnimation());  //设置View退出屏幕时候使用的动画
                flipper.setOutAnimation(outToLeftAnimation());  flipper.showNext();  } else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE  && Math.abs(velocityX) > FLING_MIN_VELOCITY) {  // 当像右侧滑动的时候
                flipper.setInAnimation(inFromLeftAnimation());  flipper.setOutAnimation(outToRightAnimation());  flipper.showPrevious();  }  return false;  }public void onLongPress(MotionEvent e) {// TODO Auto-generated method stub
        }public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,float distanceY) {// TODO Auto-generated method stubreturn false;}public void onShowPress(MotionEvent e) {// TODO Auto-generated method stub
        }public boolean onSingleTapUp(MotionEvent e) {// TODO Auto-generated method stubreturn false;}public boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stub// 一定要将触屏事件交给手势识别类去处理(自己处理会很麻烦的)  return mGestureDetector.onTouchEvent(event);  }}

from:http://blog.csdn.net/arui319

2、ViewPager

说明:

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

主布局文件

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><android.support.v4.view.ViewPagerandroid:id="@+id/viewpager"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center" ><android.support.v4.view.PagerTitleStripandroid:id="@+id/pagertitle"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="top" /></android.support.v4.view.ViewPager></LinearLayout>

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

主窗口代码:

PagerTitleDemoActivity.java

package com.ns.pager;import java.util.ArrayList;import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.PagerTitleStrip;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;public class PagerTitleDemoActivity extends Activity {/** Called when the activity is first created. */private ViewPager mViewPager;private PagerTitleStrip mPagerTitleStrip;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);mViewPager = (ViewPager)findViewById(R.id.viewpager);mPagerTitleStrip = (PagerTitleStrip)findViewById(R.id.pagertitle);//将要分页显示的View装入数组中LayoutInflater mLi = LayoutInflater.from(this);View view1 = mLi.inflate(R.layout.view1, null);View view2 = mLi.inflate(R.layout.view2, null);View view3 = mLi.inflate(R.layout.view3, null);//每个页面的Title数据final ArrayList<View> views = new ArrayList<View>();views.add(view1);views.add(view2);views.add(view3);final ArrayList<String> titles = new ArrayList<String>();titles.add("tab1");titles.add("tab2");titles.add("tab3");//填充ViewPager的数据适配器PagerAdapter mPagerAdapter = new PagerAdapter() {@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0 == arg1;}@Overridepublic int getCount() {return views.size();}@Overridepublic void destroyItem(View container, int position, Object object) {((ViewPager)container).removeView(views.get(position));}@Overridepublic CharSequence getPageTitle(int position) {return titles.get(position);}@Overridepublic Object instantiateItem(View container, int position) {((ViewPager)container).addView(views.get(position));return views.get(position);}};mViewPager.setAdapter(mPagerAdapter);}
}

运行效果:

from:http://my.oschina.net/fanxiao/blog/40306

3、Gallery

package xiaosi.gallery;import android.app.Activity;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.Toast;public class GalleryActivity extends Activity {/** Called when the activity is first created. */private Gallery gallery =null;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);gallery = (Gallery)findViewById(R.id.gallery);//设置图片适配器gallery.setAdapter(new ImageAdapter(this));gallery.setSpacing(5);//设置监听器gallery.setOnItemClickListener(new OnItemClickListener() {public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,    long arg3) {Toast.makeText(GalleryActivity.this, "点击了第"+arg2+"张图片", Toast.LENGTH_LONG).show();}});}
}class ImageAdapter extends BaseAdapter{int mGalleryItemBackground;private Context context;//图片源数组private Integer[] imageInteger={R.drawable.a,R.drawable.b,R.drawable.c,R.drawable.d};public ImageAdapter(Context c){context = c;TypedArray attr = context.obtainStyledAttributes(R.styleable.HelloGallery);        mGalleryItemBackground = attr.getResourceId(R.styleable.HelloGallery_android_galleryItemBackground, 0);        attr.recycle();}// 获取图片的个数public int getCount() {return imageInteger.length;}// 获取图片在库中的位置  public Object getItem(int position) {return position;}// 获取图片ID  public long getItemId(int position) {return position;}public View getView(int position, View convertView, ViewGroup parent) {ImageView imageView = new ImageView(context);// 给ImageView设置资源
        imageView.setImageResource(imageInteger[position]);// 设置显示比例类型
        imageView.setScaleType(ImageView.ScaleType.FIT_XY);// 设置布局 图片120*80 imageView.setLayoutParams(new Gallery.LayoutParams(180, 100));imageView.setBackgroundResource(mGalleryItemBackground);        return imageView;}
}

mian.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><Galleryandroid:id="@+id/gallery"android:layout_width="fill_parent"android:layout_height="wrap_content"android:gravity="bottom"android:background="?android:galleryItemBackground"/>
</LinearLayout>

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

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

<?xml version="1.0" encoding="utf-8"?>
<resources>    <declare-styleable name="HelloGallery">       <attr name="android:galleryItemBackground" />    </declare-styleable>
</resources>

ViewFlipper和ViewPager相关推荐

  1. ViewFlipper和ViewPager,fluttertextfield高度

    下面的代码片段详细说明了如何实现滑动翻页. <?xml version="1.0" encoding="utf-8"?> <LinearLay ...

  2. ViewFlipper和ViewPager的区别

    http://blog.csdn.net/linghu_java/article/details/8696630 1.ViewFilpper类继承于ViewAnimator类.而ViewAnimato ...

  3. android view flipper,安卓控件——ViewFlipper

    今天在逛博客的时候又学习到一个新控件,就是ViewFlipper,老规矩,还是通过一个demo来学习,下面先附上效果图: ViewFlipper效果图 根据效果图,说下利用该控件实现的几个简单功能点: ...

  4. Android攻城狮ViewFlipper

    使用ViewFlipper实现屏幕切换动画效果. ViewFlipper和ViewPager一样,都是Android自带的一个多页面管理控件,不同的是ViewPager是手动切换页面,而ViewFli ...

  5. Android ViewFlipper 使用

    转载请标明出处: http://blog.csdn.net/tyzlmjj/article/details/48576219 本文出自:[M家杰的博客] 概述 ViewFlipper 与 ViewPa ...

  6. android ViewPager轮播制作成品——轮播制作(六)

    android ViewPager轮播制作成品--轮播制作(六) 本文主要参考文章:Android 使用ViewPager实现左右循环滑动图片 下面整体介绍一下本系列文章.目的是想要做一个广告.通知轮 ...

  7. android ViewFlipper使用示例(注册引导页)

    其实ViewFlipper工作机制很简单,如上图,就是将添加到ViewFlipper中的子View按照顺序定时的显示是其中一个子View,其他的子View设置为Gone状态.ViewFlipper页面 ...

  8. Android开发笔记(四十五)手势事件

    手势事件的流程 基本手势事件 基本的手势事件主要有如下三个方法: dispatchTouchEvent : 判断该事件是否需要下发.返回true表示需要下发给下级视图,返回false表示不需要下发(交 ...

  9. Android开发笔记(二十一)横幅轮播页Banner

    ViewPager ViewPager的概念 在前面的博文< Android开发笔记(十九)底部标签栏TabBar>中,我们提到可以在一个主页面里通过选项卡方式,切换到不同的子页面.那么在 ...

最新文章

  1. Joda-Time中两个日期之间的天数
  2. 测量大脑的快速光信号可以加快BCI响应
  3. Notification 浏览器右下角弹出提示消息
  4. ubuntu下创建eclipse桌面快捷方式
  5. java第一节课程笔记、课后习题
  6. Centos下Yum安装PHP5.5,5.6,7.0
  7. Angular CLI 全局 ng.cmd 文件内容分析
  8. Python-OpenCV快速教程
  9. AngularJS 实现页面滚动到底自动加载数据的功能
  10. Mac 入门教程:如何更改你的 Mac 设备名称
  11. tomcat查看线程数
  12. C语言--第一周作业(更改)
  13. DMX512协议个人总结,待验证,欢迎拍砖
  14. 问题解决型QCC课题的推行步骤
  15. Python——类的继承
  16. Vue 浏览器兼容性
  17. 新乡医学院三全学院赴范县历史成就观察团
  18. php 串口 主板,图解主板插槽:教你选对串口卡
  19. 资格考试_第三章_证券投资基金的类型
  20. 模拟扑克牌花色:♠ ♥ ♦ ♣ * 牌号:A 2 3 4 5 6 7 8 9 10 J Q K * 大王、小王 * * 1.生成一副牌 * 2.然后发牌

热门文章

  1. 用Java语言编写打印菱形
  2. 文件下载(解决中文文件名下载乱码问题)(二)
  3. sql查询语句 -牛客学习笔记
  4. Java java.sql.SQLException: Field ‘xxx‘ doesn‘t have a default value
  5. 【Linux】查看网络接口(ifconfig | nmcli)
  6. 获取jar包中的文件,及遍历jar包中的文件
  7. MySqlDataAdapter.Update -- 报错
  8. 高数 | 为什么f(x)从a到b的积分等于从b到a的积分的相反数?
  9. (Python)异常处理try...except、raise
  10. 盘点认证协议 : 普及篇之ADFS , WS-Federation