Android特效专辑(七)——飞机升空特效,一键清理缓存,灵活运用属性动画

最近的几篇博文反响还不错,也会继续的写下去的,关于这些特效的专辑,大多数也是借鉴大神的,最近由于工作的关系,会深入的了解一下Android BLE与硬件设备的串口通讯相关的内容,也会时不时的分享出来,当然,大家是一起学习,我毕竟也是初学者,今天讲的是小火箭的动画效果,用到了基础动画做了一些偷梁换柱的事情,明天还是后天,再更新一个心型起泡飞舞的特效,就不会这么持续的更新特效专辑这一系列了,毕竟《Only》这个软件也正在开发当中,最重要的还是交互,不是特效,特效多了反而会鸡肋,并且机型适配方面可能导致一些不确定的因素也是有的,所以,这几天可能会多分享一些蓝牙相关的东西了,当然,会持续的更新Android实用案例这个系列,很多的Android技术等你一起来玩。
我们先来看看今天的效果图吧:

截图

感觉是不是挺好玩的?其实,我其实就是用了三张图片,用黑色背景我们看看这三张图片

好的,知道了这三张图片,我们在res文件下新建一个anim文件夹,然后把他们三个的动画加上

cloud.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android" >
  3. <alpha
  4. android:duration="800"
  5. android:fromAlpha="0"
  6. android:startOffset="300"
  7. android:toAlpha="1.0" >
  8. </alpha>
  9. <translate
  10. android:duration="800"
  11. android:fromYDelta="100%"
  12. android:interpolator="@android:anim/accelerate_interpolator"
  13. android:startOffset="300"
  14. android:toYDelta="0%" />
  15. <alpha
  16. android:duration="500"
  17. android:fromAlpha="1.0"
  18. android:startOffset="2050"
  19. android:toAlpha="0" >
  20. </alpha>
  21. <translate
  22. android:duration="650"
  23. android:fromYDelta="0%"
  24. android:startOffset="2050"
  25. android:toYDelta="100%" />
  26. </set>

launcher.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android" >
  3. <translate
  4. android:duration="200"
  5. android:fromYDelta="100%"
  6. android:startOffset="2050"
  7. android:toYDelta="0%" />
  8. <alpha
  9. android:duration="450"
  10. android:fromAlpha="1.0"
  11. android:startOffset="2250"
  12. android:toAlpha="0" >
  13. </alpha>
  14. </set>

rocket.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android" >
  3. <translate
  4. android:duration="500"
  5. android:fromYDelta="100%"
  6. android:toYDelta="-5%p" />
  7. <translate
  8. android:duration="500"
  9. android:fromYDelta="0%p"
  10. android:startOffset="500"
  11. android:toYDelta="4%p" />
  12. <translate
  13. android:duration="500"
  14. android:fromYDelta="0%p"
  15. android:startOffset="1000"
  16. android:toYDelta="-1.5%p" />
  17. <translate
  18. android:duration="300"
  19. android:fromYDelta="0%p"
  20. android:startOffset="1750"
  21. android:toYDelta="8%p" />
  22. <translate
  23. android:duration="400"
  24. android:fromYDelta="0%p"
  25. android:interpolator="@android:anim/accelerate_interpolator"
  26. android:startOffset="2050"
  27. android:toYDelta="-108%p" />
  28. </set>

