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

android ——动画

一、帧动画:

第一步:drawable中添加要做帧动画的图片,并新建一个frame.xml文件

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"><!--    添加图片和显示的时间--><item android:drawable="@drawable/img1" android:duration="220"/><item android:drawable="@drawable/img2" android:duration="220"/><item android:drawable="@drawable/img3" android:duration="220"/>
</animation-list>

第二步:MainActivity的xml文件中引用 frame :

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/frame"android:id="@+id/ctl"tools:context=".MainActivity">
</androidx.constraintlayout.widget.ConstraintLayout>

第三步:点击启动和停止动画

    private boolean flag=true;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ConstraintLayout mCtl = findViewById(R.id.ctl);AnimationDrawable animation= (AnimationDrawable) mCtl.getBackground();mCtl.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {
//                启动动画if (flag){animation.start();  //启动动画flag=false;}else {animation.stop(); flag=true;}}});}

二、补间动画:

第一、alpha 透明度
1、res中新见一个alpha.xml文件

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--fromAlpha:0 完全透明toAlpha:1  完全不透明duration: 显示周期--><alphaandroid:fromAlpha="0"android:toAlpha="1"android:duration="2000"/>
</set>

2、activity的xml文件中添加ImageView

    <androidx.appcompat.widget.AppCompatImageViewandroid:id="@+id/image"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/img1"android:adjustViewBounds="true"android:maxWidth="500dp"android:maxHeight="500dp"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintBottom_toBottomOf="parent"/>

3、activity中使用:

      ImageView img=findViewById(R.id.image);img.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {
//                通过加载xml动画设置文件,来创建一个Animation对象Animation animation=AnimationUtils.loadAnimation(TweenAnimActivity.this,R.anim.alpha);img.startAnimation(animation);}});

第二、rotate 旋转
1、res中新建一个rotate.xml文件:

<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--
fromDegrees:开始的位置
toDegrees:旋转多少度
pivotX:旋转的中心点
pivotY:
--><rotateandroid:fromDegrees="0"android:toDegrees="360"android:pivotX="50%"android:pivotY="50%"android:duration="2000"/>
</set>

2、activity中使用:

  ImageView img=findViewById(R.id.image);img.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {
//                通过加载xml动画设置文件,来创建一个Animation对象Animation animation=AnimationUtils.loadAnimation(TweenAnimActivity.this,R.anim.rotate);img.startAnimation(animation);}});

第三、scale 缩放
1、res中新建scale,xml文件:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!--    
fromXScale:x的原始大小
fromYScale:Y的原始大小
pivotY:缩放到的y的大小
pivotX:缩放到的x的大小
toXScale:缩放的中心点
toYScale:
duration:动画执行的周期时间
--><scale android:fromXScale="1"android:fromYScale="1"android:pivotY="0.5"android:pivotX="0.5"android:toXScale="50%"android:toYScale="50%"android:duration="2000"/>
</set>

2、activity中使用:

      ImageView img=findViewById(R.id.image);img.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {
//                通过加载xml动画设置文件,来创建一个Animation对象Animation animation=AnimationUtils.loadAnimation(TweenAnimActivity.this,R.anim.scale);img.startAnimation(animation);}});

第四、translate 平移
1、在res中新建translate.xml文件

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"><translate android:fromXDelta="0"android:fromYDelta="0"android:toXDelta="200"android:toYDelta="200"android:duration="2000"/>
</set>

2、在activity中使用

     ImageView img=findViewById(R.id.image);img.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {
//                通过加载xml动画设置文件,来创建一个Animation对象Animation animation=AnimationUtils.loadAnimation(TweenAnimActivity.this,R.anim.translate);img.startAnimation(animation);}});

三、属性动画:
1第一、ValueAnimator:

  @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_tween_anim);ValueAnimator animator=ValueAnimator.ofFloat(0f,1f);animator.setDuration(2000);animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(@NonNull ValueAnimator animation) {Object value = animation.getAnimatedValue();Log.d(TAG, "onAnimationUpdate: "+value);}});animator.start();}

第二、ObjectAnimator:给某个空间设置动画就家那个控件

    @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_tween_anim);TextView textView=findViewById(R.id.tv);
//        第二个参数只要是textview中有set的属性都可以设置ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(textView, "alpha", 0f,1f);objectAnimator.setDuration(2000);objectAnimator.start();}

第三、监听器:
1、全部监听,重写所有

        objectAnimator.addListener(new Animator.AnimatorListener() {@Overridepublic void onAnimationStart(@NonNull Animator animation) {
//                开始调用}@Overridepublic void onAnimationEnd(@NonNull Animator animation) {
//               结束调用}@Overridepublic void onAnimationCancel(@NonNull Animator animation) {
//                取消调用}@Overridepublic void onAnimationRepeat(@NonNull Animator animation) {
//                重复执行调用}});

2、使用哪个监听,重写哪个

     objectAnimator.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationStart(Animator animation) {super.onAnimationStart(animation);}});

相关文章:

  • 几个小窍门
  • Python基础-列表、元组、字典、集合
  • 【python】Debian安装miniconda、spyder、tushare
  • K8S(十一)—Service详解
  • C#中的协变和逆变
  • 【MYSQL】-库的操作
  • JVM- 为什么G1垃圾回收器需要有大对象区
  • 物业该如何处理物业报修问题?工单管理系统如何统一管理报修需求?
  • 0089__一条普遍存在于嵌入式实时系统(RTOS)中的嵌套使用互斥量的bug分析
  • Apollo Planning——换道:LANE_CHANGE_DECIDER
  • 2312d,D语言单元测试等
  • 超级计算机与天气预报:精准预测的科技革命
  • x3::forward_ast
  • 七大主流的HttpClient程序比较
  • 国内外网络安全现状与存在的问题。应该如何缓解或解决这些问题
  • [译]CSS 居中(Center)方法大合集
  • 07.Android之多媒体问题
  • bearychat的java client
  • CSS盒模型深入
  • mongo索引构建
  • mysql 5.6 原生Online DDL解析
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 官方解决所有 npm 全局安装权限问题
  • 聊聊sentinel的DegradeSlot
  • 项目实战-Api的解决方案
  • 用element的upload组件实现多图片上传和压缩
  • # 达梦数据库知识点
  • #laravel 通过手动安装依赖PHPExcel#
  • (1)Android开发优化---------UI优化
  • (11)MSP430F5529 定时器B
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)Sql Server 保留几位小数的两种做法
  • (转)大型网站架构演变和知识体系
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • ***检测工具之RKHunter AIDE
  • .form文件_一篇文章学会文件上传
  • .NET 命令行参数包含应用程序路径吗?
  • .Net 应用中使用dot trace进行性能诊断
  • .NET/C# 的字符串暂存池
  • .NetCore部署微服务(二)
  • .NET连接数据库方式
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • /etc/sudoers (root权限管理)
  • @html.ActionLink的几种参数格式
  • [ 第一章] JavaScript 简史
  • [23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution