Android特效专辑(七)——飞机升空特效,一键清理缓存,灵活运用动画会有不一样的感受

简介: <div class="markdown_views"><h1 id="android特效专辑七飞机升空特效一键清理缓存灵活运用属性动画">Android特效专辑(七)——飞机升空特效,一键清理缓存,灵活运用属性动画</h1><hr><blockquote> <p>最近的几篇博文反响还不错,也会继续的写下去的,关于这些特效的专辑,大多数也是借鉴大神的,最近由于工作的

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

目录
相关文章
|
12月前
|
Android开发 开发者
Android利用SVG实现动画效果
本文介绍了如何在Android中利用SVG实现动画效果。首先通过定义`pathData`参数(如M、L、Z等)绘制一个简单的三角形SVG图形,然后借助`objectAnimator`实现动态的线条绘制动画。文章详细讲解了从配置`build.gradle`支持VectorDrawable,到创建动画文件、关联SVG与动画,最后在Activity中启动动画的完整流程。此外,还提供了SVG绘制原理及工具推荐,帮助开发者更好地理解和应用SVG动画技术。
566 30
|
12月前
|
Android开发 UED 计算机视觉
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
本文介绍了一款受游戏“金铲铲之战”启发的Android自定义View——线条等待动画的实现过程。通过将布局分为10份,利用`onSizeChanged`测量最小长度,并借助画笔绘制动态线条,实现渐变伸缩效果。动画逻辑通过四个变量控制线条的增长与回退,最终形成流畅的等待动画。代码中详细展示了画笔初始化、线条绘制及动画更新的核心步骤,并提供完整源码供参考。此动画适用于加载场景,提升用户体验。
687 5
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
|
12月前
|
API Android开发 开发者
Android颜色渐变动画效果的实现
本文介绍了在Android中实现颜色渐变动画效果的方法,重点讲解了插值器(TypeEvaluator)的使用与自定义。通过Android自带的颜色插值器ArgbEvaluator,可以轻松实现背景色的渐变动画。文章详细分析了ArgbEvaluator的核心代码,并演示了如何利用Color.colorToHSV和Color.HSVToColor方法自定义颜色插值器MyColorEvaluator。最后提供了完整的源码示例,包括ColorGradient视图类和MyColorEvaluator类,帮助开发者更好地理解和应用颜色渐变动画技术。
374 3
|
9月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
2333 10
|
12月前
|
Android开发 开发者
Android SVG动画详细例子
本文详细讲解了在Android中利用SVG实现动画效果的方法,通过具体例子帮助开发者更好地理解和应用SVG动画。文章首先展示了动画的实现效果,接着回顾了之前的文章链接及常见问题(如属性名大小写错误)。核心内容包括:1) 使用阿里图库获取SVG图形;2) 借助工具将SVG转换为VectorDrawable;3) 为每个路径添加动画绑定属性;4) 创建动画文件并关联SVG;5) 在ImageView中引用动画文件;6) 在Activity中启动动画。文末还提供了完整的代码示例和源码下载链接,方便读者实践操作。
552 65
|
12月前
|
XML Java Maven
Android线条等待动画JMWorkProgress(可添加依赖直接使用)
这是一篇关于Android线条等待动画JMWorkProgress的教程文章,作者计蒙将其代码开源至GitHub,提升可读性。文章介绍了如何通过添加依赖库使用该动画,并详细讲解了XML与Java中的配置方法,包括改变线条颜色、宽度、添加文字等自定义属性。项目已支持直接依赖集成(`implementation &#39;com.github.Yufseven:JMWorkProgress:v1.0&#39;`),开发者可以快速上手实现炫酷的等待动画效果。文末附有GitHub项目地址,欢迎访问并点赞支持!
363 26
|
12月前
|
Android开发 开发者
Android自定义view之围棋动画(化繁为简)
本文介绍了Android自定义View的动画实现,通过两个案例拓展动态效果。第一个案例基于`drawArc`方法实现单次动画,借助布尔值控制动画流程。第二个案例以围棋动画为例,从简单的小球直线运动到双向变速运动,最终实现循环动画效果。代码结构清晰,逻辑简明,展示了如何化繁为简实现复杂动画,帮助读者拓展动态效果设计思路。文末提供完整源码,适合初学者和进阶开发者学习参考。
219 0
Android自定义view之围棋动画(化繁为简)
|
12月前
|
Java Android开发 开发者
Android自定义view之围棋动画
本文详细介绍了在Android中自定义View实现围棋动画的过程。从测量宽高、绘制棋盘背景,到创建固定棋子及动态棋子,最后通过属性动画实现棋子的移动效果。文章还讲解了如何通过自定义属性调整棋子和棋盘的颜色及动画时长,并优化视觉效果,如添加渐变色让白子更明显。最终效果既可作为围棋动画展示,也可用作加载等待动画。代码完整,适合进阶开发者学习参考。
265 0
|
存储 缓存 Android开发
Android RecyclerView 缓存机制深度解析与面试题
本文首发于公众号“AntDream”,详细解析了 `RecyclerView` 的缓存机制,包括多级缓存的原理与流程,并提供了常见面试题及答案。通过本文,你将深入了解 `RecyclerView` 的高性能秘诀,提升列表和网格的开发技能。
459 8
|
存储 缓存 算法
Android Glide 缓存机制及源码
Glide的简单使用 Glide里的缓存 什么是三级缓存? 缓存机制 为何设计出活动缓存 加载流程 Glide源码 加载流程 1.Engine类 2.load方法 3.EngineKey 4.loadFromMemory 5.loadFromActiveResources 6.loadFromCache 7.getEngineResourceFromCache 8.waitForExistingOrStartNewJob 9.DecodeJob 10.DiskCacheProvider 11.DiskCache.Factory LRU是什么 内存缓存的LRU LruCache LruCache
701 0
Android Glide 缓存机制及源码