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(); } } }
仿百度新闻左右侧滑demo
猜你喜欢
转载自hutuanle3.iteye.com/blog/1869624
今日推荐
周排行