最近公司需求要做一个分享解锁的功能,其中有一个more按钮是调用系统分享app的,具体是这样的:

  Intent shareIntent = new Intent();shareIntent.setAction(Intent.ACTION_SEND);shareIntent.setType("text/plain");shareIntent.putExtra(Intent.EXTRA_TEXT, extra);startActivityForResult(Intent.createChooser(shareIntent, "发送"), 100);

这样就可以调用系统的分享页面,并且把extra分享出去,但是这样去做就无法捕获到底有没有点击分享出去,虽然自己写分享页面也没法确切的知道,但是至少可以进一步保障。
以下是获取系统中含有分享功能的app:

 PackageManager pm = getPackageManager();Intent intent = new Intent(Intent.ACTION_SEND, null);intent.setType("text/plain");List<ResolveInfo> list = pm.queryIntentActivities(intent, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);

list就是获取到的系统分享,包括蓝牙、短信等系统app。

接下来进入主题,一个滑动层级的问题,主要功能是外面一个framelayout,里面包含一个recyclerview,然后初始显示的时候framelayout显示默认高度,然后滑动的时候先将framelayout滑动到固定高度,然后再来触发recyclerview的滑动机制,其实主要原理就是解决滑动先后,事件传递要非常了解,这块有问题的同学可以去看看touch事件传递。
项目中我自定义了一个recyclerview,还有一个framelayout,以便于可以修改滑动事件的传递流程:

ShareRecyclerView 的主要代码:

private float downY = -1, pointY = -1;@Override
public boolean onTouchEvent(MotionEvent e) {switch (e.getAction()) {case MotionEvent.ACTION_DOWN:downY = e.getRawY();pointY = e.getRawY();mShareLayout.setPointYFromChild(pointY);break;case MotionEvent.ACTION_MOVE:if (pointY == -1) {pointY = e.getRawY();downY = pointY;mShareLayout.setPointYFromChild(e.getRawY());return super.onTouchEvent(e);}boolean touch;if (mShareLayout != null) {touch = mShareLayout.isEnableTouch(e.getRawY() < pointY);if (touch) {mShareLayout.move(e);mShareLayout.setPointYFromChild(pointY);} else {mShareLayout.setPointYFromChild(e.getRawY());super.onTouchEvent(e);}}pointY = e.getRawY();return true;case MotionEvent.ACTION_UP://同步点击后up的z坐标数据if (mShareLayout != null) {mShareLayout.up(e);}pointY = -1;downY = -1;return false;case MotionEvent.ACTION_CANCEL:pointY = -1;downY = -1;break;}return super.onTouchEvent(e);
}public boolean onTouchUp(MotionEvent e) {return super.onTouchEvent(e);
}public boolean onTouchCancel(MotionEvent e) {e.setAction(MotionEvent.ACTION_CANCEL);return super.onTouchEvent(e);
}

ShareBottomLayout的主要代码

@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:if (vTracker == null) {vTracker = VelocityTracker.obtain();} else {vTracker.clear();}vTracker.addMovement(event);pointX = downX = event.getX();pointY = downY = event.getY();moved = false;return true;case MotionEvent.ACTION_MOVE:if (vTracker == null) {vTracker = VelocityTracker.obtain();}vTracker.addMovement(event);vTracker.computeCurrentVelocity(1000);if (pointY == -1) {pointY = event.getY();return false;}if (!isPointEnable(event.getX(), event.getY()) && !moved) {pointY = event.getY();return false;}moved = true;if (event.getY() < pointY) {LayoutParams params = (LayoutParams) content.getLayoutParams();if (params.height >= maxHeight) {pointY = event.getY();if (mRecyclerView.canScrollVertically(1)) {return true;}} else {int height = (int) (params.height + pointY - event.getY());setLayoutHeight(height);pointY = event.getY();return true;}} else {if (mRecyclerView.canScrollVertically(-1)) {pointY = event.getY();mRecyclerView.onTouchEvent(event);return true;}LayoutParams params = (LayoutParams) content.getLayoutParams();int height = (int) (params.height + pointY - event.getY());setLayoutHeight(height);pointY = event.getY();return true;}case MotionEvent.ACTION_UP:if (!moved && !isPointEnable(downX, downY) && !isPointEnable(pointX, pointY)) {dismiss();return true;}LayoutParams params = (LayoutParams) content.getLayoutParams();if (params.height < initHeight) {dismiss();} else if (vTracker != null && vTracker.getYVelocity() < -1000) {scrollToInit(params.height, maxHeight);} else if (params.height > initHeight && params.height < maxHeight) {scrollToInit(params.height, initHeight);}break;}return super.onTouchEvent(event);}

主要思路是系统会默认调用Recyclerview的touchdown方法去记录按下的点位置,然后调用recyclerview的move事件,去判断如果父类可以滑动(没有滑动到最大的高度),如果没有的话则return true ,然后调用父类的处理方法(这里父类的处理方式是逐步的增加他的高度)。

这里有几个坑:
1.滑动的时候必须用e.getRawY(),不然的话recyclerview和framelayout的滑动事件点是不一样的
2.滑动framelayout的时候也要调用recyclerview的ontouch的up或者cacel方法,不然可能有第一次无法点击item的问题。

