码迷,mamicode.com
首页 > 其他好文 > 详细

基础Activity,实现活动返回控制

时间:2016-06-06 23:41:44      阅读:379      评论:0      收藏:0      [点我收藏+]

标签:

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;

    @Override
    protected 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() {
				@Override
				public void run() {
					isExit = false; // 取消退出
				}
			}, 2000);
		}else {
//			finish();
            PatrolApplication.exitApp();
			
			System.exit(0);
		}
	}


    /**
     * 界面滑动事件响应处理
     * @param ev
     * @return
     */
    @Override
    public 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;
    }


}

  

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;

@Override
protected 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() {
@Override
public void run() {
isExit = false; // 取消退出
}
}, 2000);
}else {
// finish();
PatrolApplication.exitApp();

System.exit(0);
}
}


/**
* 界面滑动事件响应处理
* @param ev
* @return
*/
@Override
public 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;
}


}

基础Activity,实现活动返回控制

标签:

原文地址:http://www.cnblogs.com/qu-xinyang/p/5565408.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!