activity_main.xml

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:id="@+id/root"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:background="@android:color/black" >
  7. <ImageView
  8. android:id="@+id/cloud"
  9. android:layout_width="match_parent"
  10. android:layout_height="wrap_content"
  11. android:layout_alignParentBottom="true"
  12. android:background="@drawable/cloud"
  13. android:visibility="invisible" />
  14. <ImageView
  15. android:id="@+id/launcher"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"
  18. android:layout_alignParentBottom="true"
  19. android:layout_centerHorizontal="true"
  20. android:src="@drawable/launcher"
  21. android:visibility="invisible" />
  22. <ImageView
  23. android:id="@+id/rocket"
  24. android:layout_width="wrap_content"
  25. android:layout_height="wrap_content"
  26. android:layout_alignParentBottom="true"
  27. android:layout_centerHorizontal="true"
  28. android:paddingLeft="8dp"
  29. android:src="@drawable/rocket"
  30. android:visibility="invisible" />
  31. <Button
  32. android:id="@+id/getup"
  33. android:layout_width="wrap_content"
  34. android:layout_height="wrap_content"
  35. android:layout_alignParentBottom="true"
  36. android:layout_centerHorizontal="true"
  37. android:text="启动火箭"
  38. android:textColor="#ffffff"
  39. android:textSize="20dp" />
  40. </RelativeLayout>
  1. 三个动画,然后就是布局,一个按钮启动,然后三张图片显示出来并且出来一个动画,是不是思路越来越清晰了?

MainActivity

  1. package com.lgl.recht;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.os.Handler;
  5. import android.util.Log;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.view.animation.Animation;
  9. import android.view.animation.Animation.AnimationListener;
  10. import android.view.animation.AnimationUtils;
  11. import android.widget.Button;
  12. public class MainActivity extends Activity implements OnClickListener {
  13. private Handler mHandler = new Handler();
  14. private Button btn;
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_main);
  19. btn = (Button) findViewById(R.id.getup);
  20. btn.setOnClickListener(this);
  21. }
  22. private void launcherTheRocket() {
  23. mHandler.postDelayed(new Runnable() {
  24. @Override
  25. public void run() {
  26. final View rocket = findViewById(R.id.rocket);
  27. //初始化
  28. Animation rocketAnimation = AnimationUtils.loadAnimation(
  29. getApplicationContext(), R.anim.rocket);
  30. //设置动画监听
  31. rocketAnimation
  32. .setAnimationListener(new VisibilityAnimationListener(
  33. rocket));
  34. //开启
  35. rocket.startAnimation(rocketAnimation);
  36. final View cloud = findViewById(R.id.cloud);
  37. Animation cloudAnimation = AnimationUtils.loadAnimation(
  38. getApplicationContext(), R.anim.cloud);
  39. cloudAnimation
  40. .setAnimationListener(new VisibilityAnimationListener(
  41. cloud));
  42. cloud.startAnimation(cloudAnimation);
  43. final View launcher = findViewById(R.id.launcher);
  44. Animation launcherAnimation = AnimationUtils.loadAnimation(
  45. getApplicationContext(), R.anim.launcher);
  46. launcherAnimation
  47. .setAnimationListener(new VisibilityAnimationListener(
  48. launcher));
  49. launcher.startAnimation(launcherAnimation);
  50. }
  51. }, 150);
  52. }
  53. public class VisibilityAnimationListener implements AnimationListener {
  54. private View mVisibilityView;
  55. public VisibilityAnimationListener(View view) {
  56. mVisibilityView = view;
  57. }
  58. public void setVisibilityView(View view) {
  59. mVisibilityView = view;
  60. }
  61. //动画开始
  62. @Override
  63. public void onAnimationStart(Animation animation) {
  64. Log.i("START", "...");
  65. if (mVisibilityView != null) {
  66. mVisibilityView.setVisibility(View.VISIBLE);
  67. // mVisibilityView.setVisibility(View.GONE);
  68. }
  69. }
  70. //动画结束
  71. @Override
  72. public void onAnimationEnd(Animation animation) {
  73. Log.i("END", "...");
  74. if (mVisibilityView != null) {
  75. mVisibilityView.setVisibility(View.GONE);
  76. }
  77. }
  78. @Override
  79. public void onAnimationRepeat(Animation animation) {
  80. }
  81. }
  82. @Override
  83. public void onClick(View v) {
  84. //启动
  85. launcherTheRocket();
  86. }
  87. }
  1. 好的,我们可以来运行一下了
  1. 这里我们并没有添加清理缓存的功能,我们在下面实现,这里提供一个工具类

