Android属性动画初步学习笔记

近期学习Android属性动画和VetcorDrawable实现属性动画,以此记录一下学习笔记。

首先是属性动画,小白没截过动态图,方三张静态图吧

     

效果是点击红色图片,7个选项以属性动画的方式弹出并旋转,最后成一个1/4圆弧排列,再次点击则收回到红色原点下。

布局文件很简单,就是一个RelativeLayout下八个ImageView:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="vertical"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent">
 6
 7     <RelativeLayout
 8         android:gravity="center"
 9         android:layout_width="match_parent"
10         android:layout_height="match_parent">
11
12         <ImageView
13             android:layout_marginTop="5dp"
14             android:layout_marginLeft="5dp"
15             android:layout_width="24dp"
16             android:layout_height="24dp"
17             android:id="@+id/iv_b"
18             android:src="@drawable/b"
19             />
20         <ImageView
21             android:layout_marginTop="5dp"
22             android:layout_marginLeft="5dp"
23             android:layout_width="24dp"
24             android:layout_height="24dp"
25             android:id="@+id/iv_c"
26             android:src="@drawable/c"
27             />
28         <ImageView
29             android:layout_marginTop="5dp"
30             android:layout_marginLeft="5dp"
31             android:layout_width="24dp"
32             android:layout_height="24dp"
33             android:id="@+id/iv_d"
34             android:src="@drawable/d"
35             />
36         <ImageView
37             android:layout_marginTop="5dp"
38             android:layout_marginLeft="5dp"
39             android:layout_width="24dp"
40             android:layout_height="24dp"
41             android:id="@+id/iv_e"
42             android:src="@drawable/e"
43             />
44         <ImageView
45             android:layout_marginTop="5dp"
46             android:layout_marginLeft="5dp"
47             android:layout_width="24dp"
48             android:layout_height="24dp"
49             android:id="@+id/iv_f"
50             android:src="@drawable/f"
51             />
52         <ImageView
53             android:layout_marginTop="5dp"
54             android:layout_marginLeft="5dp"
55             android:layout_width="24dp"
56             android:layout_height="24dp"
57             android:id="@+id/iv_g"
58             android:src="@drawable/g"
59             />
60         <ImageView
61             android:layout_marginTop="5dp"
62             android:layout_marginLeft="5dp"
63             android:layout_width="24dp"
64             android:layout_height="24dp"
65             android:id="@+id/iv_h"
66             android:src="@drawable/h"
67             />
68         <ImageView
69             android:layout_width="40dp"
70             android:layout_height="40dp"
71             android:id="@+id/iv_a"
72             android:src="@drawable/a"
73             />
74
75     </RelativeLayout>
76
77 </LinearLayout>

接下来在MainActivity中,定义一个装有动画效果的ImageView的集合;所有ImageView的id的int数组;还有一个角度用来计算呈半圆排列时,每个图片的坐标;还有个boolean型flag用来判断点击是弹出还是回收:

1     private List<ImageView> imageViewList = new ArrayList<ImageView>();
2     private int[] res = new int[]{R.id.iv_a, R.id.iv_b, R.id.iv_c, R.id.iv_d, R.id.iv_e, R.id.iv_f, R.id.iv_g, R.id.iv_h};
3     private boolean flag = true;
4     private static double ANGLE = Math.PI/12;

接着是onCreate以及初始化控件和点击事件方法

 1     @Override
 2     protected void onCreate(Bundle savedInstanceState) {
 3         super.onCreate(savedInstanceState);
 4         setContentView(R.layout.activity_main);
 5
 6         initView();
 7     }
 8
 9     private void initView() {
10         for(int i = 0; i < res.length; i++) {
11             ImageView imageView = (ImageView) findViewById(res[i]);
12             imageView.setOnClickListener(this);
13             imageViewList.add(imageView);
14         }
15     }
16
17     @Override
18     public void onClick(View view) {
19         switch (view.getId()) {
20             case R.id.iv_a:
21                 if(flag) {
22                     startAnim();
23                 } else {
24                     stopAnim();
25                 }
26
27                 break;
28         }
29     }

