Android特效专辑(七)——飞机升空特效,一键清理缓存,灵活运用动画会有不一样的感受
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
Android特效专辑(七)——飞机升空特效,一键清理缓存,灵活运用动画会有不一样的感受的更多相关文章
- Android特效专辑(五)——自定义圆形头像和仿MIUI卸载动画—粒子爆炸
Android特效专辑(五)--自定义圆形头像和仿MIUI卸载动画-粒子爆炸 好的,各位亲爱的朋友,今天讲的特效还是比较炫的,首先,我们会讲一个自定义圆形的imageView,接着,我们会来实现粒子爆 ...
- FireFox 一键清理缓存
https://addons.mozilla.org/zh-CN/firefox/addon/empty-cache-button/
- Android特效专辑(十二)——仿支付宝咻一咻功能实现波纹扩散特效,精细小巧的View
Android特效专辑(十二)--仿支付宝咻一咻功能实现波纹扩散特效,精细小巧的View 先来看看这个效果 这是我的在Only上添加的效果,说实话,Only现在都还只是半成品,台面都上不了,怪自己技术 ...
- Android特效专辑(十一)——仿水波纹流量球进度条控制器,实现高端大气的主流特效
Android特效专辑(十一)--仿水波纹流球进度条控制器,实现高端大气的主流特效 今天看到一个效果挺不错的,就模仿了下来,加上了一些自己想要的效果,感觉还不错的样子,所以就分享出来了,话不多说,上图 ...
- Android特效专辑(十)——点击水波纹效果实现,逻辑清晰实现简单
Android特效专辑(十)--点击水波纹效果实现,逻辑清晰实现简单 这次做的东西呢,和上篇有点类似,就是用比较简单的逻辑思路去实现一些比较好玩的特效,最近也是比较忙,所以博客更新的速度还得看时间去推 ...
- Android特效专辑(九)——仿微信雷达搜索好友特效,逻辑清晰实现简单
Android特效专辑(九)--仿微信雷达搜索好友特效,逻辑清晰实现简单 不知不觉这个春节也已经过完了,遗憾家里没网,没能及时给大家送上祝福,今天回到深圳,明天就要上班了,小伙伴们是不是和我一样呢?今 ...
- Android特效专辑(八)——实现心型起泡飞舞的特效,让你的APP瞬间暖心
Android特效专辑(八)--实现心型起泡飞舞的特效,让你的APP瞬间暖心 马上也要放年假了,家里估计会没网,更完这篇的话,可能要到年后了,不过在此期间会把更新内容都保存在本地,这样有网就可以发表了 ...
- Android特效专辑(六)——仿QQ聊天撒花特效,无形装逼,最为致命
Android特效专辑(六)--仿QQ聊天撒花特效,无形装逼,最为致命 我的关于特效的专辑已经在CSDN上申请了一个专栏--http://blog.csdn.net/column/details/li ...
- Android特效专辑(四)——APP主页框架TabHost绑定ViewPager的替换者TabLayout
Android特效专辑(四)--APP主页框架TabHost绑定ViewPager的替换者TabLayout 现在很多app都在追求简单明了,功能又要强大,不过我还是喜欢之前的app风格,就是TabH ...
随机推荐
- Android实现自动更新功能
Android实现自动更新功能 Android自动更新的功能可以使用第三方的SDK来实现,但是类似友盟,就不支持x86手机的自动更新,科大讯飞,弹窗是全局的,小米手机就会默认把弹窗权限关掉不允许弹出提 ...
- Android上下文菜单ContentView详解
ContentView介绍 上下文菜单继承了android.view.Menu,因此我们可以像操作Options Menu那样给上下文菜单增加菜单项.上下文菜单与Options Menu最大的不同在于 ...
- 3.Lucene3.x API分析,Director 索引操作目录,Document,分词器
1 Lucene卡发包结构分析 包名 功能 org.apache.lucene.analysis Analysis提供自带的各种Analyzer org.apache.lucene.colla ...
- Android View框架总结(四)View布局流程之Measure
View树的measure流程 View的measures时序图 View布局流程之measure measure过程 View的measure过程 ViewGroup的measure过程 Frame ...
- FFmpeg源代码简单分析:av_write_trailer()
===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...
- UNIX网络编程——原始套接字SOCK_RAW
实际上,我们常用的网络编程都是在应用层的报文的收发操作,也就是大多数程序员接触到的流式套接字(SOCK_STREAM)和数据包式套接字(SOCK_DGRAM).而这些数据包都是由系统提供的协议栈实现, ...
- SSH深度历险(四) Maven初步学习
这几天接触这个词,很多遍了,只是浅显的体会到它在GXPT中的好处,功能之强大,又通过网络查询了资料进一步的认识学习了,和大家分享. Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理 ...
- 新手学python(2):C语言调用完成数据库操作
继续介绍本人的python学习过程.本节介绍如何利用python调用c代码.内容还是基于音乐信息提取的过程,架构如图一.Python调用c实现的功能是利用python访问c语言完成mysql数据库操作 ...
- Android初级教程理论知识(第四章内容提供器)
之前第三章理论知识写到过数据库.数据库是在程序内部自己访问自己.而内容提供器是访问别的程序数据的,即跨程序共享数据.对访问的数据也无非就是CRUD. 内容提供者 应用的数据库是不允许其他应用访问的 内 ...
- RabbitMQ消息队列的小伙伴: ProtoBuf(Google Protocol Buffer)
什么是ProtoBuf? 一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化.它很适合做数据存储或 RPC 数据交换格式.可用于通讯协议.数据存储等领域的语言无关.平台无关.可扩 ...