ViewFlipper和ViewPager
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相关推荐
- ViewFlipper和ViewPager,fluttertextfield高度
下面的代码片段详细说明了如何实现滑动翻页. <?xml version="1.0" encoding="utf-8"?> <LinearLay ...
- ViewFlipper和ViewPager的区别
http://blog.csdn.net/linghu_java/article/details/8696630 1.ViewFilpper类继承于ViewAnimator类.而ViewAnimato ...
- android view flipper,安卓控件——ViewFlipper
今天在逛博客的时候又学习到一个新控件,就是ViewFlipper,老规矩,还是通过一个demo来学习,下面先附上效果图: ViewFlipper效果图 根据效果图,说下利用该控件实现的几个简单功能点: ...
- Android攻城狮ViewFlipper
使用ViewFlipper实现屏幕切换动画效果. ViewFlipper和ViewPager一样,都是Android自带的一个多页面管理控件,不同的是ViewPager是手动切换页面,而ViewFli ...
- Android ViewFlipper 使用
转载请标明出处: http://blog.csdn.net/tyzlmjj/article/details/48576219 本文出自:[M家杰的博客] 概述 ViewFlipper 与 ViewPa ...
- android ViewPager轮播制作成品——轮播制作(六)
android ViewPager轮播制作成品--轮播制作(六) 本文主要参考文章:Android 使用ViewPager实现左右循环滑动图片 下面整体介绍一下本系列文章.目的是想要做一个广告.通知轮 ...
- android ViewFlipper使用示例(注册引导页)
其实ViewFlipper工作机制很简单,如上图,就是将添加到ViewFlipper中的子View按照顺序定时的显示是其中一个子View,其他的子View设置为Gone状态.ViewFlipper页面 ...
- Android开发笔记(四十五)手势事件
手势事件的流程 基本手势事件 基本的手势事件主要有如下三个方法: dispatchTouchEvent : 判断该事件是否需要下发.返回true表示需要下发给下级视图,返回false表示不需要下发(交 ...
- Android开发笔记(二十一)横幅轮播页Banner
ViewPager ViewPager的概念 在前面的博文< Android开发笔记(十九)底部标签栏TabBar>中,我们提到可以在一个主页面里通过选项卡方式,切换到不同的子页面.那么在 ...
最新文章
- Joda-Time中两个日期之间的天数
- 测量大脑的快速光信号可以加快BCI响应
- Notification 浏览器右下角弹出提示消息
- ubuntu下创建eclipse桌面快捷方式
- java第一节课程笔记、课后习题
- Centos下Yum安装PHP5.5,5.6,7.0
- Angular CLI 全局 ng.cmd 文件内容分析
- Python-OpenCV快速教程
- AngularJS 实现页面滚动到底自动加载数据的功能
- Mac 入门教程:如何更改你的 Mac 设备名称
- tomcat查看线程数
- C语言--第一周作业(更改)
- DMX512协议个人总结,待验证,欢迎拍砖
- 问题解决型QCC课题的推行步骤
- Python——类的继承
- Vue 浏览器兼容性
- 新乡医学院三全学院赴范县历史成就观察团
- php 串口 主板,图解主板插槽:教你选对串口卡
- 资格考试_第三章_证券投资基金的类型
- 模拟扑克牌花色:♠ ♥ ♦ ♣ * 牌号:A 2 3 4 5 6 7 8 9 10 J Q K * 大王、小王 * * 1.生成一副牌 * 2.然后发牌
热门文章
- 用Java语言编写打印菱形
- 文件下载(解决中文文件名下载乱码问题)(二)
- sql查询语句 -牛客学习笔记
- Java java.sql.SQLException: Field ‘xxx‘ doesn‘t have a default value
- 【Linux】查看网络接口(ifconfig | nmcli)
- 获取jar包中的文件,及遍历jar包中的文件
- MySqlDataAdapter.Update -- 报错
- 高数 | 为什么f(x)从a到b的积分等于从b到a的积分的相反数?
- (Python)异常处理try...except、raise
- 盘点认证协议 : 普及篇之ADFS , WS-Federation