热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

简单视察特效的实现

实现的效果:这个是一个ListrView,头部添加一张图片,在下拉时,图片会全部显示出来,松开以后图片还会回

实现的效果:

这个是一个ListrView,头部添加一张图片,在下拉时,图片会全部显示出来,松开以后图片还会回弹到原来的位置;

下面直接代码:

ParallaxListView:

/*** Created by peiyan on 2017/8/16.* 继承式控件:* 1.继承ListView,覆写构造方法* 2.覆写overScrollBy方法,重点关注deltaY,isTouchEvent方法* 3.暴露一个方法,去得到外界ImageView,并测量ImageView控件的高度* 4.覆写onTouchEvent方法*/
public class ParallaxListView extends ListView {private ImageView header;private int intrinsicHeight;private int orignalHeight;public ParallaxListView(Context context) {this(context,null);}public ParallaxListView(Context context, AttributeSet attrs) {this(context, attrs,0);}public ParallaxListView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}public void setHeader(ImageView header) {this.header &#61; header;//获取图片的原始高度intrinsicHeight &#61; header.getDrawable().getIntrinsicHeight();//获取imageView的原始高度orignalHeight &#61; header.getHeight();}/*** 重点:滑动到ListView两端的时候被调用&#xff08;上部和底部&#xff09;* &#64;param deltaX* &#64;param deltaY 竖直方向滑动的瞬时变化量&#xff0c;顶部下拉为-&#xff0c;底部上拉为&#43;&#xff1b;* &#64;param scrollX* &#64;param scrollY* &#64;param scrollRangeX* &#64;param scrollRangeY* &#64;param maxOverScrollX* &#64;param maxOverScrollY* &#64;param isTouchEvent 是否是用户触摸拉动&#xff0c;true表示用户手指拉动&#xff0c;false是惯性&#xff1b;* &#64;return***/&#64;Overrideprotected boolean overScrollBy(int deltaX, int deltaY, int scrollX,int scrollY, int scrollRangeX, int scrollRangeY,int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {//通过Log来验证参数的作用//deltaY&#61;-270; scrollY&#61;0滚动; scrollRangeY&#61;0滚动范围; maxOverScrollY&#61;0最大滚动; isTouchEvent&#61;true是触摸事件;Log.d("PY","deltaY"&#43;deltaY&#43;"isTouchEvent"&#43;isTouchEvent);//顶部下拉&#xff0c;用户触摸的操作才执行视差效果if (deltaY<0 && isTouchEvent&#61;&#61;true){//deltaY是一个负值&#xff0c;我们要改为绝对值 Math.abs(deltaY)&#xff0c;累计给我们的header高度int newHeight &#61; header.getHeight() &#43; Math.abs(deltaY);//避免图片无限放大&#xff0c;图片最大不能超过图片本身的高度//在上面的方法里拿到图片的原始高度if (newHeight<&#61;intrinsicHeight){//把新的高度值赋值给控件&#xff0c;改变控件的高度header.getLayoutParams().height&#61;newHeight;header.requestLayout();}}return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);}
//触摸事件&#xff0c;让滑动的图片重新回到原来的样子&#64;Overridepublic boolean onTouchEvent(MotionEvent ev) {switch (ev.getAction()){case MotionEvent.ACTION_UP:int currentHeight &#61; header.getHeight();//属性动画&#xff0c;改变高度的值,吧我们当前头布局的高度&#xff0c;改为原始的高度final ValueAnimator animator &#61; ValueAnimator.ofInt(currentHeight, orignalHeight);//动画更新的监听animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {&#64;Overridepublic void onAnimationUpdate(ValueAnimator valueAnimator) {//获取动画执行过程中的分度值float fraction &#61; animator.getAnimatedFraction();//获取中间的值&#xff0c;并赋值给控件新高度&#xff0c;可以使控件平稳回弹的效果Integer animatedValue &#61; (Integer) animator.getAnimatedValue();//让新的高度值生效header.getLayoutParams().height&#61;animatedValue;header.requestLayout();}});//动画的回弹效果。值越大,回弹效果越明显animator.setInterpolator(new OvershootInterpolator(2));//设置动画执行时间animator.setDuration(3000);//执行动画animator.start();}return super.onTouchEvent(ev);}
}

chinaese&#xff1a;&#xff08;自己定义放数据的类&#xff09;

