自定义控件:ListView视差动画

2024-01-28 21:08

本文主要是介绍自定义控件:ListView视差动画,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

效果图

这里写图片描述

思路

在下拉过程中,不断扩大图片的height。下拉过程中图片的高度=原始ImageView的高度+下拉距离,当然也可以是下拉距离/2,这样下拉2个单位,图片的高度才增加1个单位。所以需要先要获取头布局中的ImageView,获取原高度。
当手指挪开的时候,需要让图片的高度复原,这个采用的是属性动画,在动画执行的过程中,获取value,并重新设置图片的高度。

Step1:先实现下拉过程中改变图片高度

overScrollBy():当headerView滑到顶部或者footerView滑到底部的视乎调用,参数说明

参数说明
deltaXx轴瞬时滑动距离(偏移量)
deltaYy轴瞬时滑动距离
scrollXx轴的滑动距离
scrollXy轴的滑动距离
scrollRangeXx轴滑动区间
scrollRangeYy轴滑动区间
maxOverScrollXx轴超过距离的最大值
maxOverScrollYy轴超过距离的最大值
isTouchEvent手指是否触摸

这些参数:
往下滑动:value<0
往上滑动:value>0

@Override
protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {if (deltaY < 0 && isTouchEvent) {int topHeight = ivHeader.getHeight() - deltaY / 2;setHeaderHeight(topHeight);}return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);
}
public void setHeaderImageView(ImageView ivHeader) {this.ivHeader = ivHeader;originHeaderHeight = ivHeader.getHeight();
}private void setHeaderHeight(int newHeight) {ivHeader.getLayoutParams().height = newHeight;ivHeader.requestLayout();
}

注意:必须是ListView渲染后才可以吧headerImageView传递过去,这样获取的才是正确的高度。

ivHeader.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {listView.setHeaderImageView(ivHeader);ivHeader.getViewTreeObserver().removeOnGlobalLayoutListener(this);}
});

Step2:还原高度

手指已开后 在属性动画中获取值,改变headerImageView的高度

@Override
public boolean onTouchEvent(MotionEvent ev) {if (ev.getAction() == MotionEvent.ACTION_UP) {int currentHeight = ivHeader.getHeight();ValueAnimator valueAnimator = ValueAnimator.ofInt(currentHeight, originHeaderHeight);valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {int height = (int) animation.getAnimatedValue();setHeaderHeight(height);}});valueAnimator.setInterpolator(new OvershootInterpolator());valueAnimator.setDuration(currentHeight - originHeaderHeight);valueAnimator.start();}return super.onTouchEvent(ev);
}

demo:https://gitee.com/customView/PuarallaxListView01.git

这篇关于自定义控件:ListView视差动画的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/654770

相关文章

CSS自定义浏览器滚动条样式完整代码

《CSS自定义浏览器滚动条样式完整代码》:本文主要介绍了如何使用CSS自定义浏览器滚动条的样式,包括隐藏滚动条的角落、设置滚动条的基本样式、轨道样式和滑块样式,并提供了完整的CSS代码示例,通过这些技巧,你可以为你的网站添加个性化的滚动条样式,从而提升用户体验,详细内容请阅读本文,希望能对你有所帮助...

C#实现WinForm控件焦点的获取与失去

《C#实现WinForm控件焦点的获取与失去》在一个数据输入表单中,当用户从一个文本框切换到另一个文本框时,需要准确地判断焦点的转移,以便进行数据验证、提示信息显示等操作,本文将探讨Winform控件... 目录前言获取焦点改变TabIndex属性值调用Focus方法失去焦点总结最后前言在一个数据输入表单

最好用的WPF加载动画功能

《最好用的WPF加载动画功能》当开发应用程序时,提供良好的用户体验(UX)是至关重要的,加载动画作为一种有效的沟通工具,它不仅能告知用户系统正在工作,还能够通过视觉上的吸引力来增强整体用户体验,本文给... 目录前言需求分析高级用法综合案例总结最后前言当开发应用程序时,提供良好的用户体验(UX)是至关重要

基于Python实现PDF动画翻页效果的阅读器

《基于Python实现PDF动画翻页效果的阅读器》在这篇博客中,我们将深入分析一个基于wxPython实现的PDF阅读器程序,该程序支持加载PDF文件并显示页面内容,同时支持页面切换动画效果,文中有详... 目录全部代码代码结构初始化 UI 界面加载 PDF 文件显示 PDF 页面页面切换动画运行效果总结主

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容

Qt QWidget实现图片旋转动画

《QtQWidget实现图片旋转动画》这篇文章主要为大家详细介绍了如何使用了Qt和QWidget实现图片旋转动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、效果展示二、源码分享本例程通过QGraphicsView实现svg格式图片旋转。.hpjavascript

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。