# Android特效專輯(七)——飛機升空特效,一鍵清理緩存,靈活運用屬性動畫
> 最近的幾篇博文反響還不錯,也會繼續的寫下去的,關于這些特效的專輯,大多數也是借鑒大神的,最近由于工作的關系,會深入的了解一下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>
~~~
### 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>
~~~
### 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>
~~~
### 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>
~~~
~~~
三個動畫,然后就是布局,一個按鈕啟動,然后三張圖片顯示出來并且出來一個動畫,是不是思路越來越清晰了?
~~~
### 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();
}
}
~~~
~~~
好的,我們可以來運行一下了
~~~

~~~
這里我們并沒有添加清理緩存的功能,我們在下面實現,這里提供一個工具類
~~~
### 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";
}
}
~~~
### 使用方法
~~~
private DataCleanManager dm;
try {
//緩存大小
tv.setText(dm.getTotalCacheSize(this));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//清理緩存
dm.clearAllCache(MainActivity.this);
~~~
### 大伙覺得好的話,歡迎點個贊,嘿嘿!
### Demo下載地址:[http://download.csdn.net/detail/qq_26787115/9412013](http://download.csdn.net/detail/qq_26787115/9412013)
- 前言
- (一)——水波紋過渡特效(首頁)
- (二)——ViewPager渲染背景顏色漸變(引導頁)
- (三)——自定義不一樣的Toast
- (四)——APP主頁框架TabHost綁定ViewPager的替換者TabLayout
- (五)——自定義圓形頭像和仿MIUI卸載動畫—粒子爆炸
- (六)——仿QQ聊天撒花特效,無形裝逼,最為致命
- (七)——飛機升空特效,一鍵清理緩存,靈活運用動畫會有不一樣的感受
- (八)——實現心型起泡飛舞的特效,讓你的APP瞬間暖心
- (九)——仿微信雷達搜索好友特效,邏輯清晰實現簡單
- (十)——點擊水波紋效果實現,邏輯清晰實現簡單
- (十一)——仿水波紋流量球進度條控制器,實現高端大氣的主流特效
- (十二)——仿支付寶咻一咻功能實現波紋擴散特效,精細小巧的View