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

自定义View(四)使用Path仿百度外卖波浪效果

现在的互联网真是浪啊,那么多app上使用会动的波浪效果,就像下面这幅图一样:浪呀么浪这样的效果其实也是也是通过Path实现的,老样子,既然是自定义view还是要初始化画笔,这里不再

现在的互联网真是浪啊,那么多app上使用会动的波浪效果,就像下面这幅图一样:

《自定义View(四)使用Path仿百度外卖波浪效果》 浪呀么浪

这样的效果其实也是也是通过Path实现的,老样子,既然是自定义view还是要初始化画笔,这里不再多说:

private void initPaint() {
mPaint = new Paint();
mPaint.setStyle(Paint.Style.FILL);
mPaint.setAntiAlias(true);
mPaint.setStrokeWidth(mLineWidth);
}

首先,我们要了解波浪是怎么画出来的,这里涉及到Path的两个方法:rQuadTo和quadTo,那这两个方法有什么区别呢?rQuadTo的四个参数分别是曲线控制点的坐标和终点的横纵坐标,这里的坐标是相对上一个终点(这里需要注意,不是相对于控制点)而言的,而quadTo是绝对坐标,两者具体的区别不在这里叙述。
首先我们在onDraw方法中画出第一个波浪:

mPath1.moveTo(0, getHeight() * 0.2f);
mPath1.rQuadTo(getWidth() * 0.25f, -getHeight() * 0.025f, getWidth() * 0.5f, 0);
mPath1.rQuadTo(getWidth() * 0.25f, getHeight() * 0.025f, getWidth() * 0.5f, 0);

《自定义View(四)使用Path仿百度外卖波浪效果》

注意,这里的坐标是相对的,尽管有些点的坐标一样,但他们不是一个点。接着我们画出第二个波浪,只需要将两个控制点的y坐标取负值即可取出和第一个波浪相反的波浪:

《自定义View(四)使用Path仿百度外卖波浪效果》

波浪画好后要怎样让他们浪起来呢?不得不说其实自定义View好多东西都是视觉欺骗,难道曲线真的和波浪一样会上下起伏吗?并不是,如果你仔细盯着曲线上的一个点移动的话,就会发现这只不过是曲线在向右平移罢了。既然要平移,就必须有的移,所以我们将Path的起始点移动到屏幕之外的一个点,当然最好初始值也是屏幕的宽度:

mPath1.moveTo(-getWidth() + count * getWidth(), getHeight() * 0.2f);
mPath2.moveTo(-getWidth() + count * getWidth(), getHeight() * 0.2f);
for (int i = 0; i <2; i++) {
mPath1.rQuadTo(getWidth() * 0.25f, -getHeight() * 0.025f, getWidth() * 0.5f, 0);
mPath1.rQuadTo(getWidth() * 0.25f, getHeight() * 0.025f, getWidth() * 0.5f, 0);
mPath2.rQuadTo(getWidth() * 0.25f, getHeight() * 0.025f, getWidth() * 0.5f, 0);
mPath2.rQuadTo(getWidth() * 0.25f, -getHeight() * 0.025f, getWidth() * 0.5f, 0);
}
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1);
valueAnimator.setDuration(3000);
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.setRepeatCount(ValueAnimator.INFINITE);
valueAnimator.setRepeatMode(ValueAnimator.RESTART);
valueAnimator.start();
valueAnimator.addUpdateListener(animation -> {
count = (float) animation.getAnimatedValue();
invalidate();
});

这里的count是属性动画获取的渐变值,count不断增大,path的起始点就会不断向右,所以就形成了移动的效果,那为什么要循环一次呢,这是因为开始的时候count是0,屏幕中是没有东西的,为了在动画执行过程中显示出完整的波浪,所以需要画出两个周期的波形,也就是说,波形其实一共是屏幕和屏幕左侧两个周期,然后在将初始点移动。这里需要注意的是需要给动画设置valueAnimator.setInterpolator(new LinearInterpolator()),因为valueAnimator默认不是匀速的,在开始和结束的时候会逐渐变慢直到停止,所以当动画执行下一次时会有一个顿挫感,就好像踩离合时突然抬脚一样,设置线性插值器后,波浪就是非常自然了!


推荐阅读
  • Android 图像色彩处理技术详解
    本文详细探讨了 Android 平台上的图像色彩处理技术,重点介绍了如何通过模仿美图秀秀的交互方式,利用 SeekBar 实现对图片颜色的精细调整。文章展示了具体的布局设计和代码实现,帮助开发者更好地理解和应用图像处理技术。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在探讨如何在Android的TextView中实现多彩文字与多样化字体效果时,本文提供了一种不依赖HTML技术的解决方案。通过使用SpannableString和相关的Span类,开发者可以轻松地为文本添加丰富的样式和颜色,从而提升用户体验。文章详细介绍了实现过程中的关键步骤和技术细节,帮助开发者快速掌握这一技巧。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 【问题】在Android开发中,当为EditText添加TextWatcher并实现onTextChanged方法时,会遇到一个问题:即使只对EditText进行一次修改(例如使用删除键删除一个字符),该方法也会被频繁触发。这不仅影响性能,还可能导致逻辑错误。本文将探讨这一问题的原因,并提供有效的解决方案,包括使用Handler或计时器来限制方法的调用频率,以及通过自定义TextWatcher来优化事件处理,从而提高应用的稳定性和用户体验。 ... [详细]
  • 在《ChartData类详解》一文中,我们将深入探讨 MPAndroidChart 中的 ChartData 类。本文将详细介绍如何设置图表颜色(Setting Colors)以及如何格式化数据值(Formatting Data Values),通过 ValueFormatter 的使用来提升图表的可读性和美观度。此外,我们还将介绍一些高级配置选项,帮助开发者更好地定制和优化图表展示效果。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 作为软件工程专业的学生,我深知课堂上教师讲解速度之快,很多时候需要课后自行消化和巩固。因此,撰写这篇Java Web开发入门教程,旨在帮助初学者更好地理解和掌握基础知识。通过详细记录学习过程,希望能为更多像我一样在基础方面还有待提升的学员提供有益的参考。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • 深入解析 Android Drawable:第六阶段进阶指南 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 依然最钟爱《People Have the Power》,强烈推荐大家聆听这首经典之作
    尽管今日情绪低落,我在音乐库中反复筛选,最终还是选择了《People Have the Power》来激励自己。这首歌不仅旋律动听,歌词也充满力量,能够带给人正能量。强烈建议大家找来聆听,体验其独特的魅力。《People Have the Power》虽然不是出自专辑《Horses》,但同样是一首不可多得的经典之作。 ... [详细]
  • Unity3D 中 AsyncOperation 实现异步场景加载及进度显示优化技巧
    在Unity3D中,通过使用`AsyncOperation`可以实现高效的异步场景加载,并结合进度条显示来提升用户体验。本文详细介绍了如何利用`AsyncOperation`进行异步加载,并提供了优化技巧,包括进度条的动态更新和加载过程中的性能优化方法。此外,还探讨了如何处理加载过程中可能出现的异常情况,确保加载过程的稳定性和可靠性。 ... [详细]
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社区 版权所有