读书人

用ViewFlipper兑现滑屏带有层叠转屏

发布时间: 2012-06-30 17:20:12 作者: rapoo

用ViewFlipper实现滑屏,带有层叠转屏效果
package com.android.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.GestureDetector.OnGestureListener;
import android.view.View.OnTouchListener;
import android.view.animation.AnimationUtils;
import android.widget.ViewFlipper;

public class CascadeViewFlipper extends ViewFlipper implements OnTouchListener, OnGestureListener{
private final Context context;
private GestureDetector gestureDetector;
protected int FLING_MIN_DISTANCE = 100;//横向滑动多少后才能转屏
GestureDetector mGestureDetector;//监听事件
int currentIndex = 0;//初始化在第一个位置

public CascadeViewFlipper(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
gestureDetector = new GestureDetector(this);
setOnTouchListener(this);//对viewflipper设定监听事件,很多人都忘记写要注意
setLongClickable(true);
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
/**
* 向左滑动
*/
if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE) {
if (currentIndex < getChildCount() - 1){
currentIndex++;
setInAnimation(AnimationUtils.loadAnimation(context, R.anim.cascade_left_in));//设置向左滑动进来页面的动画效果
setOutAnimation(AnimationUtils.loadAnimation(context, R.anim.cascade_left_out));//设置向左滑动页面出去的动画效果
showNext();
}
return true;
}
/**
* 向右滑动
*/
else if (e1.getX() - e2.getX() < -FLING_MIN_DISTANCE) {
if (currentIndex > 0){
currentIndex--;
setInAnimation(AnimationUtils.loadAnimation(context, R.anim.cascade_right_in)); //设置向右滑动进来页面的动画效果
setOutAnimation(AnimationUtils.loadAnimation(context, R.anim.cascade_right_out)); //设置向右滑动页面出去的动画效果
showPrevious();
}
return true;
}
return false;
}

@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}

@Override
public boolean onDown(MotionEvent e) {
// TODO Auto-generated method stub
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;
}
}


以下是xml代码:
<?xml version="1.0" encoding="utf-8"?>
<com.android.view.CascadeViewFlipper
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:persistentDrawingCache="animation"
android:flipInterval="1000"
android:inAnimation="@anim/scale_small_in"
android:outAnimation="@anim/scale_small_out">
<TextView
android:text="1"
android:background="#FFFFFF"
android:id="@+id/TextView_next1"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</TextView>
<TextView
android:text="2"
android:background="#FF0000"
android:id="@+id/TextView_next2"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</TextView>
<TextView
android:text="3"
android:background="#00FF00"
android:id="@+id/TextView_next3"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</TextView>
</com.android.view.CascadeViewFlipper>

cascade_left_in.xml的代码,向左边滑进的效果
<?xml version="1.0" encoding="UTF-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator">
<translate
android:fromXDelta="100%p" android:toXDelta="0"
android:duration="1000"/>
</set>
cascade_left_out.xml的代码,向左边滑出的效果
<?xml version="1.0" encoding="UTF-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator">
<scale
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXScale="1.0" android:toXScale="0.5"
android:fromYScale="1.0" android:toYScale="0.5"
android:pivotX="50%p" android:pivotY="50%p"
android:duration="1000"/>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator"
android:fromAlpha="1.0" android:toAlpha="0.0"
android:duration="1000"
/>
</set>
cascade_right_in.xml的代码,向右边滑进的效果
<?xml version="1.0" encoding="UTF-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator">
<scale
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXScale="0.5" android:toXScale="1.0"
android:fromYScale="0.5" android:toYScale="1.0"
android:pivotX="50%p" android:pivotY="50%p"
android:duration="1000"/>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator"
android:fromAlpha="0" android:toAlpha="1.0"
android:duration="1000"
/>
</set>
cascade_right_out.xml的代码,向右边滑出的效果
<?xml version="1.0" encoding="UTF-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator">
<translate
android:fromXDelta="0" android:toXDelta="100%p"
android:duration="1000"/>
</set>
Activity的代码:
package com.android.view;

import android.app.Activity;
import android.os.Bundle;

public class Main extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.view_flipper);
}
}
处女帖,希望能帮到初学android的童鞋们

读书人网 >移动开发

热点推荐