Android 实现右滑返回功能

前言

右滑返回这个功能好像在iOS上蛮实用的,因为它的返回键在左上角,右手握持手机就得穿越整个屏幕去按它,不过对于大屏Android手机也是蛮实用的,右下角的返回键随着屏占比的增大按起来的难度也不小,就算有mBack这样的交互,多一个右滑返回也是极好的是吧?

上代码 SwipBackDemo

上效果图

SlidingPaneLayout

这个东西是Support V4中早就存在的,同样是侧滑,远没有侧滑菜单android.support.v4.widget.DrawerLayout被熟知,这玩意儿13年就有了...那时候我大概还在玩泥巴...

SlidingPaneLayout继承自GroupView,官方的貌似是作为侧滑菜单推出的,然鹅并没有多少人使用??但是可以根据这东西实现右滑返回。

原理:假设滑动的时候左侧有侧滑菜单,但是它是全透明的,所以可以看到底部一层的视图,然后拉出整个假设的侧滑菜单之后移除当前activity,就完成了右滑返回。

所以这个地方要定义的是滑动的anim,以及透明的style.主要是这个style:

<style name="Animation.SlidingBack" parent="@android:style/Animation.Activity">
    <item name="android:activityOpenEnterAnimation">@anim/slide_in_right</item>
    <item name="android:activityOpenExitAnimation">@anim/slide_out_right</item>
    <item name="android:activityCloseEnterAnimation">@anim/slide_in_right</item>
    <item name="android:activityCloseExitAnimation">@anim/slide_out_right</item>
    <item name="android:wallpaperOpenEnterAnimation">@anim/slide_in_right</item>
    <item name="android:wallpaperOpenExitAnimation">@anim/slide_out_right</item>
    <item name="android:wallpaperCloseEnterAnimation">@anim/slide_in_right</item>
    <item name="android:wallpaperCloseExitAnimation">@anim/slide_out_right</item>
    <item name="android:wallpaperIntraOpenEnterAnimation">@anim/slide_in_right</item>
    <item name="android:wallpaperIntraOpenExitAnimation">@anim/slide_out_right</item>
    <item name="android:wallpaperIntraCloseEnterAnimation">@anim/slide_in_right</item>
    <item name="android:wallpaperIntraCloseExitAnimation">@anim/slide_out_right</item>
  </style>

代码思路:实例化出slidingPaneLayout及相关属性设定,然后给slidingPaneLayout添加透明的侧滑视图和真实的内容区域视图,关键代码:

 SlidingPaneLayout slidingPaneLayout = new SlidingPaneLayout(this);
      //通过反射改变mOverhangSize的值为0,这个mOverhangSize值为菜单到右边屏幕的最短距离,默认是32dp,现在给它改成0
      try {
        //属性
        Field f_overHang = SlidingPaneLayout.class.getDeclaredField("mOverhangSize");
        f_overHang.setAccessible(true);
        f_overHang.set(slidingPaneLayout, 0);
      } catch (Exception e) {
        e.printStackTrace();
      }
      slidingPaneLayout.setPanelSlideListener(this);
      slidingPaneLayout.setSliderFadeColor(getResources().getColor(android.R.color.transparent));
      View leftView = new View(this);
      leftView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
      slidingPaneLayout.addView(leftView, 0);
      ViewGroup decor = (ViewGroup) getWindow().getDecorView();
      ViewGroup decorChild = (ViewGroup) decor.getChildAt(0);
      decorChild.setBackgroundColor(getResources().getColor(android.R.color.white));
      decor.removeView(decorChild);
      decor.addView(slidingPaneLayout);
      slidingPaneLayout.addView(decorChild, 1);

可以在一个基类中封装使用以上方法,然后需要返回的继承该类就行了。因为某些界面不需要侧滑返回,所以提供一个设置是否支持返回的方法,不需要返回的重写该方法返回false:

@Override
  protected boolean isSupportSwipeBack() {
    return false;
  }

上代码 SwipBackDemo

最后

这个是全屏滑动,所以我尝试了一些方法来让它只在边缘滑动,但是我失败了...所以如果有上文这种需求的话可以直接使用,解决跟listview和scrollview的滑动冲突的时候去重新判断onInterceptTouchEvent方法就行的,但是如果有边缘滑动的话还是尝试用SlidingMenu吧...

(0)

