Android 忆童年 DVD机待机 loading 动画

栏目: Android · 发布时间: 6年前

内容简介:周末逛「即刻」开到这个消息,然后心生一计,我可以自己做一个 DVD 的 loading效果啊。什么?你不知道 DVD 是啥?呵呵,暴露年龄了。这是一个具有年代感的东西。你没看到过说明要么你年轻,年轻好啊。要么你家穷,我那会儿反正是租的碟片在同学家放,自己家买是不可能的了,一辈子都不可能。正式开始实现之前,开始简单的建模及分析。
Android 忆童年 DVD机待机 loading 动画

周末逛「即刻」开到这个消息,然后心生一计,我可以自己做一个 DVD 的 loading效果啊。

什么?你不知道 DVD 是啥?呵呵,暴露年龄了。这是一个具有年代感的东西。你没看到过说明要么你年轻,年轻好啊。要么你家穷,我那会儿反正是租的碟片在同学家放,自己家买是不可能的了,一辈子都不可能。

正式开始实现之前,开始简单的建模及分析。

整体效果就是:一个圆或者矩形在一个大的矩形(类比电视屏幕)上面运动,撞到屏幕边缘就开始反弹,这里类比于光的反射。直到它成功切入一个角落,那么就停止运动。

转化一下其实就是我需要在两点连线的轨迹上面作圆或者其他图形,这两点必须满足在大的矩形的任意两边上(可以是相邻的,也可以是隔开的,单不能是同一边)。

那么对应到 Android 中就转换成两个问题,第一 如何通过已知点和角度和相关约束条件计算出另外一个点的坐标。第二 如何拿到两点相连的轨迹。

针对问题一,很明确,这里需要使用到勾股定理那些知识,或者准确的说,这里就是需要用到「正切函数」。

针对问题二,这里就需要使用到 Path 和 PathMeasure 这两个类。在 Path 中我们可以通过 moveTo() lineTo() 两个方法实现两点连线。然后调用 pathMeasure.setPath(path, false) 方式使 Path 和 PathMeasure 相关联。接着介绍 PathMeasure 一个超级厉害的方法: pathMeasure.getPosTan(distance, positionArray, tanArray) 这个方法第一个参数指定一段长度,接着传入两个数组,positionArray[2] 和 tanArray[2] 。 最后positionArray 返回的就是对应 distance 后的终点坐标,到这里,终点坐标问题解决。更厉害的是后面,给到你 X 和 Y 对应的正切值。那么我们这里需要使用的正切值就是 tanValue = Math.abs(tanArray[1] / tanArray[0])

两个大问题解决了,在讨论一些小问题,比如说运动轨迹到底有多少种?

Android 忆童年 DVD机待机 loading 动画

大致就是这个情况,唉,第一次用「预览」画图,大家能看明白就好。这里具体有八种情况的轨迹。按大类分就是四大类,分别对应各个象限的情况。每个象限又有上下两种运动方向,所以就是有八大类。

轨迹有八种,但是要再具体的话,每一种又可以再拆分出一种情况。那就是上面提到的,这两点是相邻的或者是隔开的。

Android 忆童年 DVD机待机 loading 动画

最后直接刚上一组代码,对应上图的相关情况。

private fun handUp() {
    if (currentX == startX()) {// normal
        val resultX = startX() + (currentY - startY()) / tanValue
        val dx = resultX - endX()
        if (resultX > endX()) {
            Log.e("calculate", "上升 handUp:越界情况")
            val dy = tanValue * (endX() - currentX)
            path.lineTo(endX(), currentY - dy)
        } else {
            Log.e("calculate", "上升 handUp:正常情况")
            path.lineTo(resultX, startY())
        }
        needRevert = dx > 0
    } else if (currentX == endX()) {// normal revert
        val resultX = (endY() - currentY) / tanValue
        val dx = resultX - currentX
        if (currentX - resultX < startX()) {
            Log.e("calculate", " handUp 下降:越界情况")
            path.lineTo(startX(), rectF.height() - dx * tanValue)
            needRevert = true
        } else {
            Log.e("calculate", " handUp 下降:正常情况")
            path.lineTo(currentX - resultX, rectF.height() - ovalY())
            needRevert = false
        }
    } else {
        Log.e(
            "calculate",
            " handUp 异常情况:currentX =$currentX startX=${startX()} endx:${endX()} startX=${startX()} endx:${endX()}"
        )
        animator.cancel()
        state = STATE_ERROR
    }
}
复制代码

最后效果就是这样的,目前支持「圆形」和「椭圆形」

Android 忆童年 DVD机待机 loading 动画

源码地址: DVD loading by Joe


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

人工智能时代

人工智能时代

[ 美]杰瑞•卡普兰(Jerry Kaplan) / 李盼 / 浙江人民出版社 / 2016-4-1 / CNY 59.90

 当机器人霸占了你的工作,你该怎么办?机器人犯罪,谁才该负责?人工智能时代,人类价值如何重新定义?  在《人工智能时代》一书中,智能时代领军人、硅谷连续创业者杰瑞·卡普兰指出:智能时代的到来,给人类社会带来了两大灾难性冲击:持续性失业与不断加剧的贫富差距。机器正在很大程度上替代人类的工作,不管你是蓝领还是白领。而针对未来社会将要发生的这些问题,卡普兰在《人工智能时代》一书中从企业、税收和......一起来看看 《人工智能时代》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具