资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

Android中怎么实现仿iOS侧滑退出当前界面功能

小编给大家分享一下Android中怎么实现仿iOS侧滑退出当前界面功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

创新互联专注于网站建设,为客户提供成都网站设计、成都做网站、网页设计开发服务,多年建网站服务经验,各类网站都可以开发,品牌网站建设,公司官网,公司展示网站,网站设计,建网站费用,建网站多少钱,价格优惠,收费合理。

首先看下效果图:

Android中怎么实现仿iOS侧滑退出当前界面功能

分析:

(1)要想模仿ios的这种效果,因为我们通过手指的滑动,所以这里肯定跟我们的滑动事件有关系(onInterceptTouchEvent,onTouchEvent这两个方法的关系,如果不清楚,请直接查阅事件传递机制原理)

(2)我们要想直接拦截我们的所有触摸事件,我们可以在上层父级布局中进行拦截和处理,这里我们想到了DecorView。首先我们应该知道Activity的顶级父View是DecorView,获取我们的DecorView也很简单

getWindow().getDecorView()

我们平时写的那些xml布局文件都是包裹在这个DecorView中的,所以这里我们就有了一个思路:
我们可以在我们的xml布局和DecorView中间添加一个中间布局(SlidingLayout),然后所有的滑动逻辑和滑动冲突全部在这里面处理。

(3)比较关键的是:当我们需要使用侧滑动能的Activity我们需要将它的主题设置成透明,这样滑动的时候就不会遮挡下面的Activity,代码如下:

 
   
  @android:color/transparent 
  true 
  @style/AppTheme.Slide.Animation 
 

(4)当我们滑动超过半屏的时候,退出当前界面,否则则回退到原始位置。这里使用Scroller

下面直接上代码进行分析:

1)、触摸事件的处理过程,按下的位置大于X轴的十分之一就拦截当前事件,交给SlidingLayout的onTouchEvent处理

/** 
 * 根据手指移动的距离判断是否拦截触摸事件 
 * 
 * @param ev 
 * @return 
 */ 
 @Override 
 public boolean onInterceptTouchEvent(MotionEvent ev) { 
 
  int x = (int) ev.getX(); 
  int y = (int) ev.getY(); 
  boolean mIntercept = false; 
  switch (ev.getAction()) { 
   case MotionEvent.ACTION_DOWN: 
 
    mInterceptDownX = x; 
    mLastInterceptX = x; 
    mLastInterceptY = y; 
    break; 
   case MotionEvent.ACTION_MOVE: 
 
    int moveX = x - mLastInterceptX; 
    int moveY = y - mLastInterceptY; 
    //按下的位置的X位置小于屏幕的十分之一,并且x移动的距离大于y移动的距离,就拦截 
    if (mInterceptDownX < (getWidth() / 10) && Math.abs(moveX) > Math.abs(moveY)) { 
     mIntercept = true; 
    } else { 
     mIntercept = false; 
    } 
    mLastInterceptX = x; 
    mLastInterceptY = y; 
 
    break; 
   case MotionEvent.ACTION_UP: //抬起的时候重置参数 
    mIntercept = false; 
    mInterceptDownX = mLastInterceptX = mLastInterceptY = 0; 
    break; 
  } 
  return mIntercept; 
 } 
 
 private int mTouchDownX; 
 private int mLastTouchX; 
 private int mLastTouchY; 
 
 @Override 
 public boolean onTouchEvent(MotionEvent event) { 
 
  boolean mConsumed = false; 
  int x = (int) event.getX(); 
  int y = (int) event.getY(); 
  switch (event.getAction()) { 
   case MotionEvent.ACTION_DOWN: 
 
    mTouchDownX = x; 
    mLastTouchX = x; 
    mLastTouchY = y; 
    break; 
   case MotionEvent.ACTION_MOVE: 
 
    int moveX = x - mLastTouchX; 
    int moveY = y - mLastTouchY; 
    if (mTouchDownX < (getWidth() / 10) && Math.abs(moveX) > Math.abs(moveY) && !mConsumed) { 
     mConsumed = true; 
    } 
    if (mConsumed) { 
     int rightMoveX = (int) (mLastTouchX - event.getX()); 
     if ((getScrollX() + rightMoveX) > 0) { //向左滑动的时候,getScrollX()和rightMoveX都大于0,所以禁止滑动 
      scrollTo(0, 0); 
     } else { 
      scrollBy(rightMoveX, 0); 
     } 
    } 
    mLastTouchX = x; 
    mLastTouchY = y; 
    break; 
   case MotionEvent.ACTION_UP: 
 
    mConsumed = false; 
    mTouchDownX = mLastTouchX = mLastTouchY = 0; 
    if(-getScrollX()

2)、滑动的偏移量超出屏幕的一办,就关闭当前界面否则回到初始位置

/** 
 * 滑动到最初的位置 
 */ 
 private void scrollBack() { 
  int startX = getScrollX(); 
  int dx = -getScrollX(); 
  mScroller.startScroll(startX, 0, dx, 0, 300); 
  invalidate(); 
 } 
 
 /** 
 * 向右滑动关闭 
 */ 
 private void scrollFinish(){ 
  int dx = -getScrollX() - getWidth(); 
  mScroller.startScroll(getScrollX(),0,dx,0,300); 
  invalidate(); 
 }

3)、我们可以将这些侧滑处理放在我们的BaseActivity当中,需要侧滑的Activity只要继承这个BaseActivity并且主题设置成透明就可以了

@Override 
 protected void onCreate(@Nullable Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  if(enableRightSliding()){ 
 
   SlidingLayout slidingLayout = new SlidingLayout(this); 
   slidingLayout.replaceCurrentLayout(this); 
  } 
 
 } 
 
 /** 
  * 子类重写这个方法true:允许向右滑动,false:禁止向右滑动 
  * @return 
  */ 
 protected boolean enableRightSliding(){ 
  return false; 
 }

以上是“Android中怎么实现仿iOS侧滑退出当前界面功能”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!


本文名称:Android中怎么实现仿iOS侧滑退出当前界面功能
文章路径:http://www.cdkjz.cn/article/gpdpjc.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220