模仿的豌豆荚滑动Menu 的 实现
效果:
其实就是利用监听手势。将主页面滑开。将下面一层布局的菜单展露出来。下面是布局文件。
<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 的 实现相关推荐
- 模仿ios微信滑动选项View
滑动选项View 额-其实这个我也不知道应该叫做什么,就是滑动出来的选项,就像ios版微信那样,向左滑动,滑出选项,看着就想试试模仿一下,下面来看看如何写. 首先制定思路,滑动出来的选项是一部分,作为 ...
- android studio上下滚动菜单,Android模仿美团顶部的滑动菜单实例代码
前言 本文主要给大家介绍了关于Android模仿美团顶部滑动菜单的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 先来看下效果图: 实现方法 这是通过 ViewPager ...
- android实现美团首页滑动菜单功能,Android模仿美团顶部的滑动菜单实例代码
前言 本文主要给大家介绍了关于android模仿美团顶部滑动菜单的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 先来看下效果图: 实现方法 这是通过 viewpager ...
- 爬虫学习笔记(十九)—— 滑动验证码
文章目录 一.概念 二.实现步骤 2.1.获取验证码图片 2.1.1.获取缺口图 2.1.2.获取滑块图 2.1.3.获取完整图 2.1.4.完整代码 2.2.计算缺口位置 2.3.模拟人工移动 2. ...
- python易盾滑动验证码
上selenium 比较好上手的一种验证码, cv2模板匹配方法找缺口图在背景图中的位置, 计算要移动的距离, 移动缺口图 ,要注意的是移动轨迹模拟人移动的加速和减速 from selenium im ...
- 艺赛旗RPA验证码处理系列(三):破解极验滑动验证码
目前艺赛旗RPA已经更新到8.0版本,可以让所有用户免费下载试用http://www.i-search.com.cn/index.html?from=line1 (复制链接下载) 一,介绍 一些网站会 ...
- 使用OpenCV 破解QQ登录中的滑动验证码
系列文章目录 第一篇: Java实现QQ登录 第二篇: Selenium QQ自动化登录 第三篇: 使用OpenCV 破解QQ登录中的滑动验证码 文章目录 系列文章目录 文章目录 前言 一.登录流程 ...
- 使用Selenium破解滑动验证码的原理及解决思路
介绍 现在出现了一种通过用户鼠标移动滑块来填补有缺口图片的验证码,我们叫做滑动验证码. 它的原理很简单,首先生成一张图片,然后随机挖去一块,在页面展示被挖去部分的图片,再通过js获取用户滑动距离,以及 ...
- selenium篇之滑动验证码
一.介绍 现在出现了一种通过用户鼠标移动滑块来填补有缺口图片的验证码,我们叫做滑动验证码.它的原理很简单,首先生成一张图片,然后随机挖去一块,在页面展示被挖去部分的图片,再通过js获取用户滑动距离,以 ...
最新文章
- 在html中选项卡怎么做,纯css3制作选项卡
- svn导出java项目_【SVN】导出项目后报错汇总
- 阿里巴巴开源 Sentinel,进一步完善 Dubbo 生态
- 关于AI你可能不知道的5件事情
- java csv to list_java – 如何轻松地将CSV文件处理为List
- 这样的 Spring Cloud 微服务项目太牛了!
- 持有至少百万美元钱包本周增至66,540,增长了150%
- python自动化开发-[第十四天]-javascript(续)
- 计算机的组成 —— 磁盘阵列(RAID)
- 使用fragment 浮动的显示内容
- 如何复位———异步复位,同步释放的方式,而且复位信号低电平有效(转)
- ZZULIOJ 1188: 选票统计(一)(结构体专题)
- 刨根问底:什么是yum源,yum的工作原理又是什么
- 第十三届蓝桥杯(Web 应用开发)线上模拟赛【第三题】(封装函数实现个人所得税计算器)
- java版我的世界怎么疾跑,Minecraft疾跑按键设置 我的世界怎么开疾跑
- lisp医院化验系统_lis系统参数(医院实验室信息管理系统).doc
- 基于Spring 4.0 的 Web Socket 聊天室/游戏服务端简单架构
- 低调现身北京的吴恩达,刚刚给人工智能公司下了个定义
- 轻舟已过万重山——计算机达人成长之路(31)
- 京东商品接口加解密算法解析