仿百度新闻左右侧滑demo

package com.example.mycehua;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;

public class MainActivity extends Activity implements OnTouchListener {

	int screenWidth;// 屏幕宽度
	View leftMenu, rightContent;// 左menu右content
	int left_padding_right = 50;// 左边完全显示时候留给右边的
	LinearLayout.LayoutParams menuParams;
	int leftEdge; // menu可以滑动到的左边缘
	int rightEdge = 0;
	float xDown, xMove, xUp;// 手指按下,移动,离开时候的横坐标
	boolean isMenuVisiable;// 左边menu是否可见
//	boolean isWantShowMenu, iswantShowContent;
	public static final int SNAP_VELOCITY = 200;// 指定手指滑动速度 大于这个值则表示滑动起作用
	VelocityTracker mVelocityTracker;// 计算手指滑动速度
	
	ImageView mback;
	TextView mtv;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initValues();
		rightContent.setOnTouchListener(this);
	}

	public void initValues() {
		WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
		screenWidth = windowManager.getDefaultDisplay().getWidth();
		leftMenu = findViewById(R.id.left_menu);
		rightContent = findViewById(R.id.right_content);
		menuParams = (LayoutParams) leftMenu.getLayoutParams();
		menuParams.width = screenWidth - left_padding_right;
		leftEdge = -menuParams.width;
		// 初始化左边缘开始位置
		menuParams.leftMargin = leftEdge;
		// 初始content的位置占满全屏
		rightContent.getLayoutParams().width = screenWidth;
		
		mback = (ImageView) findViewById(R.id.topback);
		mtv = (TextView) findViewById(R.id.mtv);
		mback.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				if(isMenuVisiable){
					scrollToContent();
				}else{
					scrollToMenu();
				}
			}
		});
	}
	
	public void btnclick(View view) {
		Button btn = (Button) view;
		switch (view.getId()) {
		case R.id.btn1:
			mtv.setText(btn.getText());
			scrollToContent();
			break;
		case R.id.btn2:
			mtv.setText(btn.getText());
			scrollToContent();
			break;
		case R.id.btn3:
			mtv.setText(btn.getText());
			scrollToContent();
			break;
		default:
			break;
		}
	}
	@Override
	public boolean onTouch(View v, MotionEvent event) {
		// TODO Auto-generated method stub
		createVelocityTracker(event);//相当于监听了滑动事件
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			xDown = event.getRawX();
			break;
		case MotionEvent.ACTION_MOVE:
			// 手指移动时,对比按下时的横坐标,计算出移动的距离,来调整menu的leftMargin值,从而显示和隐藏menu
			xMove = event.getRawX();
			int distanceX = (int) (xMove - xDown);
			if (isMenuVisiable) {
				menuParams.leftMargin = distanceX;
			} else {
				menuParams.leftMargin = leftEdge + distanceX;
			}
			// 控制左右滑动范围
			if (menuParams.leftMargin < leftEdge) {
				menuParams.leftMargin = leftEdge;
			} else if (menuParams.leftMargin > rightEdge) {
				menuParams.leftMargin = rightEdge;
			}
			leftMenu.setLayoutParams(menuParams);
			break;
		case MotionEvent.ACTION_UP:
			xUp = event.getRawX();
			if (wantShowMenu()) {
				if(shouldScrollToMenu()){
					scrollToMenu();
				}else{
					scrollToContent();
				}
			}else if(wantShowContent()){
				if(shouldScrollToContent()){
					scrollToContent();
				}else{
					scrollToMenu();
				}
			}
			recycleVelocityTracker();//回收VelocityTracker
			break;

		default:
			break;
		}
		return true;
	}

	// 是否显示menu
	public boolean wantShowMenu() {
		return xUp - xDown > 0 && !isMenuVisiable;
	}

	// 是否显示content
	private boolean wantShowContent() {
		return xUp - xDown < 0 && isMenuVisiable;
	}

	// 是否滑动到menu
	public boolean shouldScrollToMenu() {
		return xUp - xDown > screenWidth / 2 || getScrollVelocity() > SNAP_VELOCITY;
	}

	// 是否滑动到content
	public boolean shouldScrollToContent() {
		return xDown - xUp + left_padding_right > screenWidth / 2 || getScrollVelocity() > SNAP_VELOCITY;
	}

	// 获取手指在界面滑动速度
	public int getScrollVelocity() {
		mVelocityTracker.computeCurrentVelocity(1000);
		int xVelocity = (int) mVelocityTracker.getXVelocity();
		return Math.abs(xVelocity);
	}
	//滑动到menu
	private void scrollToMenu() {
		new ScrollTask().execute(30);
	}
	//滑动到content
	private void scrollToContent() {
		new ScrollTask().execute(-30);
	}
	//把触摸事件加入到mVelocityTracker
	public void createVelocityTracker(MotionEvent event){
		if(mVelocityTracker==null){
			mVelocityTracker = VelocityTracker.obtain();
		}
		mVelocityTracker.addMovement(event);
	}
	//回收mVelocityTracker对象
	public void recycleVelocityTracker(){
		mVelocityTracker.recycle();
		mVelocityTracker = null;
	}

	class ScrollTask extends AsyncTask<Integer, Integer, Integer>{

		@Override
		protected Integer doInBackground(Integer... speed) {
			// TODO Auto-generated method stub
			int leftMargin = menuParams.leftMargin;
			while(true){
				leftMargin += speed[0];
				if(leftMargin>rightEdge){
					leftMargin = rightEdge;
					break;
				}
				if(leftMargin<leftEdge){
					leftMargin = leftEdge;
					break;
				}
				publishProgress(leftMargin);
				sleep(20);
			}
			if (speed[0] > 0) {
				isMenuVisiable = true;
			} else {
				isMenuVisiable = false;
			}
			return leftMargin;
		}
		@Override
		protected void onProgressUpdate(Integer... leftMargin) {
			menuParams.leftMargin = leftMargin[0];
			leftMenu.setLayoutParams(menuParams);
		}
		@Override
		protected void onPostExecute(Integer leftMargin) {
			menuParams.leftMargin = leftMargin;
			leftMenu.setLayoutParams(menuParams);
		}
	}
	private void sleep(long millis) {
		try {
			Thread.sleep(millis);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

猜你喜欢

转载自hutuanle3.iteye.com/blog/1869624