两个layout之间的滑动切换

目录
  1. 1. 一、利用ViewFlipper实现
  2. 2. 二、普通实现

如何在两个layout之间切换,就是一个activity中 两个LinearLayout,一个可见,一个不可见,然后从可见的那个切换到不可见那个,中间实现个滑动效果。

一、利用ViewFlipper实现

1、屏幕切换指的是在同一个Activity内屏幕见的切换,最长见的情况就是在一个FrameLayout内有多个页面,比如一个系统设置页面;一个个性化设置页面。
2、介绍ViewFilpper类
ViewFlipper
extends ViewAnimator
java.lang.Object
 ↳android.view.View
  ↳android.view.ViewGroup
   ↳android.widget.FrameLayout
    ↳android.widget.ViewAnimator
     ↳android.widget.ViewFlipper

Class Overview
Simple ViewAnimator that will animate between two or more views that have been added to it. Only one child is shown at a time. If requested, can automatically flip between each child at a regular interval.
意思是:简单的ViewAnimator之间,两个或两个以上的view加上动画效果。只有一个小孩会显示在一个时间。如果需要,每个孩子能自动翻转之间在固定的时间间隔。

该类继承了Framelayout类,ViewAnimator类的作用是为FrameLayout里面的View切换提供动画效果。

该类有如下几个和动画相关的函数:
setInAnimation:设置View进入屏幕时候使用的动画,该函数有两个版本,一个接受单个参数,类型为android.view.animation.Animation;一个接受两个参数,类型为Context和int,分别为Context对象和定义Animation的resourceID。
setOutAnimation: 设置View退出屏幕时候使用的动画,参数setInAnimation函数一样。
showNext: 调用该函数来显示FrameLayout里面的下一个View。
showPrevious: 调用该函数来显示FrameLayout里面的上一个View。

Translate动画非常好理解,就是定义一个开始的位置和一个结束位置,定义移动时间,然后就能自动产生移动动画。Android的translate移动方向有 横向(X) 竖向(Y), 左右滑动使用了横向移动效果。

3、首选看一下定义四个动画的xml文件:
in_leftright.xml——从左到右进入屏幕

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="3000"
android:fromXDelta="-100%p"
android:toXDelta="0" />
</set>

out_leftright.xml——从左到右出去屏幕

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="3000"
android:fromXDelta="0"
android:toXDelta="100%p" />
</set>

in_rightleft.xml——从右到左进入屏幕

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="3000"
android:fromXDelta="100%p"
android:toXDelta="0" />
</set>

out_rightleft.xml——从右到左出去屏幕

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="3000"
android:fromXDelta="100%p"
android:toXDelta="0" />
</set>

4、定义main.xml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?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/viewFlipper"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<!-- 第一个页面 -->
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent" android:gravity="center">
<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:src="@drawable/a1" />
</LinearLayout>
<!-- 第二个页面 -->
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent" android:gravity="center">
<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:src="@drawable/a2"
android:gravity="center" />
</LinearLayout>
<!-- 第三个页面 -->
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent" android:gravity="center">

<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:src="@drawable/a3"
android:gravity="center" />
</LinearLayout>
<!-- 第四个页面 -->
<LinearLayout android:layout_width="fill_parent"
android:layout_height="fill_parent" android:gravity="center">

<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:src="@drawable/a4"
android:gravity="center" />
</LinearLayout>
</ViewFlipper>
</LinearLayout>

5、java代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class SwitchTest2Activity extends Activity {

ViewFlipper viewFlipper = null;
float startX;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

init();
}

private void init() {
viewFlipper = (ViewFlipper) this.findViewById(R.id.viewFlipper);
}

public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = event.getX();
break;
case MotionEvent.ACTION_UP:

if (event.getX() > startX) { // 向右滑动
viewFlipper.setInAnimation(this, R.anim.in_leftright);
viewFlipper.setOutAnimation(this, R.anim.out_leftright);
viewFlipper.showNext();
} else if (event.getX() < startX) { // 向左滑动
viewFlipper.setInAnimation(this, R.anim.in_rightleft);
viewFlipper.setOutAnimation(this, R.anim.out_rightleft);
viewFlipper.showPrevious();
}
break;
}

return super.onTouchEvent(event);
}

}

二、普通实现

Activity:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public void JumpToSecondView(View v) {
/*
* 效果1,覆盖效果
*/
// secondView.setVisibility(View.VISIBLE);
// secondView.setClickable(true);
// secondView.setAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_in));

/*
* 效果2,平滑效果
*/
secondView.setVisibility(View.VISIBLE);
secondView.setClickable(true);
secondView.setAnimation(AnimationUtils.loadAnimation(this, R.anim.in_rightleft));
firstView.setVisibility(View.GONE);
firstView.setAnimation(AnimationUtils.loadAnimation(this, R.anim.out_rightleft));

}

main.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainView"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<LinearLayout
android:id="@+id/FirstView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ffffff"
android:visibility="visible">

<Button
android:id="@+id/ButtonNext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="showNext"
android:onClick="JumpToSecondView"></Button>

</LinearLayout>

<LinearLayout
android:id="@+id/SecondView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#000000"
android:visibility="invisible">

<Button
android:id="@+id/ButtonBack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Back"
android:onClick="JumpToFirstView"></Button>
</LinearLayout>
</FrameLayout>

参考:Android利用ViewFlipper实现屏幕切换动画效果
http://www.cnblogs.com/bavariama/archive/2013/01/29/2881225.html
http://www.eoeandroid.com/thread-27271-1-1.html