Android特效专辑(七)——飞机升空特效,一键清理缓存,灵活运用属性动画
2016-12-08 16:28
423 查看
A
4000
ndroid特效专辑(七)——飞机升空特效,一键清理缓存,灵活运用属性动画
最近的几篇博文反响还不错,也会继续的写下去的,关于这些特效的专辑,大多数也是借鉴大神的,最近由于工作的关系,会深入的了解一下Android BLE与硬件设备的串口通讯相关的内容,也会时不时的分享出来,当然,大家是一起学习,我毕竟也是初学者,今天讲的是小火箭的动画效果,用到了基础动画做了一些偷梁换柱的事情,明天还是后天,再更新一个心型起泡飞舞的特效,就不会这么持续的更新特效专辑这一系列了,毕竟《Only》这个软件也正在开发当中,最重要的还是交互,不是特效,特效多了反而会鸡肋,并且机型适配方面可能导致一些不确定的因素也是有的,所以,这几天可能会多分享一些蓝牙相关的东西了,当然,会持续的更新Android实用案例这个系列,很多的Android技术等你一起来玩。 我们先来看看今天的效果图吧:
截图
感觉是不是挺好玩的?其实,我其实就是用了三张图片,用黑色背景我们看看这三张图片
好的,知道了这三张图片,我们在res文件下新建一个anim文件夹,然后把他们三个的动画加上
cloud.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <alpha android:duration="800" android:fromAlpha="0" android:startOffset="300" android:toAlpha="1.0" > </alpha> <translate android:duration="800" android:fromYDelta="100%" android:interpolator="@android:anim/accelerate_interpolator" android:startOffset="300" android:toYDelta="0%" /> <alpha android:duration="500" android:fromAlpha="1.0" android:startOffset="2050" android:toAlpha="0" > </alpha> <translate android:duration="650" android:fromYDelta="0%" android:startOffset="2050" android:toYDelta="100%" /> </set>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
launcher.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="200" android:fromYDelta="100%" android:startOffset="2050" android:toYDelta="0%" /> <alpha android:duration="450" android:fromAlpha="1.0" android:startOffset="2250" android:toAlpha="0" > </alpha> </set>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
rocket.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="500" android:fromYDelta="100%" android:toYDelta="-5%p" /> <translate android:duration="500" android:fromYDelta="0%p" android:startOffset="500" android:toYDelta="4%p" /> <translate android:duration="500" android:fromYDelta="0%p" android:startOffset="1000" android:toYDelta="-1.5%p" /> <translate android:duration="300" android:fromYDelta="0%p" android:startOffset="1750" android:toYDelta="8%p" /> <translate android:duration="400" android:fromYDelta="0%p" android:interpolator="@android:anim/accelerate_interpolator" android:startOffset="2050" android:toYDelta="-108%p" /> </set>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/root" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/black" > <ImageView android:id="@+id/cloud" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="@drawable/cloud" android:visibility="invisible" /> <ImageView android:id="@+id/launcher" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:src="@drawable/launcher" android:visibility="invisible" /> <ImageView android:id="@+id/rocket" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:paddingLeft="8dp" android:src="@drawable/rocket" android:visibility="invisible" /> <Button android:id="@+id/getup" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:text="启动火箭" android:textColor="#ffffff" android:textSize="20dp" /> </RelativeLayout>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
三个动画,然后就是布局,一个按钮启动,然后三张图片显示出来并且出来一个动画,是不是思路越来越清晰了?
MainActivity
package com.lgl.recht; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.view.animation.AnimationUtils; import android.widget.Button; public class MainActivity extends Activity implements OnClickListener { private Handler mHandler = new Handler(); private Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn = (Button) findViewById(R.id.getup); btn.setOnClickListener(this); } private void launcherTheRocket() { mHandler.postDelayed(new Runnable() { @Override public void run() { final View rocket = findViewById(R.id.rocket); //初始化 Animation rocketAnimation = AnimationUtils.loadAnimation( getApplicationContext(), R.anim.rocket); //设置动画监听 rocketAnimation .setAnimationListener(new VisibilityAnimationListener( rocket)); //开启 rocket.startAnimation(rocketAnimation); final View cloud = findViewById(R.id.cloud); Animation cloudAnimation = AnimationUtils.loadAnimation( getApplicationContext(), R.anim.cloud); cloudAnimation .setAnimationListener(new VisibilityAnimationListener( cloud)); cloud.startAnimation(cloudAnimation); final View launcher = findViewById(R.id.launcher); Animation launcherAnimation = AnimationUtils.loadAnimation( getApplicationContext(), R.anim.launcher); launcherAnimation .setAnimationListener(new VisibilityAnimationListener( launcher)); launcher.startAnimation(launcherAnimation); } }, 150); } public class VisibilityAnimationListener implements AnimationListener { private View mVisibilityView; public VisibilityAnimationListener(View view) { mVisibilityView = view; } public void setVisibilityView(View view) { mVisibilityView = view; } //动画开始 @Override public void onAnimationStart(Animation animation) { Log.i("START", "..."); if (mVisibilityView != null) { mVisibilityView.setVisibility(View.VISIBLE); // mVisibilityView.setVisibility(View.GONE); } } //动画结束 @Override public void onAnimationEnd(Animation animation) { Log.i("END", "..."); if (mVisibilityView != null) { mVisibilityView.setVisibility(View.GONE); } } @Override public void onAnimationRepeat(Animation animation) { } } @Override public void onClick(View v) { //启动 launcherTheRocket(); } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
好的,我们可以来运行一下了
这里我们并没有添加清理缓存的功能,我们在下面实现,这里提供一个工具类
DataCleanManager
package com.lgl.data; import java.io.File; import java.math.BigDecimal; import android.content.Context; import android.os.Environment; /** * 本应用数据清除管理器 */ public class DataCleanManager { public static String getTotalCacheSize(Context context) throws Exception { long cacheSize = getFolderSize(context.getCacheDir()); if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { cacheSize += getFolderSize(context.getExternalCacheDir()); } return getFormatSize(cacheSize); } public static void clearAllCache(Context context) { deleteDir(context.getCacheDir()); if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { deleteDir(context.getExternalCacheDir()); } } private static boolean deleteDir(File dir) { if (dir != null && dir.isDirectory()) { String[] children = dir.list(); for (int i = 0; i < children.length; i++) { boolean success = deleteDir(new File(dir, children[i])); if (!success) { return false; } } } return dir.delete(); } // 获取文件 // Context.getExternalFilesDir() --> SDCard/Android/data/你的应用的包名/files/ // 目录,一般放一些长时间保存的数据 // Context.getExternalCacheDir() --> // SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据 public static long getFolderSize(File file) throws Exception { long size = 0; try { File[] fileList = file.listFiles(); for (int i = 0; i < fileList.length; i++) { // 如果下面还有文件 if (fileList[i].isDirectory()) { size = size + getFolderSize(fileList[i]); } else { size = size + fileList[i].length(); } } } catch (Exception e) { e.printStackTrace(); } return size; } /** * 格式化单位 * * @param size */ public static String getFormatSize(double size) { double kiloByte = size / 1024; if (kiloByte < 1) { return size + "Byte"; } double megaByte = kiloByte / 1024; if (megaByte < 1) { BigDecimal result1 = new BigDecimal(Double.toString(kiloByte)); return result1.setScale(2, BigDecimal.ROUND_HALF_UP) .toPlainString() + "KB"; } double gigaByte = megaByte / 1024; if (gigaByte < 1) { BigDecimal result2 = new BigDecimal(Double.toString(megaByte)); return result2.setScale(2, BigDecimal.ROUND_HALF_UP) .toPlainString() + "MB"; } double teraBytes = gigaByte / 1024; if (teraBytes < 1) { BigDecimal result3 = new BigDecimal(Double.toString(gigaByte)); return result3.setScale(2, BigDecimal.ROUND_HALF_UP) .toPlainString() + "GB"; } BigDecimal result4 = new BigDecimal(teraBytes); return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "TB"; } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
使用方法
private DataCleanManager dm; try { //缓存大小 tv.setText(dm.getTotalCacheSize(this)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } //清理缓存 dm.clearAllCache(MainActivity.this);1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
大伙觉得好的话,欢迎点个赞,嘿嘿!
Demo下载地址:http://download.csdn.net/detail/qq_26787115/9412013
相关文章推荐
- Android特效专辑(七)——飞机升空特效,一键清理缓存,灵活运用动画会有不一样的感受
- Android特效专辑(七)——飞机升空特效,一键清理缓存,灵活运用动画会有不一样的感受
- Android 一键清理内存,缓存,文件代码
- Android进阶学习-属性动画(使用Animator封装特效工具类2)
- Android 属性动画特效
- Android 属性动画浅谈(二)基础运用及工作原理
- Android特效专辑(五)——自定义圆形头像和仿MIUI卸载动画—粒子爆炸
- Android特效专辑(五)——自定义圆形头像和仿MIUI卸载动画—粒子爆炸
- Android特效专辑(五)——自定义圆形头像和仿MIUI卸载动画—粒子爆炸
- Android进阶学习-属性动画(使用Animator封装特效工具类1)
- 用属性动画简简单单实现android导航栏特效
- Android 动画特效的运用
- Android属性动画运用实例
- 【Android游戏开发二十二】(图文详解)游戏中灵活实现动画播放!简述J2me的游戏类库与Android游戏开发!
- android 缓存 清理
- Android属性动画---Property Animation(八)
- Android Activity界面切换添加动画特效
- Android动画中的fillBefore和fillAfter属性
- Android属性动画---Property Animation(三)
- Android清理软件缓存