Android自定义View: 如何实现类钟摆的动画效果?

Android钟摆秋千动画实现教程 在Android开发中,动画系统是一个不可或缺的组件,它能为用户界面增加生动性和交互性。Android动画系统不仅负责画面的动态变化,而且还能提高用户体验,使得界面元素的过渡和变化看起来更自然、平滑。从Android 3.0版本开始,动画系统得到了显著增强,引入了新的动画类型和更精细的控制。本章将概述Android动画系统的基本结构,包括其核心组件和工作机制,为后面章节深入分析不同动画类型和实现方法打下基础。为了实现摇摆效果,我们可以利用和结合使用。通过使用。 阅读详情

By Long Luo

继第一篇Android自定义View:如何实现一个模拟时钟?,我们使用Android自定义View实现了一款模拟表盘,第二篇Android自定义View:另一种实现手表指针转动的方法我们又通过另外一种方法实现了手表指针的另外一种转动实现。

在日程生活中,我们常见的挂钟实际都是有个钟摆的,那么,如果我们想在我们所作的模拟时钟实现这种钟摆动画呢?那么具体应该如何实现呢?

一、钟摆

遇到问题,我们需要先分析钟摆动画的具体动画效果,然后再做下一步工作。

单摆是能够产生往复摆动的一种装置,将无重细杆或不可伸长的细柔绳一端悬于重力场内一定点,另一端固结一个重小球,就构成单摆

那么钟摆就是在一定角度内来回摆动,具体更多细节可以自行Google。

二、Android Animation分析

在这一节里,我们会简单谈谈Android动画。

1. 动画分类

Android动画目前可分为以下3种:

补间动画(Tween Animation)

所谓的补间动画,其实就是定义了我们动画的起始点和终止点的状态,而动画的过程我们是不关心的,只需要达到我们想要的效果就行。

  1. 渐变动画支持四种类型:平移(Translate)、旋转(Rotate)、缩放(Scale)、不透明度(Alpha)
  2. 只是显示的位置变动,View的实际位置未改变,表现为View移动到其他地方,点击事件仍在原处才能响应
  3. 组合使用步骤较复杂。
  4. View Animation也是指此动画

对于补间动画来说,无论是用纯java代码构建Animation对象,还是通过xml文件定义Animation,其实最终的结果都是

Animation a = new AlphaAnimation();
Animation b = new ScaleAnimation();
Animation c = new RotateAnimation();
Animation d = new TranslateAnimation();

帧动画(Frame Animation)

所谓的帧动画就是可以设置我们的动画的每一帧的效果,其实视频或者Gif的效果都是由许多张图片在很短的时间内播放,从而产生动画效果。

  1. 用于生成连续的Gif效果图。
  2. DrawableAnimation也是指此动画。

属性动画(Property Animation)

属性动画是Android动画里面最复杂也是最能做出复杂的动画效果的一种类型。

  1. 支持对所有View能更新的属性的动画(需要属性的setXxx()和getXxx())。
  2. 更改的是View实际的属性,所以不会影响其在动画执行后所在位置的正常使用。
  3. Android3.0(API 11)及以后出现的功能,3.0之前的版本可使用github第三方开源库nineoldandroids.jar进行支持。

属性动画的相关的API:

  • ValueAnimator:值动画执行类,常配合AnimatorUpdateListener使用。
  • ObjectAnimator:对象动画执行类。
  • PropertyValuesHolder: 属性存储器,为两个执行类提供更新多个属性的功能。
  • AnimatorListener:动画执行监听,在动画开始、重复、结束、取消时进行回调。
  • Keyframe:为PropertyValuesHolder提供多个关键帧的操作值。
  • AnimatorSet:一组动画的执行集合类:设置执行的先后顺序,时间等。
  • TimeInterpolator:时间插值,用于控制动画执行过程。
  • AnimatorUpdateListener:动画更新监听。
  • TypeEvaluator:类型估值,用于设置复杂的动画操作属性的值。

ValueAnimator和ObjectAnimator是属性动画里面经常使用的对象类,ObjectAnimator是 ValueAnimator的子类。

当然Android属性动画是很复杂,达到熟练运用还需要深入研究,大家想了解可以去网上寻找相关知识学习。

2. 自定义动画

在本文中,我们主要是要实现一个自定义动画:摆动动画。那么,我们有必要了解如何实现自定义动画。

—如何实现自定义动画?

实现自定义动画,要继承Animation(android.view.animation.Animation),然后Override其中的2个方法:

Animation.applyTransformation(float, Transformation),和initialize()两个方法。

从方法名和内容可以知道Animation.applyTransformation(float, Transformation)就是最核心的动画实现方法。

