当前位置: 首页 > news >正文

安卓属性动画


一.三种安卓动画

  1. Tween Animation(补间动画、视图动画):通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生的动画效果,即是一种渐变动画。

  2. Frame Animation(帧动画):顺序播放事先做好的图像,是一种画面转换动画。

  3. Property Animation:属性动画,通过动态地改变对象的属性从而达到动画效果,属性动画为API 11新特性。

二.属性动画的优点

1.属性动画是通过阈值器来调整的,可以高效完成简单的动画效果,从而节约内存空间。

2.对比帧动画,是通过图片的切换来实现动画效果的,可以实现复杂的动画效果但是非常耗内存。

3.属性动画多用于控件的状态变化,而帧动画用于展现复杂且连续的图片,比如短视频等。

三.属性动画实例

1.效果展示

在这里插入图片描述

2.关键代码

.xml布局文件,采用线性布局,四个button和一个image


MainActive代码

(1)moveView方法,修改view的位置,后续可调用该方法设置起始坐标及宽高

private void moveView(View view, int rawX, int rawY) {
int left = rawX - view.getWidth() / 2;
int top = rawY - view.getHeight();
int weight = left + view.getWidth();
int height = top + view.getHeight();
view.layout(left, top, weight, height);
}
(2)动画的实现

按钮1,直线移动代码实现

@Override
public void onClick(View view) {
//获取总布局的宽和高
int width = ly_root.getWidth();
int height = ly_root.getHeight();
ValueAnimator va = ValueAnimator.ofInt(height, 0, height / 4, height / 2, height / 4 * 3, height);
va.setDuration(3000l);
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int x = width / 2;
int y = (int) va.getAnimatedValue();
moveView(img_babi, x, y);
}
});
va.setInterpolator(new LinearInterpolator());
va.start();
}
按钮二,缩放

@Override
public void onClick(View view) {
final float scale = 0.5f;
AnimatorSet scaleSet = new AnimatorSet();
ValueAnimator vaSmall = ValueAnimator.ofFloat(1.0f, scale);
vaSmall.setDuration(500);

ValueAnimator vaLarge = ValueAnimator.ofFloat(scale, 1.0f);
vaLarge.setDuration(500);
vaSmall.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator valueAnimator) {
        float scale = (float) valueAnimator.getAnimatedValue();
        img_babi.setScaleX(scale);
        img_babi.setScaleY(scale);
    }
});
vaLarge.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator valueAnimator) {
        float scale = (float) valueAnimator.getAnimatedValue();
        img_babi.setScaleX(scale);
        img_babi.setScaleY(scale);
    }
});
scaleSet.play(vaLarge).after(vaSmall);
scaleSet.start();

}
按钮三,旋转

@Override
public void onClick(View view) {
int width = ly_root.getWidth();
int height = ly_root.getHeight();
final int R = width / 4;
ValueAnimator va = ValueAnimator.ofFloat(0, (float) (2.0f * Math.PI));
va.setDuration(1000);
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
float t = (float) valueAnimator.getAnimatedValue();
int x = (int) (R * Math.sin(t) + width / 2);
int y = (int) (R * Math.cos(t) + height / 2);
moveView(img_babi, x, y);
}
});
va.setInterpolator(new DecelerateInterpolator());
va.start();
}
按钮四,圆形旋转

@Override
public void onClick(View view) {
ValueAnimator va = ValueAnimator.ofInt(0, 360);
va.setDuration(1000l);
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int rotate = (Integer) valueAnimator.getAnimatedValue();
img_babi.setRotation(rotate);
float fractionValue = valueAnimator.getAnimatedFraction();
img_babi.setAlpha(fractionValue);
}
});
va.setInterpolator(new DecelerateInterpolator());
va.start();

}
3.代码功能总结

ofFloat,ofInt方法用来创建ValueAnimator实例

set…方法可以用来设置动画持续时间等

start()方法可以开启动画

原文链接:

guoguoguoyaonuli

http://t.csdn.cn/vzwEj

相关文章:

  • CSP初赛知识精讲--线性数据结构
  • Web-SpringBootWen
  • Quarto Dashboards 教程 2:Dashboard Layout
  • Docker-概念及配置(超详细)
  • 【树莓派】强力烧写工具 Balena Etcher,烧写树莓派系统,树莓派系统克隆,备份
  • 【C语言】深入理解KMP算法及C语言实现
  • iOS App冷启动优化:Before Main阶段
  • 【三维重建】【slam】【分块重建】LocalRF:逐步优化的局部辐射场的鲁棒视图合成
  • C语言printf()大全
  • MongoDB - readConcern
  • 设计模式——策略模式
  • nginx-------- 验证模块 页面配置 网页配置(三)
  • JS 的 apply 方法
  • 【前沿技术RPA】 一文了解UiPath Orchestrator的触发器和监听器
  • Java基于springboot+vue的游戏物品销售购物商城系统 前后端分离
  • HTML5期末大作业:美妆网页主题网站设计——清新的手工肥皂网站展示(4页)HTML+CSS+JavaScript
  • [附源码]Python计算机毕业设计Django三星小区车辆登记系统
  • 《MySQL实战45讲》学习笔记
  • 【网关路由测试】——网关状态转换测试
  • Mali GPU“补丁缺口”让 Android 用户容易受到攻击
  • (一)整合管理范围管理
  • ElementUI组件-日期时间控件设置禁用日期
  • Yocto创建自己的分区(基于STM32MP1)
  • 2022年物联卡的发展前景如何
  • Springboot龙龙汽车配件网站88000计算机毕业设计-课程设计-期末作业-毕设程序代做
  • 毕业设计-基于深度学习火灾烟雾检测识别系统-yolo
  • 如何在快节奏的生活下摆脱焦虑?
  • 2022物联卡平台排名前十的公司
  • [附源码]Python计算机毕业设计SSM敬老院信息管理系统(程序+LW)
  • 自定义Repository从Spring Data JPA访问EntityManager
  • Java IO流(详解)
  • Go语言基础面试题