Android App开发中补间动画的讲解以及实现钟摆动画效果实战(附源码 简单易懂 可直接使用)
创始人
2024-02-01 14:35:43

需要图片集和源码请点赞关注收藏后评论区留言~~~

一、补间动画的种类

Android提供了补间动画,它允许开发者实现某个视图的动态变换,具体包括四种动画效果,分别是灰度动画,平移动画,缩放动画和旋转动画。因为开发者提供动画的起始状态值与终止状态值,然后系统按照时间推移计算中间的状态值,并自动把中间状态的视图补充到起止视图的变化过程中,自动补充中间视图的动画就被简称为补间动画

四种补间动画有不同的初始化方式 具体说明如下

1:灰度动画 在构造方法中指定视图透明度的前后数值

2:平移动画 指定平移前后左上角的坐标值

3:缩放动画 指定视图的前后缩放比例

4:旋转动画 指定视图的旋转角度

可在下拉框中选择不同的动画效果 演示视频已上传至我的主页 有需要可自行观看

 

 

 

 

代码如下

Java类

package com.example.animation;import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.view.animation.TranslateAnimation;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.AdapterView.OnItemSelectedListener;import com.example.animation.util.Utils;public class TweenAnimActivity extends AppCompatActivity implements AnimationListener {private ImageView iv_tween_anim; // 声明一个图像视图对象private Animation alphaAnim, translateAnim, scaleAnim, rotateAnim; // 声明四个补间动画对象@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_tween_anim);iv_tween_anim = findViewById(R.id.iv_tween_anim);initTweenAnim(); // 初始化补间动画initTweenSpinner(); // 初始化动画类型下拉框}// 初始化补间动画private void initTweenAnim() {// 创建一个灰度动画。从完全透明变为即将不透明alphaAnim = new AlphaAnimation(1.0f, 0.1f);alphaAnim.setDuration(3000); // 设置动画的播放时长alphaAnim.setFillAfter(true); // 设置维持结束画面// 创建一个平移动画。向左平移100dptranslateAnim = new TranslateAnimation(1.0f, Utils.dip2px(this, -100), 1.0f, 1.0f);translateAnim.setDuration(3000); // 设置动画的播放时长translateAnim.setFillAfter(true); // 设置维持结束画面// 创建一个缩放动画。宽度不变,高度变为原来的二分之一scaleAnim = new ScaleAnimation(1.0f, 1.0f, 1.0f, 0.5f);scaleAnim.setDuration(3000); // 设置动画的播放时长scaleAnim.setFillAfter(true); // 设置维持结束画面// 创建一个旋转动画。围绕着圆心顺时针旋转360度rotateAnim = new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF,0.5f, Animation.RELATIVE_TO_SELF, 0.5f);rotateAnim.setDuration(3000); // 设置动画的播放时长rotateAnim.setFillAfter(true); // 设置维持结束画面}// 初始化动画类型下拉框private void initTweenSpinner() {ArrayAdapter tweenAdapter = new ArrayAdapter<>(this,R.layout.item_select, tweenArray);Spinner sp_tween = findViewById(R.id.sp_tween);sp_tween.setPrompt("请选择补间动画类型");sp_tween.setAdapter(tweenAdapter);sp_tween.setOnItemSelectedListener(new TweenSelectedListener());sp_tween.setSelection(0);}private String[] tweenArray = {"灰度动画", "平移动画", "缩放动画", "旋转动画"};class TweenSelectedListener implements OnItemSelectedListener {public void onItemSelected(AdapterView arg0, View arg1, int arg2, long arg3) {playTweenAnim(arg2); // 播放指定类型的补间动画}public void onNothingSelected(AdapterView arg0) {}}// 播放指定类型的补间动画private void playTweenAnim(int type) {if (type == 0) { // 灰度动画iv_tween_anim.startAnimation(alphaAnim); // 开始播放灰度动画// 给灰度动画设置动画事件监听器alphaAnim.setAnimationListener(TweenAnimActivity.this);} else if (type == 1) { // 平移动画iv_tween_anim.startAnimation(translateAnim); // 开始播放平移动画// 给平移动画设置动画事件监听器translateAnim.setAnimationListener(TweenAnimActivity.this);} else if (type == 2) { // 缩放动画iv_tween_anim.startAnimation(scaleAnim); // 开始播放缩放动画// 给缩放动画设置动画事件监听器scaleAnim.setAnimationListener(TweenAnimActivity.this);} else if (type == 3) { // 旋转动画iv_tween_anim.startAnimation(rotateAnim); // 开始播放旋转动画// 给旋转动画设置动画事件监听器rotateAnim.setAnimationListener(TweenAnimActivity.this);}}// 在补间动画开始播放时触发@Overridepublic void onAnimationStart(Animation animation) {}// 在补间动画结束播放时触发@Overridepublic void onAnimationEnd(Animation animation) {if (animation.equals(alphaAnim)) { // 灰度动画// 创建一个灰度动画。从即将不透明变为完全透明Animation alphaAnim2 = new AlphaAnimation(0.1f, 1.0f);alphaAnim2.setDuration(3000); // 设置动画的播放时长alphaAnim2.setFillAfter(true); // 设置维持结束画面iv_tween_anim.startAnimation(alphaAnim2); // 开始播放灰度动画} else if (animation.equals(translateAnim)) { // 平移动画// 创建一个平移动画。向右平移100dpAnimation translateAnim2 = new TranslateAnimation(Utils.dip2px(this, -100), 1.0f, 1.0f, 1.0f);translateAnim2.setDuration(3000); // 设置动画的播放时长translateAnim2.setFillAfter(true); // 设置维持结束画面iv_tween_anim.startAnimation(translateAnim2); // 开始播放平移动画} else if (animation.equals(scaleAnim)) { // 缩放动画// 创建一个缩放动画。宽度不变,高度变为原来的两倍Animation scaleAnim2 = new ScaleAnimation(1.0f, 1.0f, 0.5f, 1.0f);scaleAnim2.setDuration(3000); // 设置动画的播放时长scaleAnim2.setFillAfter(true); // 设置维持结束画面iv_tween_anim.startAnimation(scaleAnim2); // 开始播放缩放动画} else if (animation.equals(rotateAnim)) { // 旋转动画// 创建一个旋转动画。围绕着圆心逆时针旋转360度Animation rotateAnim2 = new RotateAnimation(0f, -360f,Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);rotateAnim2.setDuration(3000); // 设置动画的播放时长rotateAnim2.setFillAfter(true); // 设置维持结束画面iv_tween_anim.startAnimation(rotateAnim2); // 开始播放旋转动画}}// 在补间动画重复播放时触发@Overridepublic void onAnimationRepeat(Animation animation) {}}

XML文件

 二、补间动画的原理以及钟摆的实现

补间动画只提供了基本的动态变换,如果想要复杂的动画效果,比如像钟摆一样左摆一下右摆一下,就要对它进行改造 钟摆的操作主要由以下三段动作组成

1:以上面端点为圆心 转到左边某个角度停住

2:从左边向右边旋转 转到右边某个角度停住

3:从右再向左转 完成一个周期

效果如下 动画演示视频已上传至个人主页 有需要可自行前往观看 

 

 

 代码如下

Java类

package com.example.animation;import com.example.animation.widget.SwingAnimation;import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.view.animation.Animation;
import android.widget.ImageView;public class SwingAnimActivity extends AppCompatActivity {private ImageView iv_swing; // 声明一个图像视图对象@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_swing_anim);iv_swing = findViewById(R.id.iv_swing);findViewById(R.id.ll_swing).setOnClickListener(v -> showSwingAnimation());showSwingAnimation(); // 开始播放摇摆动画}// 开始播放摇摆动画private void showSwingAnimation() {// 创建一个摇摆动画// 参数取值说明:中间度数、摆到左侧的度数、摆到右侧的度数、圆心X坐标类型、圆心X坐标相对比例、圆心Y坐标类型、圆心Y坐标相对比例// 坐标类型有三种:ABSOLUTE 绝对坐标,RELATIVE_TO_SELF 相对自身的坐标,RELATIVE_TO_PARENT 相对上级视图的坐标// X坐标相对比例,为0时表示左边顶点,为1表示右边顶点,为0.5表示水平中心点// Y坐标相对比例,为0时表示上边顶点,为1表示下边顶点,为0.5表示垂直中心点SwingAnimation swingAnimation = new SwingAnimation(0f, 60f, -60f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.0f);swingAnimation.setDuration(4000); // 设置动画的播放时长swingAnimation.setRepeatCount(0); // 设置动画的重播次数swingAnimation.setFillAfter(false); // 设置维持结束画面swingAnimation.setStartOffset(500); // 设置动画的启动延迟iv_swing.startAnimation(swingAnimation); // 开始播放摇摆动画}}

XML文件

创作不易 觉得有帮助请点赞关注收藏~~~

相关内容

热门资讯

北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...