相关推荐

  • android 右滑返回的示例代码

    类似于微信的右滑返回,在BaseActivity里利用dispatchTouchEvent()拦截右滑动作,利用setTranslationX()实现动画,在DecorView里添加View作为滑动时的左侧阴影. 渐进步骤: 设置activity背景透明 重写finish()等方法设置activity的跳转动画 重写dispatchTouchEvent()拦截 所需要 右滑动作 重写onTouchEvent()给根布局设置偏移量 添加滑动时上层activity的左侧阴影 滑动时关联下层activ

  • Android右滑返回上一个界面的实现方法

    Android右滑返回上一个界面的实现方法 public class BaseActivity extends Activity implements OnTouchListener { public ProgressDialog progressDialog; public String states; public RequestQueue mQueue; /** 触摸时按下的点 **/ PointF downP = new PointF(); /** 触摸时当前的点 **/ PointF

  • Android仿微信右滑返回功能的实例代码

    先上效果图,如下: 先分析一下功能的主要技术点,右滑即手势判断,当滑到一直距离时才执行返回,并且手指按下的位置是在屏幕的最左边(这个也是有一定范围的),  这些可以实现onTouchEvent来实现. 接着就是返回时,有滑动效果,很显然这个是Acitivty切换动画实现的.好啦,分析完了就开干.下面上代码: @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ case Mot

  • Android中SwipeBack实现右滑返回效果

    现在有很多App支持右滑返回,比如知乎,效果比较赞. 于是自己对Activity和Fragment进行了继承,派生出SwipeBackActivity和SwipeBackFragment,用于对这种效果的实现,也就是只要继承这两个类就可以了. 效果如下 Activity Fragment Frgament的效果实现比Activity稍微简单,因为Activity要考虑到dectorView. 支持滑动的控件SwipeLayout,核心思路就是把原有的控件添加到支持滑动的控件中,SwipeLayo

  • Android实现类似IOS右滑返回的效果(原因分析及解决办法)

    使用类库SwipeBackLayout https://github.com/Issacw0ng/SwipeBackLayout 出现的问题: 1. 主Activity返回时黑屏或者返回只是看到桌面背景而没有看到上一个Activity界面 原因: 使用滑动返回需要在Activity的额主题中声明android:windowIsTranslucent=true,而该属性是设置Activity为是否为透明主题,当主Activity采用透明主题时,由于是app Activity栈中的第一个,所以滑动返

  • Android 实现右滑返回功能

    前言 右滑返回这个功能好像在iOS上蛮实用的,因为它的返回键在左上角,右手握持手机就得穿越整个屏幕去按它,不过对于大屏Android手机也是蛮实用的,右下角的返回键随着屏占比的增大按起来的难度也不小,就算有mBack这样的交互,多一个右滑返回也是极好的是吧? 上代码 SwipBackDemo 上效果图 SlidingPaneLayout 这个东西是Support V4中早就存在的,同样是侧滑,远没有侧滑菜单android.support.v4.widget.DrawerLayout被熟知,这玩意

  • Android微信右滑退出功能的实现代码

    先给大家展示下效果图,如果大家感觉效果不错,请参考实例代码, act2是Main2Activity,act3是Main3Activity 原理 滚动 首先我们知道每个Activity展示的内容一般都是DecorView去承载的,不知道的看下图,其中状态栏背景也包括在内: DecorView 所以我们第一步,只需要滚动DecorView内容或者平移DecorView就行了. 使上一个Activity可见 上面的Activity不可见其实是因为被当前Activity给挡住了.那问题来了. Q:为什么

  • Android实现全局右滑返回

    目前Android手机的全面屏越来越盛行,很多应用都已经支持了右滑返回上一级页面的功能,那么这个功能如何实现呢? 首先来说下思路吧,主要是通过 MotionEvent 这个事件通过对这个事件的不同处理,在通过 PointF 来监听按下去的点,处于什么位置. 接下来,通过代码给大家讲解一下 显示新建一个Gesture的这个样一个类,用来处理,滑动的逻辑. public class GestureHandler {} 接下来是定义相关的一些屏幕宽高.滑动的区间的一些表示 //屏幕宽高 int sWi

  • Android NavigationController 右滑手势详解

    苹果一直都在人机交互中尽力做到极致,在iOS7中,新增加了一个小小的功能,也就是这个api:self.navigationController.interactivePopGestureRecognizer.enabled = YES; 这个api功能就是在NavigationController堆栈内的UIViewController可以支持右滑手势,也就是不用点击右上角的返回按钮,轻轻在屏幕左边一滑,屏幕就会返回,随着ios设备屏幕的增大,这个小功能让手指短,拇指大和手残人士看到了福音. 这

  • iOS禁用右滑返回的两种方法

    本文实例为大家分享了iOS禁用右滑返回的具体代码,供大家参考,具体内容如下 方式一: 前提:如果使用的自定义UINavigationController基类,请不要在此基类里写相关的手势操作方法. 代码如下: -(void)viewDidAppear:(BOOL)animated{ if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.naviga

随机推荐