主要采用的类是ViewFlipper、GestureDector、Animation类。首先我们得先了解一下Activite的位置定义如下图:
那么当手指向左滑动的时候就是查看下个View,其实当我们向左滑动的瞬间,发生两个动作,也就是当前屏幕的内容向左边滑出(从x=0%滑到x=-100%),而处于x=100%p位置的内容从右边滑入当前屏幕(即从x=100%p到x=0%p),滑动的基本过程就是这样,向右滑动与其相反。举个例子,创建一个slide_right_in.xml文件:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="100%p"
android:toXDelta="0%p"
android:duration="1000" />
</set>
这里用到的translate标签,接下来讲一讲translate的几个重要的属性:
android:interpolator: 加速器,非常有用的属性,可以简单理解为动画的速度,可以是越来越快,也可以是越来越慢,或者是先快后忙,或者是均匀的速度等等,对于值如下:
@android:anim/accelerate_interpolator: 越来越快 @android:anim/decelerate_interpolator:越来越慢 @android:anim/accelerate_decelerate_interpolator:先快后慢 @android:anim/anticipate_interpolator: 先后退一小步然后向前加速 @android:anim/overshoot_interpolator:快速到达终点超出一小步然后回到终点 @android:anim/anticipate_overshoot_interpolator:到达终点超出一小步然后回到终点 @android:anim/bounce_interpolator:到达终点产生弹球效果,弹几下回到终点 @android:anim/linear_interpolator:均匀速度。 |
android:duration: 动画运行时间,定义在多少时间(ms)内完成动画
android:startOffset: 延迟一定时间后运行动画
fromXDelta: X轴方向开始位置,可以是%,也可以是具体的像素 具体见图
toXDelta: X轴方向结束位置,可以是%,也可以是具体的像素
fromYDelta: Y轴方向开始位置,可以是%,也可以是具体的像素
toYDelta: Y轴方向结束位置,可以是%,也可以是具体的像素
这里给个具体例子,来演示下切换,需要不同的效果,只需改变translate中的标签即可:
public class FlingTest extends Activity implements OnTouchListener, OnGestureListener{
private Button btnPrev;
private Button btnNext;
private ViewFlipper vfFlingTest;
private TextView tvFlipper;
private TextView etFlipper;
private ImageView ivFlipper;
private GestureDetector mGestureDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.fling_test);
btnPrev = (Button)findViewById(R.id.btnPrev);
btnNext = (Button)findViewById(R.id.btnNext);
vfFlingTest = (ViewFlipper)findViewById(R.id.vfFlingTest);
initViews();
vfFlingTest.addView(tvFlipper);
vfFlingTest.addView(etFlipper);
vfFlingTest.addView(ivFlipper);
vfFlingTest.setOnTouchListener(this);
vfFlingTest.setLongClickable(true);
mGestureDetector = new GestureDetector(this);
btnPrev.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
showPreviousView();
}
});
btnNext.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
showNextView();
}
});
}
public void showPreviousView() {
vfFlingTest.setInAnimation(AnimationUtils.loadAnimation(
this, R.anim.slide_left_in));
vfFlingTest.setOutAnimation(AnimationUtils.loadAnimation(
this, R.anim.slide_right_out));
vfFlingTest.showPrevious();
}
public void showNextView() {
vfFlingTest.setInAnimation(AnimationUtils.loadAnimation(
this, R.anim.slide_right_in));
vfFlingTest.setOutAnimation(AnimationUtils.loadAnimation(
this, R.anim.slide_left_out));
vfFlingTest.showNext();
}
private void initViews() {
tvFlipper = new TextView(this);
tvFlipper.setText("这是中间");
etFlipper = new TextView(this);
etFlipper.setText("这是最右边");
ivFlipper = new ImageView(this);
ivFlipper.setLayoutParams(new LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
ivFlipper.setImageResource(R.drawable.pic1);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
android.os.Process.killProcess(android.os.Process.myPid());
super.onDestroy();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
finish();
return true;
}
return super.onKeyDown(keyCode, event);
}
public boolean onTouch(View view, MotionEvent event) {
return mGestureDetector.onTouchEvent(event);
}
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
if (e2.getX()-e1.getX() > 100) {
showPreviousView();
} else if (e1.getX() - e2.getX() > 100) {
showNextView();
}
return false;
}
@Override
public boolean onDown(MotionEvent arg0) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onLongPress(MotionEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,
float arg3) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onShowPress(MotionEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public boolean onSingleTapUp(MotionEvent arg0) {
// TODO Auto-generated method stub
return false;
}
}