概念介绍

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实现下拉头部缩放功能相关推荐

  1. android微信下拉出现小程序,下拉头部-模仿微信聊天头部拉下小程序效果

    最近做了一个模仿微信聊天界面头部下拉出现小程序的效果,同时也可以通过头部的按钮控制弹出框的伸缩,GitHub传送门 先上效果: 滑动.gif 下面讲下我的思路: 1.通过runtime的关联方法 ru ...

  2. Xamarin. Android实现下拉刷新功能

    PS:发现文章被其他网站或者博客抓取后发表为原创了,给图片加了个水印 下拉刷新功能在安卓和iOS中非常常见,一般实现这样的功能都是直接使用第三方的库,网上能找到很多这样的开源库.然而在Xamarin. ...

  3. android listview下拉刷新动画,android 安卓 listview 支持下拉刷新 上拉加载更多

    [1]重写listViewimport java.text.SimpleDateFormat; import java.util.Date; import com.example.testdddlea ...

  4. android禁止下拉刷新,Android开发之无痕过渡下拉刷新控件的实现思路详解

    相信大家已经对下拉刷新熟悉得不能再熟悉了,市面上的下拉刷新琳琅满目,然而有很多在我看来略有缺陷,接下来我将说明一下存在的缺陷问题,然后提供一种思路来解决这一缺陷,废话不多说!往下看嘞! 1.市面一些下 ...

  5. Android智能下拉刷新框架-SmartRefreshLayout

    框架?下拉刷新控件还能框架化?智能又怎么回事?二话不多少先上Demo效果图,咱们再来探个究竟. Github 传送门 注意:本文仅仅是博客文章,主要用于项目介绍和宣传,由于发布时间关系,部分内容已经过 ...

  6. refreshcontrol 实现下拉刷新的功能

    该组件实现下拉刷新的功能.不过该组件是用在ScrollView的内部的,为ScrollView添加一个下拉刷新的功能.当ScrollView的垂直方向的偏移量scrollY:0的时候,手指往下拖拽Sc ...

  7. android缩放组件,Android控件实现图片缩放功能

    1 简介 先来一张效果图 TIM图片.gif 上图中灰色的一块是ImageView控件,ImageView中的图片进行左右上下移动,以及双指缩放. 对于android控件的缩放移动,点这里----an ...

  8. ajax实现下拉列表回显,layui实现下拉复选功能的例子(包括数据的回显与上传)

    一.layui下拉复选实现的背景:实现一个管理员拥有多个权限 二. 具体实现: //依赖资源 //页面显示 角色: xm-select-search xm-select-skin="defa ...

  9. layui 实现下拉多选功能 [xm-select]

    背景 近期负责的管理后台,有下拉多选的业务需求 通过网上的经验搜索,发现 xm-select 是个非常不错的选择 并且,当前的后台使用的正是 layui 前端框架 所以,在此整理一下 对下拉多选功能 ...

最新文章

  1. mysql 隐式锁和显示锁_锁的类型以及粒度,两段锁协议,隐式和显示锁
  2. oracle ora-01001,ORA-01001 and ORACLE游标
  3. 基于.NetCore3.1搭建项目系列 —— 使用Swagger导出文档 (番外篇)
  4. @RequiresPermissionss是否可以填写多种权限标识,只要满足其一就可以访问?
  5. Microsoft Dynamics CRM 2015 之安装SQL Server 2012过程中出现“启用windows功能NetFx3时出错...
  6. k3 xp服务器系统,如何在英文XP环境下安装k3系统.doc
  7. 下载Linux版(rpm格式),WPS Office 2019 Linux 11.1.0.9505版提供Deb、Rpm格式包下载
  8. f2fs文件系统的页缓存
  9. HDU 6078 Wavel Sequence【动态规划】
  10. 全网详解如何设计数据库的ER图,即实体关系图
  11. 公主连结显示服务器内部错误,公主连结Re:Dive无法连接服务器是什么原因
  12. DLL注入_远程线程注入
  13. opencv 编程总结与备忘
  14. 带孔的打印纸怎么设置_oki打印机打印带孔纸如何缩小纸张间距
  15. 几种自动化测试工具的比较
  16. 行业深度:区块链与金融、保险业那些不得不说的故事
  17. 2022超适合CAD使用的显卡清单推荐,快来看看
  18. 【java 工具类】集合判断是否为空
  19. python调用chrome插件_使用Python通过Selenium WebDriver打开chrome扩展
  20. 不知名网站编程(二)

热门文章

  1. Applications Manager——多个行业的游戏规则改变者
  2. CentOS屏幕录制
  3. 今天终于把ati集成显卡的linux驱动装好了,看我的3D桌面!哈哈!(博客搬家 2007-07-28 15:56)
  4. [Vuex系列] - Vuex中的getter的用法
  5. vue cli3.3 以上版本配置vue.config.js
  6. This Gradle plugin requires Studio 3.0 minimum
  7. in an effort to
  8. Linux-进程内存占用情况
  9. Entity Framework
  10. Javascript元编程创建DOM节点