滑动返回上一个界面的实现
来源:互联网 发布:阿里云盒子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
- 滑动返回上一个界面的实现
- 关于系统(ios7+)自带的向右滑动手势返回上一个界面的一个问题
- 关于导航控制器使用手势滑动返回上一个界面中途导航条消失的解决办法
- Android 返回上一个界面,返回上一个Activity
- Android 中实现在界面上右划返回上一个界面
- 如何返回上一个界面并传值给上一个界面
- WebView_返回键返回到上一个HTML界面不回到源生界面的方法
- Android - 返回上一个界面finish()方法
- Android - 返回上一个界面finish()方法
- android右滑返回上一个界面
- 右滑返回上一个界面FDFullscreenPopGesture
- 三星手机在返回上一个界面时,会闪现不该出现的界面
- 返回上一个页面的代码
- Activity多级界面跳转不断返回上一个界面解决方案
- NavigationBar隐藏后 返回上一个界面黑框问题解决
- 让具有导航栏的界面滑动返回
- 关于界面随着手指滑动的实现
- 仿网易、人人滑动界面的实现
- Android Battery一些信息获取方法
- is not allowed to connect to this MySQL server解决办法
- verilog-for 语句实例
- git 命令(1)
- 欢迎使用CSDN-markdown编辑器
- 滑动返回上一个界面的实现
- 改善 ASP.NET MVC 代码库的 5 点建议
- 宏正ATEN发行最新款双滑轨PS/2-USB双界面LCD控制端
- 我要开始学python了
- 用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等
- string.Format对C#字符串格式化
- Yii2简介以及高级模板安装
- 表名在数据库中的存储大小写略解
- 160121iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)