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会设置动画并显示第二个孩子。
反之亦然。
按下播放按钮,将以固定间隔自动在子视图之间进行动画处理和翻转。

