自定义控件: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

相关文章

【前端学习】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注册和解析的核心原理。

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:中(人物移动、跳起、静止动作)

上回我们学到创建一个地形和一个人物,今天我们实现一下人物实现移动和跳起,依次点击,我们准备创建一个C#文件 创建好我们点击进去,就会跳转到我们的Vision Studio,然后输入这些代码 using UnityEngine;public class Move : MonoBehaviour // 定义一个名为Move的类,继承自MonoBehaviour{private Rigidbo

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

HTML5自定义属性对象Dataset

原文转自HTML5自定义属性对象Dataset简介 一、html5 自定义属性介绍 之前翻译的“你必须知道的28个HTML5特征、窍门和技术”一文中对于HTML5中自定义合法属性data-已经做过些介绍,就是在HTML5中我们可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,例如我们要在一个文字按钮上存放相对应的id: <a href="javascript:" d

一步一步将PlantUML类图导出为自定义格式的XMI文件

一步一步将PlantUML类图导出为自定义格式的XMI文件 说明: 首次发表日期:2024-09-08PlantUML官网: https://plantuml.com/zh/PlantUML命令行文档: https://plantuml.com/zh/command-line#6a26f548831e6a8cPlantUML XMI文档: https://plantuml.com/zh/xmi

argodb自定义函数读取hdfs文件的注意点,避免FileSystem已关闭异常

一、问题描述 一位同学反馈,他写的argo存过中调用了一个自定义函数,函数会加载hdfs上的一个文件,但有些节点会报FileSystem closed异常,同时有时任务会成功,有时会失败。 二、问题分析 argodb的计算引擎是基于spark的定制化引擎,对于自定义函数的调用跟hive on spark的是一致的。udf要通过反射生成实例,然后迭代调用evaluate。通过代码分析,udf在