教你一个简单炫酷的app程序的打开动画(干货)

文章同步我的csdn博客
app也是有颜值,动画就是一种化妆术,他让你的app更加炫酷,首先给你看下图

这就是我们今天要做的东西

首先呢,先普及下总体的框架知识,有三种动画
(1)Drawable Animation:逐帧动画,就像电影一样,一帧一帧,拼接在一起在人眼中就是连续的,可以简单的理解为图片切换,缺点就是图片过多或过大会造成oom
(2)View Animation:视图动画,比较适合那种不用和用户交互的东湖
(3)Property Animation:是android 3.0以后加入的,为了解决视图动画的缺点,就是组件移动化为实际的移动,现在大部分也用

首先先来讲讲视图动画,也就是这次我们实现上图效果的方式,有四种动画方式
这里写图片描述


你想一想我们动画就是会动的画面(view),总结下来不就是靠这四个行为:改变透明度(那些view逐渐带化的),view的旋转,view的移动,view的缩小放大,
有两种表现方式,一种是java代码,一种是xml文件,更推荐后一种,可读性会更强一些,java代码的 实现方式如下

AlPhaAnimation aa=new AlphaAnimation(0,1);//创建一个透明度动画实例
aa.setDuration(100);
view.setAnimation(aa);

很简单吧,其他三种动画同理,就是构造器不同而已,
现在我们来实现下开篇那个动图效果,首先我们需要一个布局文件先贴代码,也就是先把材料准备好

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/blue"
    android:orientation="vertical" >
    <LinearLayout
        android:id="@+id/text_lin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:orientation="vertical" >
        
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="医立方"
            android:textColor="@color/text_white"
            android:textSize="40sp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="好玩的医立方"
            android:textColor="@color/text_white"
            android:textSize="14sp" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/text_hide_lin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:background="@color/blue"
        android:orientation="vertical" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="医立方"
            android:textColor="@color/blue"
            android:textSize="40sp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="好玩的医立方"
            android:textColor="@color/blue"
            android:textSize="14sp" />
    </LinearLayout>

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:src="@mipmap/ic_white_cube" />
</RelativeLayout>

这个布局包括一个ImageView和两个一模一样的线性布局(除了字体颜色),用来显示文字,然后把他们全部居中
这里写图片描述

此时或许你会有一个为什么那些字体不显示,因为他被覆盖掉了,后面添加布局覆盖在前一层上面,所以最外层就是一个imageView而已,对于同一个位置的view,后添加的会把前面添加的给覆盖下去,这对我们后来的字体逐渐出现这是用到这种覆盖的效果,接下来我们要开始让这个动画动起来了,一开始我们先让图片先动起来先,首先我把这个动画分解为4个部分吧,
第一步,自由落体,自然就是用的是位移动画,并且在这个过程中那个图片不断的放大

     <scale
        android:duration="1200"
        android:fromXScale="25%"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fromYScale="25%"
        android:toXScale="125%"
        android:toYScale="125%"
        android:interpolator="@android:anim/linear_interpolator"/>

    <translate
        android:duration="1200"
        android:fromXDelta="0%"
        android:fromYDelta="0%"
        android:toXDelta="0%"
        android:toYDelta="80%p"
        />

如果你之前没有接触过动画,可能会对这几个属性很陌生,首先duration指的就是,这个动画的持续时间,而fromX(Y)Scale和toX(Y)Scale,指的是图形x轴y轴放大起始点和终点,在我这里就是将图片充25%放大到125%,而interpolator这个属性指的是差值器,也就是用来调整变化的速度,是加速的,减速呢还是变速,有这几种值


这里写图片描述

接下来就是位移动画,同样,你想要告诉系统怎么位移肯定也就得告诉他起始点和终点吧,顾名思义,也就是fromX(Y)Delta和toX(Y)Delta啦,这里重要是是讲
80%和80%p是什么区别,这里p指的是父类,也就是说,对于位移来说,80%指的是位移自己长度的80%,而80%p指的是位移父类的长度80%,多说无益,上图