写的可能有点low,经供参考。

最后附上github地址:https://github.com/luyongdong/scrolllayerview.git

仿咔叽分享页层级滑动效果相关推荐

  1. android 齿轮动画,Android仿正点闹钟时间齿轮滑动效果

    看到正点闹钟上的设置时间的滑动效果非常好看,自己就想做一个那样的,在网上就开始搜资料了,看到网上有的齿轮效果的代码非常多,也非常难懂,我就决定自己研究一下,现在我就把我的研究成果分享给大家.我研究的这 ...

  2. Android横向滚动卡片,Android仿探探卡片式滑动效果实现

    前言 第一次进入探探软件界面,就被这种通过卡片式滑动来选择"喜欢/不喜欢"的设计所吸引了.当时就非常想通过自己来实现这种仿探探式的效果,然而却没什么思路.不过毋庸置疑的是,这种效果 ...

  3. 仿百度动态Android源码,Android 仿百度手机助手首页滑动效果

    今天看到百度手机助手首页上的滑动效果非常nice,主要功能归结为: 1.当手指上划时,顶部搜索栏随手指移动距离而缩小到隐藏,隐藏后内容还是可以继续移动 2.手指下滑时,当显示内容达到第一个时,顶部搜索 ...

  4. 仿蜻蜓FM详情页嵌套滑动效果(IOS版本效果)

    闲来无事,看到蜻蜓FM的详情页面效果挺好玩的,于是乎仿一下,因为IOS版本和Android版本的效果不一致,看了下Android实现上更加复杂一点,所以先实现了IOS的方式,效果上大致的功能效果都有了 ...

  5. Android仿探探卡片式滑动效果实现

    第一次进入探探软件界面,就被这种通过卡片式滑动来选择"喜欢/不喜欢"的设计所吸引了.当时就非常想通过自己来实现这种仿探探式的效果,然而却没什么思路.不过毋庸置疑的是,这种效果的原理 ...

  6. Android高仿陌陌应用点点滑动效果

    效果图: 分析: 从效果上看图片的展示具有层次感,在数据结构上更像是stack,所以通过继承FrameLayout来实现(不清楚FrameLayout布局特点的可以先百度下哈),外面是通过继承Fram ...

  7. 仿华为EmotionUI 3.0滑动效果

    华为美腿妻手机卖的比较火,其中的一个两点是Emotion 3.0,里面各种UI让人耳目一新的感觉. 一开始看到我就喜欢了其中的很多设计.其中的一个是左右滑动类似于开源项目Indecator的.但是他的 ...

  8. 仿微博发现页吸顶效果

    整个首页布局采用 CoordinatorLayout 布局,实现正常的吸顶效果.然后监听 AppBarLayout 的展开与折叠.我直接上代码吧. 首页外部布局: <androidx.coord ...

  9. 微信小程序仿支付宝年账单页面滑动的效果展示

    要有遥不可及的梦想,也要有脚踏实地的本事.----------- Grapefruit.Banuit Gang(香柚帮) 近来要做一个年账单页面,类似于支付宝年账单,就是对一年下单的总结,但是支付宝页 ...

最新文章

  1. HADOOP-Checkpoint原理
  2. bzoj 1911: [Apio2010]特别行动队 2011-12-26
  3. layui数据表格(一:基础篇,数据展示、分页组件、表格内嵌表单和图片)
  4. 使用PyTorch从零开始构建Elman循环神经网络
  5. 百度地图label样式修正
  6. GTK真不容易,资料少,学得人也少!
  7. OpenCV之图像二值化与去噪
  8. 渗透测试工程师面试题大全(二)
  9. XXL-JOB漏洞解决,Eclipse Jetty HTTP请求走私漏洞
  10. java month_Java MonthDay getMonth()用法及代码示例
  11. HackerRank python练习——Quartiles
  12. TAM: TEMPORAL ADAPTIVE MODULE FOR VIDEO RECOGNITION ∗
  13. 【期末复习】计算机组成原理 袁春风
  14. 安装caffe中间遇到的一些问题
  15. 关不掉,新版微信这功能引用户怨声载道...
  16. Linux如何新建用户
  17. 室内定位之蓝牙Beacon-部署方案
  18. 【Go】Go 语言函数
  19. Java 生成随机汉字名称
  20. 操作系统的自我修养-02-玩你妹的“BIOS”

热门文章

  1. 无痛屠宰捕杀器:最大程度地减少对牲畜的痛苦
  2. oracle---常用函数4---日期函数
  3. 到曾经去过的地方,向经典致敬!
  4. 计算机专业必玩游戏,游戏推荐 篇三百八十五:非常好玩的机甲类游戏推荐
  5. AMF序列格式详细介绍
  6. CC26xx之内置温度传感器的使用
  7. 10分钟教你用python如何正确把妹-不知道妹子为何生气?那是因为你没学python
  8. 谈谈我对强迫症的理解 解决方法
  9. java封装一个类MyStock存放在cn.com.my包中。
  10. GPU加速原理技术介绍