Android实现下拉头部缩放功能
概念介绍
1、onInterceptTouchEvent()是用于处理事件(重点onInterceptTouchEvent这个事件是从父控件开始往子控件传的,直到有拦截或者到没有这个事件的view,然后就往回从子到父控件,这次是onTouch的)(类似于预处理,当然也可以不处理)并改变事件的传递方向,也就是决定是否允许Touch事件继续向下(子控件)传递,一但返回True(代表事件在当前的viewGroup中会被处理),则向下传递之路被截断(所有子控件将没有机会参与Touch事件),同时把事件传递给当前的控件的onTouchEvent()处理;返回false,则把事件交给子控件的onInterceptTouchEvent()
2、onTouchEvent()用于处理事件(重点onTouch这个事件是从子控件回传到父控件的,一层层向下传),返回值决定当前控件是否消费(consume)了这个事件,也就是说在当前控件在处理完Touch事件后,是否还允许Touch事件继续向上(父控件)传递。返回false,则向上传递给父控件,详细一点就是这个touch事件就给了父控件,那么后面的up事件就是到这里touch触发,不会在传给它的子控件。如果父控件依然是false,那touch的处理就给到父控件的父控件,那么up的事件处理都在父控件的父控件,不会触发下面的。
思路:
监听手势,记录下拉的距离,将滑动的值(可以几分之一)+头部原始值 从新付给头部参数
先看效果
详细步骤:
1.onInterceptTouchEvent部分,当手指按下记录当前的坐标值,返回false 意思是将事件传给子view,当开始拉动时,拦截事件,事件不传递给子view,记录最新的坐标值 mLastMotionY = y; 当手指离开屏幕时,取消拦截,将事件传递给子view
mLastMotionX = x;
@Overridepublic boolean onInterceptTouchEvent(MotionEvent event) {if (!isPullToZoomEnabled() || isHideHeader()) {return false;}final int action = event.getAction();if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {mIsBeingDragged = false;return false;}if (action != MotionEvent.ACTION_DOWN && mIsBeingDragged) {return true;}switch (action) {case MotionEvent.ACTION_MOVE: {if (isReadyForPullStart()) {final float y = event.getY(), x = event.getX();final float diff, oppositeDiff, absDiff;// We need to use the correct values, based on scroll// directiondiff = y - mLastMotionY;oppositeDiff = x - mLastMotionX;absDiff = Math.abs(diff);if (absDiff > mTouchSlop && absDiff > Math.abs(oppositeDiff)) {if (diff >= 1f && isReadyForPullStart()) {mLastMotionY = y;mLastMotionX = x;mIsBeingDragged = true;}}}break;}case MotionEvent.ACTION_DOWN: {if (isReadyForPullStart()) {mLastMotionY = mInitialMotionY = event.getY();mLastMotionX = mInitialMotionX = event.getX();mIsBeingDragged = false;}break;}}return mIsBeingDragged;}
2.onTouchEvent 部分,手指按下记录初始坐标值(并消耗事件),手指滑动记录最新的坐标值,同时调用pullEvent()函数来刷新界面
@Overridepublic boolean onTouchEvent(@NonNull MotionEvent event) {if (!isPullToZoomEnabled() || isHideHeader()) {return false;}if (event.getAction() == MotionEvent.ACTION_DOWN && event.getEdgeFlags() != 0) {return false;}switch (event.getAction()) {case MotionEvent.ACTION_MOVE: {if (mIsBeingDragged) {mLastMotionY = event.getY();mLastMotionX = event.getX();pullEvent();isZooming = true;return true;}break;}case MotionEvent.ACTION_DOWN: {if (isReadyForPullStart()) {mLastMotionY = mInitialMotionY = event.getY();mLastMotionX = mInitialMotionX = event.getX();return true;}break;}case MotionEvent.ACTION_CANCEL:case MotionEvent.ACTION_UP: {if (mIsBeingDragged) {mIsBeingDragged = false;// If we're already refreshing, just scroll back to the topif (isZooming()) {smoothScrollToTop();if (onPullZoomListener != null) {onPullZoomListener.onPullZoomEnd();}isZooming = false;return true;}return true;}break;}}return false;}
取竖直方向滑动的距离的1/2,传递给相头部和需要放大的图片 重新设置值
private void pullEvent() {final int newScrollValue;final float initialMotionValue, lastMotionValue;initialMotionValue = mInitialMotionY;lastMotionValue = mLastMotionY;newScrollValue = Math.round(Math.min(initialMotionValue - lastMotionValue, 0) / FRICTION);pullHeaderToZoom(newScrollValue);if (onPullZoomListener != null) {onPullZoomListener.onPullZooming(newScrollValue);}}
头部设置新的高度,同时图片同上设置新的高度
@Overrideprotected void pullHeaderToZoom(int newScrollValue) {Log.d(TAG, "pullHeaderToZoom --> newScrollValue = " + newScrollValue);Log.d(TAG, "pullHeaderToZoom --> mHeaderHeight = " + mHeaderHeight);if (mScalingRunnable != null && !mScalingRunnable.isFinished()) {mScalingRunnable.abortAnimation();}ViewGroup.LayoutParams localLayoutParams = mHeaderContainer.getLayoutParams();localLayoutParams.height = Math.abs(newScrollValue) + mHeaderHeight;mHeaderContainer.setLayoutParams(localLayoutParams);if (isCustomHeaderHeight) {ViewGroup.LayoutParams zoomLayoutParams = mZoomView.getLayoutParams();zoomLayoutParams.height = Math.abs(newScrollValue) + mHeaderHeight;mZoomView.setLayoutParams(zoomLayoutParams);}}
大概的思路如上
Android实现下拉头部缩放功能相关推荐
- android微信下拉出现小程序,下拉头部-模仿微信聊天头部拉下小程序效果
最近做了一个模仿微信聊天界面头部下拉出现小程序的效果,同时也可以通过头部的按钮控制弹出框的伸缩,GitHub传送门 先上效果: 滑动.gif 下面讲下我的思路: 1.通过runtime的关联方法 ru ...
- Xamarin. Android实现下拉刷新功能
PS:发现文章被其他网站或者博客抓取后发表为原创了,给图片加了个水印 下拉刷新功能在安卓和iOS中非常常见,一般实现这样的功能都是直接使用第三方的库,网上能找到很多这样的开源库.然而在Xamarin. ...
- android listview下拉刷新动画,android 安卓 listview 支持下拉刷新 上拉加载更多
[1]重写listViewimport java.text.SimpleDateFormat; import java.util.Date; import com.example.testdddlea ...
- android禁止下拉刷新,Android开发之无痕过渡下拉刷新控件的实现思路详解
相信大家已经对下拉刷新熟悉得不能再熟悉了,市面上的下拉刷新琳琅满目,然而有很多在我看来略有缺陷,接下来我将说明一下存在的缺陷问题,然后提供一种思路来解决这一缺陷,废话不多说!往下看嘞! 1.市面一些下 ...
- Android智能下拉刷新框架-SmartRefreshLayout
框架?下拉刷新控件还能框架化?智能又怎么回事?二话不多少先上Demo效果图,咱们再来探个究竟. Github 传送门 注意:本文仅仅是博客文章,主要用于项目介绍和宣传,由于发布时间关系,部分内容已经过 ...
- refreshcontrol 实现下拉刷新的功能
该组件实现下拉刷新的功能.不过该组件是用在ScrollView的内部的,为ScrollView添加一个下拉刷新的功能.当ScrollView的垂直方向的偏移量scrollY:0的时候,手指往下拖拽Sc ...
- android缩放组件,Android控件实现图片缩放功能
1 简介 先来一张效果图 TIM图片.gif 上图中灰色的一块是ImageView控件,ImageView中的图片进行左右上下移动,以及双指缩放. 对于android控件的缩放移动,点这里----an ...
- ajax实现下拉列表回显,layui实现下拉复选功能的例子(包括数据的回显与上传)
一.layui下拉复选实现的背景:实现一个管理员拥有多个权限 二. 具体实现: //依赖资源 //页面显示 角色: xm-select-search xm-select-skin="defa ...
- layui 实现下拉多选功能 [xm-select]
背景 近期负责的管理后台,有下拉多选的业务需求 通过网上的经验搜索,发现 xm-select 是个非常不错的选择 并且,当前的后台使用的正是 layui 前端框架 所以,在此整理一下 对下拉多选功能 ...
最新文章
- mysql 隐式锁和显示锁_锁的类型以及粒度,两段锁协议,隐式和显示锁
- oracle ora-01001,ORA-01001 and ORACLE游标
- 基于.NetCore3.1搭建项目系列 —— 使用Swagger导出文档 (番外篇)
- @RequiresPermissionss是否可以填写多种权限标识,只要满足其一就可以访问?
- Microsoft Dynamics CRM 2015 之安装SQL Server 2012过程中出现“启用windows功能NetFx3时出错...
- k3 xp服务器系统,如何在英文XP环境下安装k3系统.doc
- 下载Linux版(rpm格式),WPS Office 2019 Linux 11.1.0.9505版提供Deb、Rpm格式包下载
- f2fs文件系统的页缓存
- HDU 6078 Wavel Sequence【动态规划】
- 全网详解如何设计数据库的ER图,即实体关系图
- 公主连结显示服务器内部错误,公主连结Re:Dive无法连接服务器是什么原因
- DLL注入_远程线程注入
- opencv 编程总结与备忘
- 带孔的打印纸怎么设置_oki打印机打印带孔纸如何缩小纸张间距
- 几种自动化测试工具的比较
- 行业深度:区块链与金融、保险业那些不得不说的故事
- 2022超适合CAD使用的显卡清单推荐,快来看看
- 【java 工具类】集合判断是否为空
- python调用chrome插件_使用Python通过Selenium WebDriver打开chrome扩展
- 不知名网站编程(二)
热门文章
- Applications Manager——多个行业的游戏规则改变者
- CentOS屏幕录制
- 今天终于把ati集成显卡的linux驱动装好了,看我的3D桌面!哈哈!(博客搬家 2007-07-28 15:56)
- [Vuex系列] - Vuex中的getter的用法
- vue cli3.3 以上版本配置vue.config.js
- This Gradle plugin requires Studio 3.0 minimum
- in an effort to
- Linux-进程内存占用情况
- Entity Framework
- Javascript元编程创建DOM节点