【Andoird】android的左右滑动的切换

主要采用的类是ViewFlipper、GestureDector、Animation类。首先我们得先了解一下Activite的位置定义如下图:


那么当手指向左滑动的时候就是查看下个View,其实当我们向左滑动的瞬间,发生两个动作,也就是当前屏幕的内容向左边滑出(从x=0%滑到x=-100%),而处于x=100%p位置的内容从右边滑入当前屏幕(即从x=100%px=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;
	}
	
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值