您的位置:首页 > 移动开发 > Android开发

Android ActivityGroup和ViewFlipper实现两个Activity滑动(animation.translate)切换

2012-01-01 15:02 746 查看
之前在公司做一个Android应用的时候需要实现一个滑动注册登入界面,上网找了很久都没有相关资料,最后看了若干代码和自己研究之后终于实现了。小计一下:

Demo结构图:



其中,ActivityGroupDemoActivity是主显示界面,继承了ActivityGroup,ActivityOne和ActivityTwo分别是要切换的两个Activity。

Anim文件夹里是4个滑动动画(左进、左出、右进、右出),Demo里我实现了手势左右滑动切换界面(以及对应的Activity)

layout里的分别是ActivityGroup和两个Activity的界面。

上代码:

ActivityOne和ActivityTwo里没有功能上的东西,就是打印出了Activity回调onCreate方法时候的Log,以及设置界面。两个界面文件分别是:

act1:

<?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" >

<RelativeLayout
android:id="@+id/relativeLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="100dp"
android:background="#ffffff"
android:gravity="center"
android:orientation="vertical" >

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Signin"
android:textColor="#000000"
android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>

</RelativeLayout>

</LinearLayout>


act2:

<?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" >

<RelativeLayout
android:id="@+id/relativeLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="100dp"
android:background="#ADFF2F"
android:gravity="center"
android:orientation="vertical" >

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Register"
android:textColor="#000000"
android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>

</RelativeLayout>
</LinearLayout>


ActivityGroup里的代码:

package net.john;

import android.app.ActivityGroup;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ViewFlipper;

public class ActivityGroupDemoActivity extends ActivityGroup implements OnTouchListener, OnGestureListener {

private ViewFlipper vf;
private GestureDetector gd;

//identify four animation
private Animation leftIn;
private Animation leftOut;
private Animation rightIn;
private Animation rightOut;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

vf = (ViewFlipper)this.findViewById(R.id.viewFlipper1);
gd = new GestureDetector(this);

vf.addView(getLocalActivityManager().startActivity("", new Intent(ActivityGroupDemoActivity.this, ActivityOne.class)).getDecorView(), 0);
vf.addView(getLocalActivityManager().startActivity("", new Intent(ActivityGroupDemoActivity.this, ActivityTwo.class)).getDecorView(), 1);

vf.setDisplayedChild(0);

vf.setOnTouchListener(this);
vf.setLongClickable(true); //allow long click so that it can recognize gesture

leftIn = AnimationUtils.loadAnimation(this, R.anim.left_in);
leftOut = AnimationUtils.loadAnimation(this, R.anim.left_out);
rightIn = AnimationUtils.loadAnimation(this, R.anim.right_in);
rightOut = AnimationUtils.loadAnimation(this, R.anim.right_out);

Log.d("ActGroupDemo", "ActGroup onCreate()");
}

@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
// TODO Auto-generated method stub

//use GestureDetector object to handle motion event
return gd.onTouchEvent(arg1);
}

@Override
public boolean onDown(MotionEvent arg0) {
// TODO Auto-generated method stub
return false;
}

@Override
public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,
float arg3) {
// TODO Auto-generated method stub

//arg0 is the first motion event
//arg1 is the last motion event
//arg2 is the velocity of x orientation, px/s
//arg3 is the velocity of y orientation, px/s

int fling_min_distance = 100;
int fling_min_velocity = 200;

if (arg0.getX() - arg1.getX() > fling_min_distance && Math.abs(arg2) > fling_min_velocity) {
vf.setInAnimation(rightIn);
vf.setOutAnimation(leftOut);
vf.showNext();
}
else if (arg1.getX() - arg0.getX() > fling_min_distance && Math.abs(arg2) > fling_min_velocity) {
vf.setInAnimation(leftIn);
vf.setOutAnimation(rightOut);
vf.showNext();
}

return false;
}

@Override
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub

}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
// TODO Auto-generated method stub
return false;
}

@Override
public void onShowPress(MotionEvent e) {
// TODO Auto-generated method stub

}

@Override
public boolean onSingleTapUp(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}

}
然后是4个Animation(动画)的代码,由于基本类似,就是起始坐标之间的变化,因此只贴一个代码:

左进入:

<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="-100%p"
android:toXDelta="0"
android:duration="500"/>

<alpha
android:fromAlpha="1.0"
android:toAlpha="1.0"
android:duration="500" />
</set>


translate和alpha分别是滑动和透明度的标签

值得记下的重点是,在给Viewflipper加了Activity的View的时候,addView(view,index)的index参数必须要从0开始。

其次是Log里显示,

当ActivityOne和ActivityTwo是同时加载的,这里在开发中要注意。

资源包在我的资源下载中有。这里就不继续贴代码了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: