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

来源:互联网 发布:阿里云盒子root 编辑:程序博客网 时间:2024/05/19 23:09

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

先把主题设为透明或者自定义也行,下面贴出代码,原理是通过的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;@Overrideprotected 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);  }@Overridepublic 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());}@Overridepublic 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
原创粉丝点击