我们在进一步看看这个方法在父类是怎么定义的,在父类Animation类中找到该方法的定义

    /**
     * Helper for getTransformation. Subclasses should implement this to apply
     * their transforms given an interpolation value.  Implementations of this
     * method should always replace the specified Transformation or document
     * they are doing otherwise.
     * 
     * @param interpolatedTime The value of the normalized time (0.0 to 1.0)
     *        after it has been run through the interpolation function.
     * @param t The Transformation object to fill in with the current
     *        transforms.
     */
    protected void applyTransformation(float interpolatedTime, Transformation t) {
    }

通过注释我们明白了(也可以结合调试理解):

在绘制动画的过程中会反复的调用applyTransformation函数,每次调用参数interpolatedTime值都会变化,该参数从0渐变为1,当该参数为1时表明动画结束。通过参数Transformation来获取变换的矩阵(matrix),通过改变矩阵就可以实现各种复杂的效果。

Animation.initialize()方法具体就是初始化动画时的一些对象的尺寸以及其父对象的尺寸。

    /**
     * Initialize this animation with the dimensions of the object being
     * animated as well as the objects parents. (This is to support animation
     * sizes being specified relative to these dimensions.)
     *
     * <p>Objects that interpret Animations should call this method when
     * the sizes of the object being animated and its parent are known, and
     * before calling {@link #getTransformation}.
     *
     *
     * @param width Width of the object being animated
     * @param height Height of the object being animated
     * @param parentWidth Width of the animated object's parent
     * @param parentHeight Height of the animated object's parent
     */
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        reset();
        mInitialized = true;
    }

三、SwingAnimation

实现钟摆动画,那么我们就需要分析其具体实现,再做下一步工作。

Talk is cheap, show me the code.

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        float degrees;

        float leftPos = (float) (1.0 / 4.0);
        float rightPos = (float) (3.0 / 4.0);

        if (interpolatedTime <= leftPos) {
            degrees = mMiddleDegrees + ((mLeftDegrees - mMiddleDegrees) * interpolatedTime * 4);
        } else if (interpolatedTime > leftPos && interpolatedTime < rightPos) {
            degrees = mLeftDegrees + ((mRightDegrees - mLeftDegrees) * (interpolatedTime - leftPos) * 2);
        } else {
            degrees = mRightDegrees + ((mMiddleDegrees - mRightDegrees) * (interpolatedTime - rightPos) * 4);
        }

        float scale = getScaleFactor();
        if (mPivotX == 0.0f && mPivotY == 0.0f) {
            t.getMatrix().setRotate(degrees);
        } else {
            t.getMatrix().setRotate(degrees, mPivotX * scale, mPivotY * scale);
        }
    }

初始化就比较简单了,如下所示:

    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
        mPivotX = resolveSize(mPivotXType, mPivotXValue, width, parentWidth);
        mPivotY = resolveSize(mPivotYType, mPivotYValue, height, parentHeight);
    }

