看一下类的继承结构,我们可以明白很多。
java.lang.Object | |||||
↳ | android.view.View | ||||
↳ | android.view.ViewGroup | ||||
↳ | android.widget.FrameLayout | ||||
↳ | android.widget.ViewAnimator | ||||
↳ | android.widget.ViewFlipper |
它不仅拥有从父类继承的字段、属性以及xml属性,他还有自己的两个xml属性:
1.android:autoStart 是否开启自动开始动画,值为true或false
2.android:flipInterval 滑动的时间间隔
四、公共方法
public bool isAutoStart ()
如果视图显示到窗口上时会自动调用startFlipping()方法,则返回true
public bool isFlipping()
如果子视图正在切换,则返回true
public bool setAutoStart (bool autoStart)
设置视图显示到窗口上时是否会自动调用startFlipping()方法
public bool setFlipInterval (int milliseconds)
视图间切换的时间间隔
参数
milliseconds 毫秒数
public bool startFlipping ()
开始在子视图间定时循环切换
public bool stopFlipping ()
停止切换
<?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" > <ViewFlipper android:id="@+id/details" android:layout_width="fill_parent" android:layout_height="fill_parent" android:flipInterval="1000" android:inAnimation="@anim/push_left_in" //inAnimation和outAnimation分别指定View进出使用的动画效果 android:outAnimation="@anim/push_left_out" android:persistentDrawingCache="animation" > <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ImageView android:id="@+id/image1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:src="@drawable/a" > </ImageView> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ImageView android:id="@+id/image2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:src="@drawable/b" > </ImageView> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ImageView android:id="@+id/image3" android:layout_width="fill_parent" android:layout_height="wrap_content" android:src="@drawable/c" > </ImageView> </LinearLayout> </ViewFlipper> </LinearLayout>push_left_in.xml文件:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="500" android:fromXDelta="100%p" android:toXDelta="0" /> <alpha android:duration="500" android:fromAlpha="0.0" android:toAlpha="1.0" /> </set>push_left_out.xml文件
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="500" android:fromXDelta="0" android:toXDelta="-100%p" /> <alpha android:duration="500" android:fromAlpha="1.0" android:toAlpha="0.0" /> </set>这里注意一下,我们这用的是left,所以动画是从右向左的,当然你也可以设置从左向右。
package com.example.viewflipperdemo; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.ViewFlipper; public class ViewFlipperDemo extends Activity { private ViewFlipper flipper; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_view_flipper_demo); flipper=(ViewFlipper) findViewById(R.id.details); flipper.setAutoStart(true);//自动开始,不然不会开始。 } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_view_flipper_demo, menu); return true; } }这样 ViewFlipper就开始工作了,可以看到图片在不停的循环、从右到左的显示。这一点,Gallery就不及它了。但是,我们是无法控制页面的,它自己在循环,点击滑动都无效。所以, 如果要是能通过手势的左右滑动来实现屏幕的切换就比较优雅了。 通过 android.view.GestureDetector类可以检测各种手势事件,该类有两个回调接口分别用来通知具体的事件:
package com.example.viewflipperdemo; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.GestureDetector; import android.view.GestureDetector.OnDoubleTapListener; import android.view.GestureDetector.OnGestureListener; import android.view.Menu; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.widget.Button; import android.widget.ViewFlipper; public class ViewFlipperDemo extends Activity implements OnGestureListener, OnDoubleTapListener,OnTouchListener { private ViewFlipper flipper; private GestureDetector gestureDetector; private Button button; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_view_flipper_demo); flipper = (ViewFlipper) findViewById(R.id.details); gestureDetector = new GestureDetector(this);//注册一个用于手势识别的类 // flipper.setAutoStart(true); flipper.setOnTouchListener(this); flipper.setLongClickable(true); //允许长按住ViewFlipper,这样才能识别拖动等手势 button=(Button) findViewById(R.id.button1); button.setOnClickListener(new OnClickListener() { public void onClick(View v) { //flipper.showNext(); Intent intent=new Intent(ViewFlipperDemo.this,TestActivity.class); startActivity(intent);//进入其他Activity,没有问题 } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_view_flipper_demo, menu); return true; } public boolean onSingleTapConfirmed(MotionEvent e) { // TODO Auto-generated method stub return false; } public boolean onDoubleTap(MotionEvent e) { // TODO Auto-generated method stub return false; } /* * 然后在onDoubleTap中实现双击自动切换的效果,再次双击则停止: * * @see * android.view.GestureDetector.OnDoubleTapListener#onDoubleTapEvent(android * .view.MotionEvent) */ public boolean onDoubleTapEvent(MotionEvent e) { if (flipper.isFlipping()) { flipper.stopFlipping(); } else { flipper.startFlipping(); } return true; } public boolean onDown(MotionEvent e) { // TODO Auto-generated method stub return false; } public void onShowPress(MotionEvent e) { // TODO Auto-generated method stub } public boolean onSingleTapUp(MotionEvent e) { // TODO Auto-generated method stub return false; } public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // TODO Auto-generated method stub return false; } public void onLongPress(MotionEvent e) { // TODO Auto-generated method stub } /* * 这里实现的功能是从右往左滑动则切换到上一个View,从左往右滑动则切换到下一个View,并且使用不同的in、out 动画使切换效果看起来统一一些。 * * @see android.view.GestureDetector.OnGestureListener#onFling(android.view. * MotionEvent, android.view.MotionEvent, float, float) */ public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if (e1.getX()>e2.getX()) { flipper.showNext(); } else if (e1.getX()<e2.getX()) { flipper.setInAnimation(getApplicationContext(), R.anim.push_right_in); flipper.setOutAnimation(getApplicationContext(), R.anim.push_right_out); flipper.showPrevious(); flipper.setInAnimation(getApplicationContext(), R.anim.push_left_in); flipper.setOutAnimation(getApplicationContext(), R.anim.push_left_out); } else { return false; } return true; } public boolean onTouch(View v, MotionEvent event) { return this.gestureDetector.onTouchEvent(event); } }这样就完成了ViewFlipper的介绍,总结一下。首先是他的类的继承结构,然后他的功能,利用它我们可以实现动画的滑动效果,可以点击滑动,拖动滑动,而且可以循环显示。