public class chinaese {public static final String[] NAMES &#61; new String[]{"宋江", "卢俊义", "吴用","公孙胜", "关胜", "林冲", "秦明", "呼延灼", "花荣", "柴进", "李应", "朱仝", "鲁智深","武松", "董平", "张清", "杨志", "徐宁", "索超", "戴宗", "刘唐", "李逵", "史进", "穆弘","雷横", "李俊", "阮小二", "张横", "阮小五", " 张顺", "阮小七", "杨雄", "石秀", "解珍"," 解宝", "燕青", "朱武", "黄信", "孙立", "宣赞", "郝思文", "韩滔", "彭玘", "单廷珪","魏定国", "萧让", "裴宣", "欧鹏", "邓飞", " 燕顺", "杨林", "凌振", "蒋敬", "吕方","郭 盛", "安道全", "皇甫端", "王英", "扈三娘", "鲍旭", "樊瑞", "孔明", "孔亮", "项充","李衮", "金大坚", "马麟", "童威", "童猛", "孟康", "侯健", "陈达", "杨春", "郑天寿","陶宗旺", "宋清", "乐和", "龚旺", "丁得孙", "穆春", "曹正", "宋万", "杜迁", "薛永", "施恩","周通", "李忠", "杜兴", "汤隆", "邹渊", "邹润", "朱富", "朱贵", "蔡福", "蔡庆", "李立","李云", "焦挺", "石勇", "孙新", "顾大嫂", "张青", "孙二娘", " 王定六", "郁保四", "白胜","时迁", "段景柱"};}

MainActivity:

/*** 视差特效实现思路&#xff1a;&#xff08;两种&#xff09;* 1.解析ontouche&#xff0c;Action_Down,Action_move,Action_up;业务逻辑过于复杂* &#xff08;用第二种&#xff09;* 2.重写ListView的ouverScrollBy方法&#xff0c;继承式自定义控件ListView&#xff0c;根据用户下拉的距离* 动态修改headerView的高度&#xff1b;* 在MainActivity中的实现思路&#xff1a;* a.拷贝文本资源到项目中&#xff0c;自定义控件继承ListView* b.使用自定义控件&#xff0c;并往头部添加布局&#xff0c;设置适配器* c.使用视图树&#xff0c;把ImageView传给我们的自定义控件&#xff1b;*/
public class MainActivity extends AppCompatActivity {private ParallaxListView plv;&#64;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();//listView添加一个头布局View headerView&#61; View.inflate(this, R.layout.layout_header, null);plv.addHeaderView(headerView);final ImageView header &#61; (ImageView) headerView.findViewById(R.id.header);//等View界面全部绘制完毕的时候&#xff0c;去得到已经绘制完控件的宽和高&#xff1b;header.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {&#64;Overridepublic void onGlobalLayout() {//宽和高已经测量完毕plv.setHeader(header);//释放资源header.getViewTreeObserver().removeGlobalOnLayoutListener(this);}});//使用ListView的ArrayAdapter&#xff0c;添加文本itemplv.setAdapter(new ArrayAdapter(this,android.R.layout.simple_list_item_1,chinaese.NAMES));}private void initView() {plv &#61; (ParallaxListView) findViewById(R.id.plv);}
}


下面是布局&#xff1a;

activity_main:



layout_header:










推荐阅读
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • Squaretest:自动生成功能测试代码的高效插件
    本文将介绍一款名为Squaretest的高效插件,该工具能够自动生成功能测试代码。使用这款插件的主要原因是公司近期加强了代码质量的管控,对各项目进行了严格的单元测试评估。Squaretest不仅提高了测试代码的生成效率,还显著提升了代码的质量和可靠性。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 第六章:枚举类型与switch结构的应用分析
    第六章深入探讨了枚举类型与 `switch` 结构在编程中的应用。枚举类型(`enum`)是一种将一组相关常量组织在一起的数据类型,广泛存在于多种编程语言中。例如,在 Cocoa 框架中,处理文本对齐时常用 `NSTextAlignment` 枚举来表示不同的对齐方式。通过结合 `switch` 结构,可以更清晰、高效地实现基于枚举值的逻辑分支,提高代码的可读性和维护性。 ... [详细]
  • 在Android开发中,实现多点触控功能需要使用`OnTouchListener`监听器来捕获触摸事件,并在`onTouch`方法中进行详细的事件处理。为了优化多点触控的交互体验,开发者可以通过识别不同的触摸手势(如缩放、旋转等)并进行相应的逻辑处理。此外,还可以结合`MotionEvent`类提供的方法,如`getPointerCount()`和`getPointerId()`,来精确控制每个触点的行为,从而提升用户操作的流畅性和响应性。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • NOIP2000的单词接龙问题与常见的成语接龙游戏有异曲同工之妙。题目要求在给定的一组单词中,从指定的起始字母开始,构建最长的“单词链”。每个单词在链中最多可出现两次。本文将详细解析该题目的解法,并分享学习过程中的心得体会。 ... [详细]
  • 优化后的摘要:默认情况下,PopupWindow在点击外部区域时会自动关闭。为了实现点击外部区域时不自动关闭的功能,可以通过自定义设置来调整PopupWindow的行为,确保其在外部点击时仍保持显示状态。这需要对PopupWindow的属性进行适当的修改和配置,以满足特定的交互需求。 ... [详细]
  • Python内置模块详解:正则表达式re模块的应用与解析
    正则表达式是一种强大的文本处理工具,通过特定的字符序列来定义搜索模式。本文详细介绍了Python内置的`re`模块,探讨了其在字符串匹配、验证和提取中的应用。例如,可以通过正则表达式验证电子邮件地址、电话号码、QQ号、密码、URL和IP地址等。此外,文章还深入解析了`re`模块的各种函数和方法,提供了丰富的示例代码,帮助读者更好地理解和使用这一工具。 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有