package com.xbrother.mobilecheck.base;import android.app.Activity;import android.os.Bundle;import android.view.MotionEvent;import android.view.VelocityTracker;import android.widget.Toast;import com.xbrother.mobilecheck.PatrolApplication;import com.xbrother.mobilecheck.R;import java.util.Timer;import java.util.TimerTask;/** * BaseActivity定义,子类必须实现其中的几个初始化方法 * <p>Title: BaseActivity.java</p>* <p>Description: </p>* <p>Company: 深圳市共济科技有限公司</p>* * @author qucun * @version <版本号> @date < 2015-11-13> @modified <修改人姓名>* @date 2015-11-13 * @history ********************************************************************* * @comment ********************************************************************* */public abstract class BaseActivity extends Activity {public static boolean isOpenDistanceBack = true; private boolean isExit = false;//手指上下滑动的最大速度private static final int YSPEED_MAX = 1000;// 手指向右移动的最小距离private static final int XDISTANCE_MIN = 100;// 手指向上或向下滑动的最大距离private static final int YDISTANCE_MAX = 100;// 手指按下时候的x/y坐标,移动时的x/y坐标private float xDown, yDown, xMove, yMove; private VelocityTracker mVelocityTracker;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);PatrolApplication.addActivity(this);// 初始化组件initViews();// 初始化数据initDatas();// 初始化事件监听initListeners();}/** * <初始化activity中包含的组件>*/public abstract void initViews();/** * 初始化组件的事件监听 */public abstract void initListeners();/** * 初始化数据源 */public abstract void initDatas();/* @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK){ exitBy2Click(); } return false; } *//** * 双击返回键退出应用程序 */private void exitBy2Click() { Timer tExit = null; if(isExit == false){isExit = true; //准备退出Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show(); // 设置定时器,如果2s内没有继续点击返回,取消退出准备tExit = new Timer();tExit.schedule(new TimerTask() {@Overridepublic void run() {isExit = false; // 取消退出} }, 2000);}else {// finish();PatrolApplication.exitApp(); System.exit(0);} }/** * 界面滑动事件响应处理 * @param ev* @return*/@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) { createVelocityTracker(ev); switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:xDown = ev.getRawX();yDown = ev.getRawY(); break; case MotionEvent.ACTION_MOVE:xMove = ev.getRawX();yMove = ev.getRawY(); break; case MotionEvent.ACTION_UP://计算滑动的距离int distanceX = (int) (xMove - xDown); int distanceY = (int) (yMove - yDown); int ySpeed = getScrollVelocity();// 关闭Activity需满足以下条件: // 1. x轴滑动的距离大于 XDISTANCE_MIN(设定的x轴最小移动距离) // 2. y轴滑动的距离在 YDISTANCE_MAX(设定的y轴最大移动距离) // 3. y轴上滑动速度小于设定的YSPEED_MAX(设定的最大滑动速度),否则认为是上下滑动而不是右滑结束activity // 4. 子activity中设置isOpenDistanceBack为true即打开状态,才能进行滑动返回if (distanceX > XDISTANCE_MIN && ySpeed < YSPEED_MAX&& (distanceY < YDISTANCE_MAX && distanceY > -YDISTANCE_MAX) && isOpenDistanceBack) { finish();//方法必须在startActivity()或者finish()之后执行,才有效果overridePendingTransition(R.anim.in_from_left, R.anim.out_from_right);} recycleVelocityTracker(); break;}return super.dispatchTouchEvent(ev);}/** * 创建VelocityTracker对象,并将触摸界面的滑动事件加入到VelocityTracker中 * * @param ev*/private void createVelocityTracker(MotionEvent ev) {if (mVelocityTracker == null) {mVelocityTracker = VelocityTracker.obtain();}mVelocityTracker.addMovement(ev);}/** * 计算每秒钟y方向滑动的距离 * * @return*/private int getScrollVelocity() {mVelocityTracker.computeCurrentVelocity(1000); int velocity = (int) mVelocityTracker.getYVelocity(); return Math.abs(velocity);}/** * 回收VelocityTracker对象 */private void recycleVelocityTracker() {mVelocityTracker.recycle();mVelocityTracker = null;}}
转载于:https://www.cnblogs.com/qu-xinyang/p/5565408.html