Android ViewFlipper示例教程
在本教程中,我们将讨论并实现Android ViewFlipper。
android中的ViewFlipper主要用于需要将一个视图转换为另一个视图的情况。
Android ViewFlipper
android中的ViewFlipper是ViewAnimator类的扩展,该类在已添加到其中的两个或者更多视图之间设置动画。
一次仅显示一个孩子,用户可以翻转以查看其他孩子的视图。
我们还可以实现ViewFlipper,以便它以固定的间隔自动在视图之间翻转。
ViewFlipper可以在图库应用中使用,以在图像之间导航。
Android ViewFlipper支持以下方法:setInAnimation()和setOutAnimation(),其中我们可以使用android系统中的默认动画,也可以编写自己的动画类。
为了控制自动翻转选项,我们可以通过调用startFlipping()和stopFlipping()方法在ViewFlipper上启动和停止计时器。
我们可以使用setFlipInterval(period)设置自动翻转间隔。
使用ViewFlipper对象上的showNext()和showPrevious()方法调用下一个和上一个子视图。
在本教程中,我们将创建一个包含3个屏幕的应用程序。
我们将在每个屏幕上显示自动翻转,并使用Android MotionEvent类向左和向右滑动以在前两个屏幕之间翻转。
Android ViewFlipper示例项目结构
该项目由四个自定义动画类组成,这些类将显示ViewFlipper视图之间的过渡。
Android ViewFlipper示例代码
" content_main.xml"文件的定义如下所示。
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android" xmlns:app="https://schemas.android.com/apk/res-auto" xmlns:tools="https://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="com.theitroad.viewflipper.MainActivity" tools:showIn="@layout/activity_main"> <ViewFlipper android:id="@+id/view_flipper" android:layout_width="fill_parent" android:layout_height="fill_parent"> <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center" android:adjustViewBounds="true" android:background="@android:color/black" android:scaleType="centerCrop" <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:gravity="center" android:text="First Child" android:textColor="@android:color/white" android:textSize="18dp" android:textStyle="bold" </RelativeLayout> <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center" android:adjustViewBounds="true" android:background="@android:color/darker_gray" android:scaleType="centerCrop" <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:gravity="center" android:text="Second Child" android:textSize="18dp" android:textStyle="bold" </RelativeLayout> <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center" android:adjustViewBounds="true" android:background="@android:color/holo_green_light" android:scaleType="centerCrop" <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:gravity="center" android:text="Third Child" android:textSize="18dp" android:textStyle="bold" </RelativeLayout> </ViewFlipper> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:layout_alignParentTop="true" android:gravity="center" android:orientation="horizontal"> <Button android:id="@+id/play" android:layout_width="50dp" android:layout_height="50dp" android:layout_marginRight="10dp" android:background="@android:drawable/ic_media_play" <Button android:id="@+id/stop" android:layout_width="50dp" android:layout_height="50dp" android:background="@android:drawable/ic_media_pause" </LinearLayout> </RelativeLayout>
" ViewFlipper"标签由三个同级的RelativeLayout子视图组成。
一次只显示一个。
四个动画类放置在res/anim文件夹中,定义如下:in_from_left.xml
<set xmlns:android="https://schemas.android.com/apk/res/android" android:shareInterpolator="false"> <translate android:fromXDelta="-100%" android:toXDelta="0%" android:fromYDelta="0%" android:toYDelta="0%" android:duration="1400" </set>
in_from_right.xml
<set xmlns:android="https://schemas.android.com/apk/res/android" android:shareInterpolator="false"> <translate android:fromXDelta="100%" android:toXDelta="0%" android:fromYDelta="0%" android:toYDelta="0%" android:duration="1400" </set>
out_from_left.xml
<set xmlns:android="https://schemas.android.com/apk/res/android" android:shareInterpolator="false"> <translate android:fromXDelta="0%" android:toXDelta="-100%" android:fromYDelta="0%" android:toYDelta="0%" android:duration="1400" </set>
out_from_right.xml
<set xmlns:android="https://schemas.android.com/apk/res/android" android:shareInterpolator="false"> <translate android:fromXDelta="0%" android:toXDelta="100%" android:fromYDelta="0%" android:toYDelta="0%" android:duration="1400" </set>
MainActivity.java定义如下。
public class MainActivity extends AppCompatActivity { private ViewFlipper mViewFlipper; private Context mContext; private float initialX; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); mContext = this; mViewFlipper = (ViewFlipper) this.findViewById(R.id.view_flipper); findViewById(R.id.play).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mViewFlipper.setAutoStart(true); mViewFlipper.setFlipInterval(1000); mViewFlipper.startFlipping(); Snackbar.make(view, "Automatic view flipping has started", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); findViewById(R.id.stop).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mViewFlipper.stopFlipping(); Snackbar.make(view, "Automatic view flipping has stopped", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); } @Override public boolean onTouchEvent(MotionEvent touchevent) { switch (touchevent.getAction()) { case MotionEvent.ACTION_DOWN: initialX = touchevent.getX(); break; case MotionEvent.ACTION_UP: float finalX = touchevent.getX(); if (initialX > finalX) { if (mViewFlipper.getDisplayedChild() == 1) break; mViewFlipper.setInAnimation(AnimationUtils.loadAnimation(mContext, R.anim.in_from_left)); mViewFlipper.setOutAnimation(AnimationUtils.loadAnimation(mContext, R.anim.out_from_left)); mViewFlipper.showNext(); } else { if (mViewFlipper.getDisplayedChild() == 0) break; mViewFlipper.setInAnimation(AnimationUtils.loadAnimation(mContext, R.anim.in_from_right)); mViewFlipper.setOutAnimation(AnimationUtils.loadAnimation(mContext, R.anim.out_from_right)); mViewFlipper.showPrevious(); } break; } return false; } }
实现了onTouchEvent方法来检测滑动。
MotionEvent.ACTION_DOWN是首次开始触摸手势并记录位置时的动作。
MotionEvent.ACTION_UP将触摸手势标记为完成,并给出自上一次操作以来的中间点。
如果我们在第一个孩子上,则从左到右做出手势,ViewFlipper会设置动画并显示第二个孩子。
反之亦然。
按下播放按钮,将以固定间隔自动在子视图之间进行动画处理和翻转。