具体使用呢:

        //参数取值说明:中间度数、摆到左侧的度数、摆到右侧的度数、圆心X坐标类型、圆心X坐标相对比例、圆心Y坐标类型、圆心Y坐标相对比例
        //坐标类型有三种:ABSOLUTE 绝对坐标,RELATIVE_TO_SELF 相对自身的坐标,RELATIVE_TO_PARENT 相对上级视图的坐标
        //X坐标相对比例,为0时表示左边顶点,为1表示右边顶点,为0.5表示水平中心点
        //Y坐标相对比例,为0时表示上边顶点,为1表示下边顶点,为0.5表示垂直中心点

        mSwingAnimation = new SwingAnimation(
                0f, 20f, -20f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        mSwingAnimation.setDuration(3000);     //动画持续时间
        mSwingAnimation.setInterpolator(new AccelerateDecelerateInterpolator());
        mSwingAnimation.setRepeatCount(Animation.INFINITE);  //动画重播次数
        mSwingAnimation.setFillAfter(false);  //是否保持动画结束画面
        mSwingAnimation.setStartOffset(2000);   //动画播放延迟

四、总结

通过如上方法,我们就实现了一个钟摆动画。

以上。

androird钟摆单摆.rar 一个简单的android 单摆 钟摆效果,可以监听动画的开始和结束,当然如果再改一改ui,加点逻辑进去,也可以当作催眠器了 立即下载

相关推荐

Android的秋千摇摆动画代码例子

Android的秋千摇摆动画代码例子,用于演示钟摆、秋千晃荡等左右摇摆的动画效果

Animation

/每个动画都重载了父类的applyTransformation方法这个方法的主要作用是把一些属性组装成一个Transformation类,这个方法会被父类的getTransformation方法调用。另外每个动画还有个initialize方法,完成初始化工作,动画开始前的一些准备工作。

u012123938的专栏 327

用于演示钟摆、秋千晃荡等左右摇摆的动画效果

Android的秋千摇摆动画代码例子,用于演示钟摆、秋千晃荡等左右摇摆的动画效果,下载即可使用

Android自定义控件之钟摆菜单

钟摆菜单实现功能:随机自由摆动、简单的碰撞检测、菜单项点击事件

Android农民的专栏 769

Android自定义View实现钟摆效果进度条PendulumView

在网上看到了一个IOS组件PendulumView,实现了钟摆的动画效果。由于原生的进度条确实是不好看,所以想可以自定义View实现这样的效果,以后也可以用于加载页面的进度条。  废话不多说,先上效果图   底部黑边是录制时不小心录上的,可以忽略。  既然是自定义View我们就按标准的流程来,第一步,自定义属性  自定义属性  建立属性文件  在Android项目的res->values目录下新建一个attrs.xml文件,文件内容如下: <?xml version=1.0 encoding=utf-8?> <declare-styleable n

抖音a_bogus参数逆向避坑指南:从环境检测到XHR请求的全流程解析

本文详细解析了抖音a_bogus参数在v1.0.1.19版本下的逆向工程全流程,重点介绍了如何通过PyV8Env框架进行有效的补环境操作,以绕过严格的环境检测。内容涵盖从环境初始化、关键事件触发到模拟XHR请求获取签名的完整步骤,并提供了可运行的Python代码示例和常见检测点的避坑指南,帮助开发者稳定生成有效的a_bogus参数。

tech5的博客 599

android 中心摆动动画,Android开发笔记(十六)秋千摇摆动画SwingAnimation

上节博主介绍了AlphaAnimation和淡入淡出动画的使用,其实AlphaAnimation只是四种补间动画中的一种。那么为了加深对其他补间动画的理解,我想说说旋转动画RotateAnimation的使用,刚好工作中就有类似的应用场景,正好介绍一下。像我们生活中有许多左右摇摆的画面,比如说老式挂钟的钟摆围绕着竖轴左右摇摆,又比如说公园里人们坐在秋千上荡来荡去,这么一想,嗯,这左右摇摆的秋千动画...

weixin_35925956的博客 570

AT32F403A ADC采集实战:如何用V2库精准读取可变电阻电压(附完整代码)

本文详细介绍了基于AT32F403A微控制器和V2库实现高精度ADC采集的工程化方法。内容涵盖从基础的单通道轮询配置到多通道扫描与DMA传输的进阶应用,并重点分享了提升ADC采集精度的关键技巧,包括采样时间优化、软件滤波算法以及硬件布局考量,提供了完整的实战代码,帮助开发者解决数据跳动、稳定性等常见问题。

weixin_29189003的博客 91

Android 动画 Tweened Animation 之 RotateAnimation

RotateAnimation(旋转动画) 今天通过指定一个动画效果(类似钟摆的动画)来讲解RotateAnimation的用法。ScaleAnimation 、 AlphaAnimation、 TranslateAnimation 的用法请参照相关文章。 先看一下下面这个坐标系,如果toDegrees 好了,下面就来完成一个类似钟摆的动画。 1、在res/anim目录

sun_star1chen的专栏 2088

Proteus下载安装快速入门:30分钟掌握全过程

手把手教你完成proteus下载安装,从环境配置到首次运行一气呵成,适合电子设计新手快速掌握仿真工具的核心操作步骤。

weixin_31974443的博客 891

PSM-DID实战指南:Stata代码解析与案例应用

本文详细解析PSM-DID方法在Stata中的实战应用,从理论到代码实现全面覆盖。通过倾向得分匹配(PSM)和双重差分(DID)的结合,有效解决政策评估中的选择偏差问题。文章提供完整的Stata命令代码、样例数据处理技巧和案例应用,帮助研究者准确评估政策效果。

vulkan6gpu的博客 791

android自定义钟摆loadingView

最近在看github的时候看见了好多好有趣的效果,便想要参考上面的项目,自己自主的实现出来,比如下面这个: android自定义钟摆loadingView:可以看到这个实现了自定义钟摆的效果,接下来进行实现的分析。我们可以从中看到其实就只有三部分内容: 第一部分就是左边第一个小圆球的摇摆。 第二部分就是中间三个小球的震动。 第三部分就是最后一个小球的摇摆。由于第一部分

辣鸡战士 626

分子动力学仿真软件:LAMMPS_(16).应用案例分析

通过以上四个应用案例,我们详细介绍了如何使用LAMMPS进行不同系统的分子动力学仿真。从简单的液体水仿真到复杂的纳米管仿真,每个案例都包含了详细的步骤说明和代码示例。读者可以通过这些示例实际操作并验证结果,从而更好地理解LAMMPS的功能和使用方法。希望这些案例能够为读者在分子动力学仿真领域的研究和应用提供帮助。

kkchenjj的博客 836

Android 自定义View加属性动画实现动画时钟

Android 自定义View 加属性动画实现的一个动画时钟

时光一去不在的博客 1785

【Zabbix实战之部署篇】Docker部署Zabbix+grafana监控平台

【Zabbix实战之部署篇】docker部署Zabbix+grafana监控平台

jks212454的博客 2577

基于simulink 的不间断电源ups的项目实例

UPS系统的核心组件包括整流器、逆变器、电池管理系统和控制系统。- **Three-Phase Controlled Rectifier**:设置触发角为0度,用于控制整流器的输出电压。- **Three-Phase Inverter**:设置逆变器的输出频率为60Hz,用于将直流电转换为交流电。- **Control System**:编写MATLAB函数,用于监测市电状态并控制各模块的工作模式。- **Step**:设置阶跃时间,例如0.05秒,阶跃前后的值分别为0和1,用于模拟市电中断。

xiaoheshang_123的博客 708

自定义View实现钟摆效果进度条PendulumView

转载请注明出处:http://blog.youkuaiyun.com/fightlei/article/details/52556755 在网上看到了一个IOS组件PendulumView,实现了钟摆的动画效果。由于原生的进度条确实是不好看,所以想可以自定义View实现这样的效果,以后也可以用于加载页面的进度条。 废话不多说,先上效果图 底部黑边是录制时不小心录上的,可以忽略。 既然是自定

ZhangLei的博客 4062

将Dify平台开发的工作流集成到Open WebUI中

将Dify开发的工作流集成到Open WebUI是一个能够显著增强AI应用交互能力和业务逻辑深度的有效途径。其核心在于通过API建立两者间的通信桥梁,并确保API在格式、协议和行为上的一致性,特别是向OpenAI Chat API规范看齐。最简单直接的路径是利用Dify的“对话型”或“Agent型”应用,这类应用的API设计更倾向于满足Open WebUI这类聊天前端的期望。然而,面对复杂的现实场景,直接的完美兼容并非总是唾手可得。

形上得其象,形下合于数;阴阳自济,玄理自明。 2030

Android 动画 Tweened Animation 之 RotateAnimation钟摆动画

RotateAnimation(旋转动画) 今天通过指定一个动画效果(类似钟摆的动画)来讲解RotateAnimation的用法。ScaleAnimation 、AlphaAnimation、 TranslateAnimation 的用法请参照相关文章。 先看一下下面这个坐标系,如果toDegrees 好了,下面就来完成一个类似钟摆的动画。 1、在res/an

丿灬安之若死 1692

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

android自定义ui书籍,Android UI-自定义Drawable(二)

概述上一篇我们已经讲到了一个开源框架如何实现了自定义的progressbar,效果还是很不错的。那么我们该怎么在一个自定义的Drawable中实现动画效果呢。接下去讲一讲注意的事项。继承Drawable可以看到,如果要自己实现一个子类,那么需要重写的方法就只有四个。而且每个方法的意义都非常清楚。public class MyDrawable extends Drawable{@Overridepu...

weixin_39576270的博客 182

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android_View动画

android动画 图像动画 (Frame Animation) 补间动画也叫做View动画(Tween Animation) View动画分为: 1. 平移动画 2. 旋转动画 3. 缩放动画 4. 透明度渐变动画 5. 集合动画View动画的特点: View动画,我们看到图像移动,其实都是假象来的. 实质上控件是没有离开过位置的, (我们可

xdd_lmd的博客 465

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

(十四)安卓应用之动画特效

Android的动画分为三大类:帧动画、补间动画和属性动画。帧动画是最简单的一种动画,跟现实生活中的电影胶卷类似,都是在短时间内连续播放多张图片,从而模拟动态画面的效果。帧动画播放所需的一系列图片,都在动画图形AnimationDrawable定义,并由动画图形控制帧动画的播放操作。下面是AnimationDrawable的常用方法。addFrame:添加一幅图片帧,并指定该帧的持续时间(单位毫秒)。setOneShot:设置是否只播放一次。start:开始播放。stop:停止播放。

小新的博客 852

Android 自定义加载效果视图(loading)控件

自定义加载框汇总 AndroidProgressLayout 可根据加载情况显示提示信息的控件 GoogleProgressBar 用Android实现了google中

肚里能撑船的宰相 5440

补间动画的原理

补间动画只提供了基本的动态变换,如果想要复杂的动画效果,比如像钟摆一样左摆一下,右摆一下,补间动画就无能为力了,所以有必要了解补间动画的实现原理,这样才能进行适当的改造,使其符合实际的业务需求。 下面以旋转动画RotateAnimation 为例说明补间动画的实现原理

圣人男的博客 1498
上一篇: Android自定义View:另一种实现手表指针转动的方法
下一篇: 5分钟学会Java反射
tcpipstack
博客等级 码龄14年 329粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值