效果:

其实就是利用监听手势。将主页面滑开。将下面一层布局的菜单展露出来。下面是布局文件。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity" ><LinearLayoutandroid:id="@+id/listMenu"android:layout_width="50dp"android:layout_height="match_parent"android:layout_alignParentBottom="true"android:layout_alignParentRight="true"android:layout_alignParentTop="true"android:background="@drawable/f_1"android:orientation="vertical" ></LinearLayout><RelativeLayoutandroid:id="@+id/content"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/back"></RelativeLayout></RelativeLayout>

利用OnGestureListener 去监听手势的变化。,当然,其实后面发现大可不必。直接在OnTouch里面写就好。更简单。记录Down的位置,之后move事件,取得当前触摸位置的绝对坐标。记得是绝对坐标,不要用getX() 取坐标。那样只是取得一个相对的坐标。而你的主页面在移动,你希望的是手指和主页面的相对移动距离为0 。自然是不能够用getRawX() 取相对坐标。

另外如果用OnGestureListener 去实现的,记得不要用OnScroll函数里面的distanceX 那个也是由相对坐标得到。自然,实现后也是会有很多错误的。所以应该用e2去获得绝对坐标与e1的绝对坐标相减,得到移动的距离。

         @Overridepublic void onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {    //distanceX 是getX() 相减的,即是相对控件的坐标Log.i(TAG,"distanceX:"+distanceX+","+"e2-e1:"+e2.getRawX()+"-"+e1.getRawX());int dis = (int) (e2.getRawX()-e1.getRawX());RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) content.getLayoutParams();if(dis<0){//left e2-e1<0if(-dis<menuWidth&¶ms.rightMargin<menuWidth){params.rightMargin =-dis;params.leftMargin =dis;Log.i(TAG,"params.rightMargin:"+params.rightMargin+",params.leftMargin:"+params.leftMargin);content.setLayoutParams(params);}else{params.rightMargin =menuWidth;params.leftMargin =-menuWidth;Log.i(TAG,"params.rightMargin:"+params.rightMargin+",params.leftMargin:"+params.leftMargin);content.setLayoutParams(params);}}else{//rightif(dis<menuWidth&¶ms.rightMargin>0){params.rightMargin =menuWidth-dis;params.leftMargin =-(menuWidth-dis);Log.i(TAG,"params.rightMargin:"+params.rightMargin+",params.leftMargin:"+params.leftMargin);content.setLayoutParams(params);}else{params.rightMargin =0;params.leftMargin =0;Log.i(TAG,"params.rightMargin:"+params.rightMargin+",params.leftMargin:"+params.leftMargin);content.setLayoutParams(params);}}Log.i(TAG,"onscroll");}

建议直接设置主页面的OnTouchListener,免得一大堆东西。那个onGestureListener 很多函数都用不上。

当然最后就是移动部分后面,自动的动画了。学了下AysncTask 。这个用起来就会逻辑性很好了。

         content.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubLog.i(TAG,"ontouchEvent");boolean result = detector.onTouchEvent(event);  //建议直接在此处检测手势if(event.getAction()==MotionEvent.ACTION_UP){//结束switch(gestureListener.getDirection()){case SlideMenuOnGestureListener.LEFT://启动向左的动画new UpdateMargin(MoveDirection.LEFT).execute(gestureListener.getVelocityX());menuhasOpen = true;Log.i(TAG,"left end");break;case SlideMenuOnGestureListener.RIGHT://启动向右的动画new UpdateMargin(MoveDirection.RIGHT).execute(gestureListener.getVelocityX());menuhasOpen = false;Log.i(TAG,"right end");break;case SlideMenuOnGestureListener.NO_SCROLL:Log.i(TAG,"no scroll");//返回 恢复if(menuhasOpen){new UpdateMargin(MoveDirection.LEFT).execute(gestureListener.getVelocityX());}else{new UpdateMargin(MoveDirection.RIGHT).execute(gestureListener.getVelocityX());}break;}}return result;}});

动画:

 static enum MoveDirection{LEFT,RIGHT;}/*** * @author houzhi* Boolean  true 代表左*/class UpdateMargin extends AsyncTask<Float, Integer, Void>{final static long SLEEP_TIME = 50L;final static int MOVE_DISTANCE = 30;public MoveDirection direction;public UpdateMargin(MoveDirection direction){this.direction = direction; }boolean isLeft ;@Overrideprotected void onPostExecute(Void result) {// TODO Auto-generated method stubsuper.onPostExecute(result);}@Overrideprotected void onProgressUpdate(Integer... values) {RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams )content.getLayoutParams();layoutParams.leftMargin=values[0];layoutParams.rightMargin=values[1];content.setLayoutParams(layoutParams);}@Overrideprotected Void doInBackground(Float... params) {RelativeLayout.LayoutParams layoutParams ;int v = (int)(float)(params[0]/(100/SLEEP_TIME));switch(direction){case LEFT://leftwhile(true){layoutParams = (RelativeLayout.LayoutParams )content.getLayoutParams();if(layoutParams.rightMargin>=menuWidth){publishProgress(-menuWidth,menuWidth);break;}publishProgress(layoutParams.leftMargin-MOVE_DISTANCE,layoutParams.rightMargin+MOVE_DISTANCE);try {TimeUnit.MILLISECONDS.sleep(SLEEP_TIME);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}break;case RIGHT://rightwhile(true){layoutParams = (RelativeLayout.LayoutParams )content.getLayoutParams();if(layoutParams.rightMargin-MOVE_DISTANCE<=0){      //保证下一次能够运行。publishProgress(0,0);break;}publishProgress(layoutParams.leftMargin+MOVE_DISTANCE,layoutParams.rightMargin-MOVE_DISTANCE);try {TimeUnit.MILLISECONDS.sleep(SLEEP_TIME);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}break;}return null;}

模仿的豌豆荚滑动Menu 的 实现相关推荐

  1. 模仿ios微信滑动选项View

    滑动选项View 额-其实这个我也不知道应该叫做什么,就是滑动出来的选项,就像ios版微信那样,向左滑动,滑出选项,看着就想试试模仿一下,下面来看看如何写. 首先制定思路,滑动出来的选项是一部分,作为 ...

  2. android studio上下滚动菜单,Android模仿美团顶部的滑动菜单实例代码

    前言 本文主要给大家介绍了关于Android模仿美团顶部滑动菜单的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 先来看下效果图: 实现方法 这是通过 ViewPager ...

  3. android实现美团首页滑动菜单功能,Android模仿美团顶部的滑动菜单实例代码

    前言 本文主要给大家介绍了关于android模仿美团顶部滑动菜单的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 先来看下效果图: 实现方法 这是通过 viewpager ...

  4. 爬虫学习笔记(十九)—— 滑动验证码

    文章目录 一.概念 二.实现步骤 2.1.获取验证码图片 2.1.1.获取缺口图 2.1.2.获取滑块图 2.1.3.获取完整图 2.1.4.完整代码 2.2.计算缺口位置 2.3.模拟人工移动 2. ...

  5. python易盾滑动验证码

    上selenium 比较好上手的一种验证码, cv2模板匹配方法找缺口图在背景图中的位置, 计算要移动的距离, 移动缺口图 ,要注意的是移动轨迹模拟人移动的加速和减速 from selenium im ...

  6. 艺赛旗RPA验证码处理系列(三):破解极验滑动验证码

    目前艺赛旗RPA已经更新到8.0版本,可以让所有用户免费下载试用http://www.i-search.com.cn/index.html?from=line1 (复制链接下载) 一,介绍 一些网站会 ...

  7. 使用OpenCV 破解QQ登录中的滑动验证码

    系列文章目录 第一篇: Java实现QQ登录 第二篇: Selenium QQ自动化登录 第三篇: 使用OpenCV 破解QQ登录中的滑动验证码 文章目录 系列文章目录 文章目录 前言 一.登录流程 ...

  8. 使用Selenium破解滑动验证码的原理及解决思路

    介绍 现在出现了一种通过用户鼠标移动滑块来填补有缺口图片的验证码,我们叫做滑动验证码. 它的原理很简单,首先生成一张图片,然后随机挖去一块,在页面展示被挖去部分的图片,再通过js获取用户滑动距离,以及 ...

  9. selenium篇之滑动验证码

    一.介绍 现在出现了一种通过用户鼠标移动滑块来填补有缺口图片的验证码,我们叫做滑动验证码.它的原理很简单,首先生成一张图片,然后随机挖去一块,在页面展示被挖去部分的图片,再通过js获取用户滑动距离,以 ...

最新文章

  1. 在html中选项卡怎么做,纯css3制作选项卡
  2. svn导出java项目_【SVN】导出项目后报错汇总
  3. 阿里巴巴开源 Sentinel,进一步完善 Dubbo 生态
  4. 关于AI你可能不知道的5件事情
  5. java csv to list_java – 如何轻松地将CSV文件处理为List
  6. 这样的 Spring Cloud 微服务项目太牛了!
  7. 持有至少百万美元钱包本周增至66,540,增长了150%
  8. python自动化开发-[第十四天]-javascript(续)
  9. 计算机的组成 —— 磁盘阵列(RAID)
  10. 使用fragment 浮动的显示内容
  11. 如何复位———异步复位,同步释放的方式,而且复位信号低电平有效(转)
  12. ZZULIOJ 1188: 选票统计(一)(结构体专题)
  13. 刨根问底:什么是yum源,yum的工作原理又是什么
  14. 第十三届蓝桥杯(Web 应用开发)线上模拟赛【第三题】(封装函数实现个人所得税计算器)
  15. java版我的世界怎么疾跑,Minecraft疾跑按键设置 我的世界怎么开疾跑
  16. lisp医院化验系统_lis系统参数(医院实验室信息管理系统).doc
  17. 基于Spring 4.0 的 Web Socket 聊天室/游戏服务端简单架构
  18. 低调现身北京的吴恩达,刚刚给人工智能公司下了个定义
  19. 轻舟已过万重山——计算机达人成长之路(31)
  20. 京东商品接口加解密算法解析

热门文章

  1. 安装Linux系统时卡在命令行了,从硬盘安装Linux和从Grub命令行启动操作系统
  2. 学Python的90个建议
  3. 面试总结:移动web设计与开发
  4. 唱歌如何保持高位置_什么是高位置发声?
  5. 【操作系统】第一章 绪论
  6. 美白宫高级顾问遭CWA黑客组织网络攻击
  7. 昔日烟王褚时健办果园成亿万富翁 拒上市圈钱
  8. 国企单位软考高级是否值得备考?
  9. 有空赚赚美元! 美国的外包项目交易网站
  10. PingCAP Clinic 诊断服务简介