最后则是重点,动画代码,也就是上面onClick方法里调用的startAnim()和stopAnim()所封装的弹出和收回两个方法:

 1     //收回动画
 2     private void stopAnim() {
 3         for(int i = res.length - 1; i > 0; i--) {
 4             ObjectAnimator animatorX = ObjectAnimator.ofFloat(imageViewList.get(i), "translationX", Math.round(300*(Math.cos((i-1)*ANGLE))), 0F);
 5             animatorX.setDuration(500);
 6             ObjectAnimator animatorY = ObjectAnimator.ofFloat(imageViewList.get(i), "translationY", Math.round(300*(Math.sin((i-1)*ANGLE))), 0F);
 7             animatorY.setDuration(500);
 8             ObjectAnimator animatorRotation = ObjectAnimator.ofFloat(imageViewList.get(i), "rotation", 5*360F, 0F);
 9             animator.setDuration(500);
10             AnimatorSet set = new AnimatorSet();
11             set.play(animatorX).with(animatorY).with(animatorRotation);
12             set.setStartDelay(i*300);
13             set.start();
14             flag = true;
15         }
16     }
17
18     //弹出动画
19     private void startAnim() {
20         for(int i = 1; i < res.length; i++) {
21             ObjectAnimator animatorX = ObjectAnimator.ofFloat(imageViewList.get(i), "translationX", 0F, Math.round(300*(Math.cos((i-1)*ANGLE))));
22             animatorX.setDuration(500);
23             ObjectAnimator animatorY = ObjectAnimator.ofFloat(imageViewList.get(i), "translationY", 0F, Math.round(300*(Math.sin((i-1)*ANGLE))));
24             animatorY.setDuration(500);
25             ObjectAnimator animatorRotation = ObjectAnimator.ofFloat(imageViewList.get(i), "rotation", 0F, 5*360F);
26             animator.setDuration(500);
27             AnimatorSet set = new AnimatorSet();
28             set.play(animatorX).with(animatorY).with(animatorRotation);
29             set.setStartDelay(i*300);
30             set.start();
31             flag = false;
32         }
33     }

三个属性动画分别是X轴,Y轴移动,和旋转;

ObjectAnimator的ofFloat的四个参数分别是需要执行动画的对象,动画的种类的属性名,开始时候的位置,结束时候的位置;

其中AnimatorSet的with是用于将三个动画同时展现,还有after用于控制顺序的;setStartDelay则是延迟展现,保证7张图片不要一下子全部弹出来,这些也可以根据具体需要进行修改组合。

最后感谢慕课网的eclipse_xu老师,这篇笔记正是看了徐老师的课程才写下的,收益颇丰,再次感谢!

时间: 2024-10-10 17:17:38

Android属性动画初步学习笔记的相关文章

Android(java)学习笔记264:Android下的属性动画高级用法(Property Animation)

1. 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是最常用的一些用法,这些用法足以覆盖我们平时大多情况下的动画需求了.但是,正如上篇文章当中所说到的,属性动画对补间动画进行了很大幅度的改进,之前补间动画可以做到的属性动画也能做到,补间动画做不到的现在属性动画也可以做到了.因此,今天我们就来学习一下属性动画的高级用法,看看如何实现一些补间动画所无法实现的功能. 2. ValueAnimator的高级用法: 在上篇文章中介绍补间动画缺点的时候有提到过,补间动画是只能对

Android属性动画之ValueAnimation

