滑动返回上一层级


       为了实现自己的设计风格,体现自己的特色,大部分公司都会采用完全定制导航栏以及导航栏上面的控件,这样除了容易控制也能更方便、更随意。那其实自定义导航栏是一把双刃剑,满足自己需求以外,你可能还会丢失一些东西,比如说,手势拖动返回上一层级,可能就会失效了,那么,又想自定义控件,还想实现拖动返回的效果,那该怎么做呢:

       首先,要知道,iOS 7除了在传统的左上角添加返回键之外,还提供了右滑返回上一级界面的手势。他是UINavigationController新增的一个属性,因为所谓的拖动返回上一层级,其实就是进出栈。他是由导航控制器来实现的。而UINavigationController的这个属性就是interactivePopGestureRecognizer,即右滑返回只支持以UINavigationController为容器的ViewController间切换,要想在自定义容器中使用,还需要一些额外的工作。

 

1、一般的如果想控制ViewController是否启用右滑返回,只需要这样:不过此属性,默认就是YES

            self.navigationController.interactivePopGestureRecognizer.enabled= YES;

2、如果你是自定义了返回按钮,那么拖动返回效果就是失效,那么可以这么做:viewWillAppear中添加如下代码:           

           self.navigationController.interactivePopGestureRecognizer.delegate= self;

此时即可实现拖动返回的效果

3、但是此时你会发现一个问题:就是你在首页(跟视图)拖动返回的时候,你会发现,他并没有什么反应,此时,你再点击进入下一层级的话,会出现他并没有进入下一个界面,如果你此时进入后台,然后再重新进入前台的话,会发现他已经进入下一层级,其实,当你在首页拖动返回上一层级的时候,因为他是栈中的第一个,已经没有上一层级,所以在首页(跟视图)的时候,你需要禁用interactivePopGestureRecognizer的这个属性,设置成NO即可

那么你可以这么做:

      -(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer

     {

               if (self.navigationController.viewControllers.count == 1)//关闭主界面的右滑返回

              {

                        return NO;

              }else {

                        return YES;

              }

      }

这样,就不会出现上述问题了

 

 

 






### 左右滑动返回功能的实现 在 Android 应用中,可以通过重写 `onFling` 方法或者监听手势事件来实现左右滑动返回功能。以下是具体方法: #### 使用 GestureDetector 实现手势检测 GestureDetector 是 Android 提供的手势识别工具类,能够轻松捕获用户的触摸行为并转化为特定的手势动作。 ```java import android.gesture.Gesture; import android.os.Bundle; import android.view.GestureDetector; import android.view.MotionEvent; public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener { private GestureDetector gestureDetector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化 Gesture Detector gestureDetector = new GestureDetector(this, this); } @Override public boolean onTouchEvent(MotionEvent event) { return gestureDetector.onTouchEvent(event); // 将触控事件传递给 Gesture Detector } @Override public boolean onDown(MotionEvent e) { return false; // 不需要处理按下事件 } @Override public void onShowPress(MotionEvent e) {} @Override public boolean onSingleTapUp(MotionEvent e) { return false; // 不需要处理单击事件 } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return false; // 不需要处理滚动事件 } @Override public void onLongPress(MotionEvent e) {} @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { try { if (e1.getX() - e2.getX() > 100 && Math.abs(velocityX) > 800) { finish(); // 右滑返回页 overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.slide_out_right); return true; } else if (e2.getX() - e1.getX() > 100 && Math.abs(velocityX) > 800) { onBackPressed(); // 左滑触发返回按钮逻辑 return true; } } catch (Exception exception) {} return false; } } ``` 上述代码实现了基于手势的左右滑动返回功能[^1]。当用户从屏幕右侧快速向左侧滑动时,调用 `finish()` 结束当前 Activity;而从左侧快速向右侧滑动时,则模拟点击返回键的行为。 --- #### 修改 SystemUI 实现全局手势支持 如果希望在整个系统范围内启用类似的左右滑动返回功能,可以考虑修改系统的 `SystemUI` 组件。这通常用于 ROM 定制开发场景下。通过分析和调整 `SystemGestureNavigationController.java` 或其他相关文件中的手势逻辑,即可完成全局范围内的手势配置[^2]。 --- #### 自定义手势返回 UI 效果 为了满足更高层次的需求(如仿小米或华为的手势动画),可以在现有基础上进步优化视觉体验。例如,在手势滑动过程中动态显示半透明背景或其他过渡效果。这种定制化方案涉及对底层绘制机制的理解以及对动画框架的应用[^3]。 --- #### 利用 Keycode 模拟按键事件 另种方式是在某些特殊情况下利用键盘输入的方式间接达到目的。比如在外围设备接入的情况下设置侧滑手势发送 `KEYCODE_BACK` 键值,并在其内部捕捉该信号从而做出相应反应[^4]。 ```java @Override public boolean dispatchKeyEvent(@NonNull final KeyEvent event) { switch (event.getKeyCode()) { case KeyEvent.KEYCODE_BACK: if (view != null) { onBackPressed(); // 调用手动退栈函数 } return true; default: return super.dispatchKeyEvent(event); } } ``` 此片段展示了如何拦截物理按键消息流以便于扩展更多交互可能性。 --- ### 总结 以上介绍了几种常见的途径去达成所描述的目标——即让安卓程序具备响应水平方向移动进而切换视图的能力。开发者可以根据实际项目需求选取合适的技术路线加以实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值