滑动返回上一个界面的实现

有句话叫:不要重复造轮子但是我想知道轮子是怎么造的

先把主题设为透明或者自定义也行,下面贴出代码,原理是通过的TouchEvent移动活动的跟视图内部内容

简单的实现功能,透明的Theme带来的动画没有显示没有处理,请自行通过搜索引擎解决

<pre name="code" class="java">private int lastY = 0;
	private int lastX = 0;
	private ScrollerHolder scrollerCompute;
	private int windowWidth=-1;
	private int downX=-1;
	//根据点击坐标判断是否可以移动
	private boolean canSlide=false;
	//是否已经移动了
	private boolean isSlide=false;
	private final static  int ROLLBACKTIME=500;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
		Resources resources = getResources();
		DisplayMetrics dm = resources.getDisplayMetrics();
		float density = dm.density;
		windowWidth = dm.widthPixels;
		downX= (int) (30 * density + 0.5f);  
	}

	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		switch (ev.getAction()) {
		case MotionEvent.ACTION_DOWN:
			lastY=(int) ev.getRawY();
			lastX=(int) ev.getRawX();
			if(lastX<=downX){
				canSlide=true;
			}
			break;
		case MotionEvent.ACTION_MOVE:
			if(canSlide){//如果点击的坐标满足需求
				int rawY = (int) ev.getRawY();
				int rawX = (int) ev.getRawX();
				int moveY = rawY - lastY;
				int moveX = rawX - lastX;
				lastY = rawY;
				lastX = rawX;
				if(isSlide){
					moveX(moveX);
				}else {
					if(moveX!=0){
						if(moveY<0){
							moveY=-moveY;
						}
						if(moveX/2>moveY){
							moveX(moveX);
							isSlide=true;
						}
					}
				}
			}
			break;
		case MotionEvent.ACTION_UP:
			if(isSlide){
				RecoveryContentView();
				canSlide=false;
				isSlide=false;
				return true;
			}
			break;
		}
		return super.dispatchTouchEvent(ev);
	}

	private void moveX(int moveX) {
		View decorView = getWindow().getDecorView();
		if(-moveX+decorView.getScrollX()<0){
			decorView.scrollBy(-moveX, 0);
		}
	}
	private void  RecoveryContentView(){
		View decorView = getWindow().getDecorView();
		if(scrollerCompute==null){
			scrollerCompute=new ScrollerHolder();
		}
		if(decorView.getScrollX()!=0){
			scrollerCompute.startScroll();
			decorView.post(scrollerCompute);
		}
	}

	class ScrollerHolder implements Runnable {
		private Scroller mScroller;
		public ScrollerHolder(){
			mScroller=new Scroller(getApplicationContext());
		}
		@Override
		public void run() {
			View decorView = getWindow().getDecorView();
			if(mScroller.computeScrollOffset()){
				int scrollX = -decorView.getScrollX();
				int currX =- mScroller.getCurrX();
				decorView.scrollTo(currX, 0);
				int scrollX2 = -decorView.getScrollX();
				if(scrollX2!=0&&scrollX2!=windowWidth){
					//2是我随便写的 个人觉得 不需要这么快的回调
					decorView.postDelayed(this,2);
				}else {
					if(scrollX2==windowWidth){
						Toast.makeText(getApplicationContext(), "结束当前", 0).show();
						finish();
					}
				}
			}
		}
		
		public void startScroll(){
			View decorView = getWindow().getDecorView();
			int scrollX = -decorView.getScrollX();
			int recoveryX=0;
			if(scrollX>windowWidth/2){
				recoveryX=windowWidth;
			}
			mScroller.startScroll(scrollX, 0, recoveryX-scrollX, 0, ROLLBACKTIME);
		}
	}


 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值