ValueAnimation是ObjectAnimation类的父类,经过前几天的介绍,相信大家对ObjectAnimation有了 一定的认识,今天就为大家最后介绍一下ValueAnimation,ValueAnimation谷歌提供了更好的过程控制,现在就以一个类计时的小动画为大家简单介绍一下: 应用的布局文件非常简单,只有一个Button按钮,就不再赘述了.下面重点介绍一下具体的实现: public void init() { button = (Button) findViewById(

Android属性动画完全解析(下),Interpolator和ViewPropertyAnimator的用法

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/44171115 大家好,欢迎继续回到Android属性动画完全解析.在上一篇文章当中我们学习了属性动画的一些进阶技巧,包括ValueAnimator和ObjectAnimator的高级用法,那么除了这些之外,当然还有一些其它的高级技巧在等着我们学习,因此本篇文章就对整个属性动画完全解析系列收个尾,来学习一下剩下的非常重要的高级技巧. 另外,本篇文章中使用的代码是建立在上篇文章基础之

Android属性动画之第一重修炼总结

经过这两天对ObjectAnimator属性动画的学习,基本对Android提供的属性动画有了一定的认识,现在就为大家以一个类似扇形打开的效果做总结. 效果图: 下面就让我们用刚刚学到的属性动画效果,来实现上述的效果:首先我们需要准备8张小图标,将他们放到res目录下的drawable文件中,下面就是布局文件,布局文件很简单,就是把这8张小图标使用ImageView引入到界面中,需要注意的就是把做为开关的图标,放到最下面,下面就看一下具体的实现: /** * 属性动画综合小例子 * Create

Android属性动画完全解析(上)

Android属性动画完全解析(上) 转载:http://blog.csdn.net/guolin_blog/article/details/43536355 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系统在一开始的时候就给我们提供了两种实现动画效果的方式,逐帧动画(frame-by-frame animation)和补间动画(tweened animation).逐帧动画的工作原理很简单,其实就是将一个完整的动画拆分成一张张单独的图片,然后再将它们连贯起来进行播放,类似

(转)Android属性动画完全解析(下),Interpolator和ViewPropertyAnimator的用法

目录(?)[-] Interpolator的用法 ViewPropertyAnimator的用法 转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/44171115 大家好,欢迎继续回到Android属性动画完全解析.在上一篇文章当中我们学习了属性动画的一些进阶技巧,包括ValueAnimator和ObjectAnimator的高级用法,那么除了这些之外,当然还有一些其它的高级技巧在等着我们学习,因此本篇文章就对整个属性动画完全解析

Android(java)学习笔记207:开源项目使用之gif view

1. 由于android没有自带的gif动画,我在Android(java)学习笔记198:Android下的帧动画(Drawable Animation) 播客中提到可以使用AnimationView(帧动画)方法先将一个gif动画利用软件分割成若干静态图片,然后按照一定的时间间隔和播放顺序一帧一帧播放图片,从而给用户体验仿佛是动画gif播放的效果 2.其实网上的开源项目中有更为完善的gif动画播放的代码,下面以此为例进一步了解开源项目的使用: (1)在https://github.com/网

Android属性动画Property Animation系列三之LayoutTransition(布局容器动画)

在上一篇中我们学习了属性动画的ObjectAnimator使用,不了解的可以看看 Android属性动画Property Animation系列一之ObjectAnimator.这一篇我们来学点新的东西.做项目的时候应该碰到这种问题:根据不同条件显示或者隐藏一个控件或者布局,我们能想到的第一个方法就是 调用View.setVisibility()方法.虽然实现了显示隐藏效果,但是总感觉这样的显示隐藏过程很僵硬,让人不是很舒服,那么有没有办法能让这种显示隐藏有个过渡的动画效果呢?答案是肯定的,不言

Android属性动画完全解析(中)

转载:http://blog.csdn.net/guolin_blog/article/details/43536355 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是最常用的一些用法,这些用法足以覆盖我们平时大多情况下的动画需求了.但是,正如上篇文章当中所说到的,属性动画对补间动画进行了很大幅度的改进,之前补间动画可以做到的属性动画也能做到,补间动画做不到的现在属性动画也可以做到了.因此,今天我们就来学习一下属性动画的高级用法,看看如何实现一些补间动画所无法实现