DataCleanManager

  1. package com.lgl.data;
  2. import java.io.File;
  3. import java.math.BigDecimal;
  4. import android.content.Context;
  5. import android.os.Environment;
  6. /** * 本应用数据清除管理器 */
  7. public class DataCleanManager {
  8. public static String getTotalCacheSize(Context context) throws Exception {
  9. long cacheSize = getFolderSize(context.getCacheDir());
  10. if (Environment.getExternalStorageState().equals(
  11. Environment.MEDIA_MOUNTED)) {
  12. cacheSize += getFolderSize(context.getExternalCacheDir());
  13. }
  14. return getFormatSize(cacheSize);
  15. }
  16. public static void clearAllCache(Context context) {
  17. deleteDir(context.getCacheDir());
  18. if (Environment.getExternalStorageState().equals(
  19. Environment.MEDIA_MOUNTED)) {
  20. deleteDir(context.getExternalCacheDir());
  21. }
  22. }
  23. private static boolean deleteDir(File dir) {
  24. if (dir != null && dir.isDirectory()) {
  25. String[] children = dir.list();
  26. for (int i = 0; i < children.length; i++) {
  27. boolean success = deleteDir(new File(dir, children[i]));
  28. if (!success) {
  29. return false;
  30. }
  31. }
  32. }
  33. return dir.delete();
  34. }
  35. // 获取文件
  36. // Context.getExternalFilesDir() --> SDCard/Android/data/你的应用的包名/files/
  37. // 目录,一般放一些长时间保存的数据
  38. // Context.getExternalCacheDir() -->
  39. // SDCard/Android/data/你的应用包名/cache/目录,一般存放临时缓存数据
  40. public static long getFolderSize(File file) throws Exception {
  41. long size = 0;
  42. try {
  43. File[] fileList = file.listFiles();
  44. for (int i = 0; i < fileList.length; i++) {
  45. // 如果下面还有文件
  46. if (fileList[i].isDirectory()) {
  47. size = size + getFolderSize(fileList[i]);
  48. } else {
  49. size = size + fileList[i].length();
  50. }
  51. }
  52. } catch (Exception e) {
  53. e.printStackTrace();
  54. }
  55. return size;
  56. }
  57. /**
  58. * 格式化单位
  59. *
  60. * @param size
  61. */
  62. public static String getFormatSize(double size) {
  63. double kiloByte = size / 1024;
  64. if (kiloByte < 1) {
  65. return size + "Byte";
  66. }
  67. double megaByte = kiloByte / 1024;
  68. if (megaByte < 1) {
  69. BigDecimal result1 = new BigDecimal(Double.toString(kiloByte));
  70. return result1.setScale(2, BigDecimal.ROUND_HALF_UP)
  71. .toPlainString() + "KB";
  72. }
  73. double gigaByte = megaByte / 1024;
  74. if (gigaByte < 1) {
  75. BigDecimal result2 = new BigDecimal(Double.toString(megaByte));
  76. return result2.setScale(2, BigDecimal.ROUND_HALF_UP)
  77. .toPlainString() + "MB";
  78. }
  79. double teraBytes = gigaByte / 1024;
  80. if (teraBytes < 1) {
  81. BigDecimal result3 = new BigDecimal(Double.toString(gigaByte));
  82. return result3.setScale(2, BigDecimal.ROUND_HALF_UP)
  83. .toPlainString() + "GB";
  84. }
  85. BigDecimal result4 = new BigDecimal(teraBytes);
  86. return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString()
  87. + "TB";
  88. }
  89. }

使用方法

  1. private DataCleanManager dm;
  2. try {
  3. //缓存大小
  4. tv.setText(dm.getTotalCacheSize(this));
  5. } catch (Exception e) {
  6. // TODO Auto-generated catch block
  7. e.printStackTrace();
  8. }
  9. //清理缓存
  10. dm.clearAllCache(MainActivity.this);

大伙觉得好的话,欢迎点个赞,嘿嘿!

Demo下载地址:http://download.csdn.net/detail/qq_26787115/9412013