废话不多说,先上效果图:

代码实现也比较简易,我写了一个类继承了ScrollView,并重写onTouchEvent以支持头部布局的变化。

当然,这么做需要手动关联一下 头布局、图片。

上核心代码:

package com.jh.customscroll;import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;import com.jh.customscroll.exception.ParamsErrorException;/***自定义支持顶部布局上滑缩小,下滑放大的ScrollView*/public class MyScrollView extends ScrollView {private static final String TAG = "MyScrollView";private View headerView;private ImageView imgView;private int imgOriginalHeight;private int maxHeight;private int minHeight = 0;private boolean mScaling = false; // 是否正在放大private float downYPoint = 0;/*** 变化类型*/enum ChangeType {/*缩小,放大*/Narrow, Enlarge}public MyScrollView(Context context) {super(context);}public MyScrollView(Context context, AttributeSet attrs) {super(context, attrs);}public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}public void setHeaderView(View headerView, ImageView imgView) {this.headerView = headerView;this.imgView = imgView;this.imgOriginalHeight = imgView.getHeight();this.maxHeight = headerView.getHeight();if (maxHeight <= 0 || minHeight < 0 || minHeight >= maxHeight) {throw new ParamsErrorException("参数错误...");}}@Overridepublic boolean onTouchEvent(MotionEvent ev) {switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:Log.w(TAG, "down .. Y == " + ev.getY());downYPoint = ev.getY();break;case MotionEvent.ACTION_MOVE: {if (getScrollY() == 0) {float distance = ev.getY() - downYPoint;downYPoint = ev.getY();if (distance < 0 && canNarrow()) {measureHeaderView(distance, ChangeType.Narrow);cancelPendingInputEvents();return true;} else if (distance > 0 && canEnlarge()) {measureHeaderView(distance, ChangeType.Enlarge);return true;}}break;}case MotionEvent.ACTION_UP:Log.e(TAG, "up .. Y == " + ev.getY());break;}return super.onTouchEvent(ev);}/*** 可以缩小** @return*/private boolean canNarrow() {if (headerView == null) {return false;}return headerView.getHeight() > minHeight;}/*** 可以放大** @return*/private boolean canEnlarge() {if (headerView == null) {return false;}return headerView.getHeight() < maxHeight;}/*** 根据移动的距离,重新计算headerView的高度** @param distance* @return*/private void measureHeaderView(float distance, ChangeType changeType) {ViewGroup.LayoutParams params = headerView.getLayoutParams();params.height = headerView.getHeight() + (int) distance;if (params.height < minHeight) {params.height = minHeight;} else if (params.height > maxHeight) {params.height = maxHeight;} else if (params.height < 0) {params.height = 0;}Log.i(TAG, "headerView.height == " + params.height);headerView.setLayoutParams(params);measureImageView(params.height);}/*** 重新计算图片大小** @param headerViewHeight*/private void measureImageView(int headerViewHeight) {if (imgView != null) {double multiple = (headerViewHeight * 1.00) / (maxHeight * 1.00);LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) imgView.getLayoutParams();params.height = (int) (imgOriginalHeight * multiple);if (params.height > imgOriginalHeight) {params.height = imgOriginalHeight;}imgView.setLayoutParams(params);}}}

其余代码暂时不贴了,这里给一下资源下载地址:

CSDN:http://download.csdn.net/download/yanjunhui2011/10028253

Android实现ScrollView顶部布局上滑缩小,下滑恢复相关推荐

  1. android上滑隐藏动画,ListView上滑和下滑,显示和隐藏Toolbar的实现方法

    1.准备Toolbar 先隐藏系统自带的actionbar,在AndroidManifest.xml文件标签中: android:theme="@style/Theme.AppCompat. ...

  2. js判断手指的上滑,下滑,左滑,右滑,事件监听

    2019独角兽企业重金招聘Python工程师标准>>> 原理:1:当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和staerY: 2:当触发touchmo ...

  3. 移动端html右滑空白,移动端之touch事件_上滑、下滑、左滑和右滑

    开发app的前端框架有哪些 移动 原理:第一,当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和纵坐标startY:第二,当触发touchmove事件时,在获取此时手指的横坐 ...

  4. Android之ScrollView滚动布局控件使用以及显示新闻网页

    ScrollView滚动布局使用原理: ①滚动产生的条件是,里面的内容大于物理尺寸 ②ScrollView里面只有一个子元素,这个子元素就是一个线性布局LinearLayout,我们可以在线性布局中添 ...

  5. 判断滚动条是上滑还是下滑

    var beforeScrollTop = document.body.scrollTop;$(window).scroll(function(){var afterScrollTop = docum ...

  6. js判断手指上滑和下滑

    <script>var startX = 0,startY = 0;function touchStart(evt){try{var touch = evt.touches[0], //获 ...

  7. 聊天软件中的窗口上滑和下滑提示上下线

    聊天软件中右下角窗口上滑提示有好友上线,窗口下滑提示有好友下线. 在 Qt 下实现此功能,用到的类有 QPoint  QTimer mainwindow.h 1 #ifndef MAINWINDOW_ ...

  8. android仿探探卡片右滑缩小,仿探探卡片滑动选择

    探探的滑动选择妹子的功能,算是一个很经典的交互方式.自从出来以后可以说是备受关注,渐渐地很多类似功能的app也都有尝试.实现也是具有综合性的挑战,所以说网上也是有不少例子的,在这里我通过自定义View ...

  9. android+仿豌豆荚界面,android仿豌豆荚风格的上滑缩放悬停title (缩放主页背景)

    [实例简介] [实例截图] [核心代码] package com.flavienlaurent.notboringactionbar; import android.animation.Animato ...

最新文章

  1. 利用服务器修改服务器数据,用Jquery实现可编辑表格并用AJAX提交到服务器修改数据...
  2. ActionScript3.0自定义Flex组件问题 重写组件的使用
  3. Linux-makefile
  4. 未完全关闭数据库导致ORA-01012: not logged的解决
  5. AUTHORITY-CHECK
  6. P2024 食物链 (补集)
  7. QTP之对测试用例的自动化过程的分解
  8. python enumerate用法总结_python enumerate用法总结
  9. Android之应用坐标系统全面详解
  10. CentOS 上snmp的安装和配置
  11. iOS - 视频开发
  12. ajax显示dataframe,如何使用ajax在运行时显示shell脚本的输出
  13. winrar 4.20 注册码
  14. 如何批量提取多个 PDF 文档中的图片
  15. excel 多行 取消隐藏_如何在Excel 2013中隐藏和取消隐藏行和列
  16. springBoot2学习
  17. SAP中不同质检类型对收货的影响的现实案例分析
  18. 膜拜!京东大牛彻底讲透Java多线程面试题,看完直怼阿里面试官,堪称吾辈楷模!
  19. jsp+servlet搭建在线投票问卷系统
  20. charts漏斗图表_漏斗图 | ECharts 数据可视化实验室

热门文章

  1. idea运行时出现PermGen Space
  2. python console
  3. arcgis操作:解决空间连接所出现的问题
  4. php冒泡从小到大,php冒泡排序从小到大的操作
  5. tfrecord读取过程简介
  6. for循环和forEach详解
  7. 回调地狱和Promise
  8. css网页favicon_favicon ico网页图标制作 IconWorkshop软件下载
  9. 主板点不亮 复位BIOS_什么是主板
  10. excel如何批量将图片导入到批注并导入图片名称