Android实现ScrollView顶部布局上滑缩小,下滑恢复
废话不多说,先上效果图:
代码实现也比较简易,我写了一个类继承了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顶部布局上滑缩小,下滑恢复相关推荐
- android上滑隐藏动画,ListView上滑和下滑,显示和隐藏Toolbar的实现方法
1.准备Toolbar 先隐藏系统自带的actionbar,在AndroidManifest.xml文件标签中: android:theme="@style/Theme.AppCompat. ...
- js判断手指的上滑,下滑,左滑,右滑,事件监听
2019独角兽企业重金招聘Python工程师标准>>> 原理:1:当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和staerY: 2:当触发touchmo ...
- 移动端html右滑空白,移动端之touch事件_上滑、下滑、左滑和右滑
开发app的前端框架有哪些 移动 原理:第一,当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和纵坐标startY:第二,当触发touchmove事件时,在获取此时手指的横坐 ...
- Android之ScrollView滚动布局控件使用以及显示新闻网页
ScrollView滚动布局使用原理: ①滚动产生的条件是,里面的内容大于物理尺寸 ②ScrollView里面只有一个子元素,这个子元素就是一个线性布局LinearLayout,我们可以在线性布局中添 ...
- 判断滚动条是上滑还是下滑
var beforeScrollTop = document.body.scrollTop;$(window).scroll(function(){var afterScrollTop = docum ...
- js判断手指上滑和下滑
<script>var startX = 0,startY = 0;function touchStart(evt){try{var touch = evt.touches[0], //获 ...
- 聊天软件中的窗口上滑和下滑提示上下线
聊天软件中右下角窗口上滑提示有好友上线,窗口下滑提示有好友下线. 在 Qt 下实现此功能,用到的类有 QPoint QTimer mainwindow.h 1 #ifndef MAINWINDOW_ ...
- android仿探探卡片右滑缩小,仿探探卡片滑动选择
探探的滑动选择妹子的功能,算是一个很经典的交互方式.自从出来以后可以说是备受关注,渐渐地很多类似功能的app也都有尝试.实现也是具有综合性的挑战,所以说网上也是有不少例子的,在这里我通过自定义View ...
- android+仿豌豆荚界面,android仿豌豆荚风格的上滑缩放悬停title (缩放主页背景)
[实例简介] [实例截图] [核心代码] package com.flavienlaurent.notboringactionbar; import android.animation.Animato ...
最新文章
- 利用服务器修改服务器数据,用Jquery实现可编辑表格并用AJAX提交到服务器修改数据...
- ActionScript3.0自定义Flex组件问题 重写组件的使用
- Linux-makefile
- 未完全关闭数据库导致ORA-01012: not logged的解决
- AUTHORITY-CHECK
- P2024 食物链 (补集)
- QTP之对测试用例的自动化过程的分解
- python enumerate用法总结_python enumerate用法总结
- Android之应用坐标系统全面详解
- CentOS 上snmp的安装和配置
- iOS - 视频开发
- ajax显示dataframe,如何使用ajax在运行时显示shell脚本的输出
- winrar 4.20 注册码
- 如何批量提取多个 PDF 文档中的图片
- excel 多行 取消隐藏_如何在Excel 2013中隐藏和取消隐藏行和列
- springBoot2学习
- SAP中不同质检类型对收货的影响的现实案例分析
- 膜拜!京东大牛彻底讲透Java多线程面试题,看完直怼阿里面试官,堪称吾辈楷模!
- jsp+servlet搭建在线投票问卷系统
- charts漏斗图表_漏斗图 | ECharts 数据可视化实验室