这里写图片描述

这里写图片描述

这里指展示以父类为标准的,同理没有p就是以自身为标准

第二部自然就是弹上来又掉下去啦

     <translate
        android:startOffset="1200"
        android:interpolator="@android:anim/decelerate_interpolator"
        android:duration="200"
        android:toYDelta="-15%p"
        />
    <translate
        android:startOffset="1400"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:duration="200"
        android:toYDelta="15%p"
        />

基本和上面差不多,多了一个新东西,也就是startOffset,指的是动画开始后多少秒执行,这里是1400ms,也就是要在第一步完成之后执行啦

接下来就是第三步啦,这个和第一步类似不过是相反,不是往下掉,二是往上弹,而且这个过程中缩小图片

<set
        android:startOffset="1600"
        android:interpolator="@android:anim/linear_interpolator">
        <scale
            android:duration="1200"
            android:pivotX="50%"
            android:pivotY="50%"
            android:fromXScale="100%"
            android:fromYScale="100%"
            android:toXScale="80%"
            android:toYScale="80%" />

        <translate
            android:duration="1200"
            android:toXDelta="-20%p"
            android:toYDelta="-50%p"/>
    </set>

第四步啦,也就是字体逐渐显示,这里你想一想我们现实中的用一块布这是牌匾,然后将布从左往右啦,那么字体是不是就是从左往右逐渐显示啦?而所谓的不不就是我在布局中重复定义了,却把字体设置成和背景一样颜色的线性布局嘛,先把我们要显示字体移动到指定位置,这里是向x轴移动自身长度35%,y轴上移动,父类高度的15%,代码如下

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true">
    <translate

        android:fromXDelta="35%"
        android:fromYDelta="15%p"
        android:toXDelta="35%"
        android:toYDelta="15%p"/>
</set>

接下来就是要移动所谓‘拉布’,在这600ms时间内,他就会逐渐把遮住的字逐渐显示出来啦

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="600"
    android:fillAfter="true"
    >
    <translate
        android:fromXDelta="35%"
        android:fromYDelta="15%p"
        android:toXDelta="135%"
        android:toYDelta="15%p"
        />
</set>

最后一步只需要用java代码把动画加载进去就可以了

final LinearLayout tv_lin= (LinearLayout) findViewById(R.id.text_lin);//要显示的字体
        final LinearLayout tv_hide_lin= (LinearLayout) findViewById(R.id.text_hide_lin);//所谓的布
        ImageView logo= (ImageView) findViewById(R.id.image);//图片
        Animation animation = AnimationUtils.loadAnimation(this,R.anim.splash);
        logo.startAnimation(animation);//开始执行动画
        animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                //第一个动画执行完后执行第二个动画就是那个字体显示那部分
                animation=AnimationUtils.loadAnimation(MainActivity.this,R.anim.text_splash_position);
                tv_lin.startAnimation(animation);
                animation=AnimationUtils.loadAnimation(MainActivity.this,R.anim.text_canvas);
                tv_hide_lin.startAnimation(animation);
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });

我知道看到这里你肯定还有不懂得地方,我就附上源码源码地址

ps:如果你觉得我的文章对你有帮助,那么就顶那里点一下或者github上star一下啦,也可以关注我的公众号,左上角有二维码,有什么问题都可以问我,文章会同步发布哦
ps:如果你觉得我文章哪里写错了或者哪里太糟糕了,欢迎指出,

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,475评论 25 707
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,357评论 0 17
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,019评论 4 62
  • java NIO(一)Channel nio中的channel与流的区别在于,流的读写通常是单向的,而通道可以异步...
    devel_carl阅读 216评论 0 0
  • 《看图写诗——不离不弃》 身上布满沧桑 一片树叶的生命也很脆弱 风是杀手之一 你若要走,我也不留 另一片不离不弃 ...
    金书js阅读 217评论 2 3