Android L动画入门

Android L带来了许多新特性,其中就包括了大量的动画效果,你可以在自己的应用中使用。本文中我将详解这些动画和如何在应用中使用。本文中的所有代码可以在github上找到。

波纹和强调

现在安卓支持少量的预定义样式属性,不过只限于应用特定部分例如状态栏、导航栏。新系统允许我们采用简单的方式即可获得两种非常简洁、有用的动画:波纹和被强调的UI组件。波纹是一种给予用户在UI上动作极好的回应效果,并且可以自定义波纹的颜色,只需要给colorControlHighlight 属性设置色值。


1

<item name="android:colorControlHighlight">#0000AA</item>

Ripples

一样简单,很多UI组件像复选框都可以使用styles文件夹中的colorAccent 属性来设置符合你应用主题的颜色,而不必使用不同的图片和状态选择器。


1

<item name="android:colorAccent">#00FF00</item>

圆形显示

安卓中一件常见工作就是改变屏幕上某一元素的可见性。现在开发者又多了一个选择可以让这项工作完成的更加漂亮:圆形显示。使用ViewAnimationUtil.createCircularReveal方法然后通过动画监听在合适的时间改变View的可见性。这有两个相似的方法用来让View可见或者消失。注意显示方法有一个持续时间的设置,以便完成动画的显示,隐藏动画执行的更快一点。getX()和getY()方法返回图片所在X、Y轴的中心点的坐标,getRadius()方法就是返回View的宽度。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

private void hideImageCircular() {

    int x = getX();

    int y = getY();

    int radius = getRadius();

    ValueAnimator anim =

            ViewAnimationUtils.createCircularReveal(mImageView, x, y, radius, 0);

    anim.addListener(new AnimatorListenerAdapter() {

        @Override

        public void onAnimationEnd(Animator animation) {

            super.onAnimationEnd(animation);

            mImageView.setVisibility( View.INVISIBLE );

        }

    });

    anim.start();

}

private void revealImageCircular() {

    int x = getX();

    int y = getY();

    int radius = getRadius();

    ValueAnimator anim =

            ViewAnimationUtils.createCircularReveal(mImageView, x, y, 0, radius);

    anim.setDuration( 1000 );

    anim.addListener( new AnimatorListenerAdapter() {

        @Override

        public void onAnimationStart(Animator animation) {

            super.onAnimationStart(animation);

            mImageView.setVisibility( View.VISIBLE );

        }

    });

    anim.start();

}

Circular Reveal

Activity转场动画

除了前述几种动画,android L还增加了一些activity的过渡动画——爆炸、滑动、淡入淡出,让应用更加平滑。使用这些动画,你必须在进入和退出activity都要求使用这些内容转场特效,并且在setOncontent()方法之前。


1

getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

也支持通过样式设置转换动画,我将详解如何在activity中通过样式设置专场效果。使用getWindow().setExitTransition( Transition ) 和getWindow().setEnterTransition( Transition ) 方法告诉activity当打开和关闭时如何执行。使用迸发动画,从MainActivity和ListFragment 到第二个activity的代码可以这样写:


1

2

3

4

ListFragment:

getActivity().getWindow().setExitTransition( new Explode() );

intent = new Intent( getActivity(), ExplodeAnimationActivity.class );

startActivity( intent );


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

ExplodeAnimationActivity:

@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

    getWindow().setEnterTransition( new Explode() );

    getWindow().setExitTransition( new Explode() );

    setContentView(R.layout.activity_explode_animation);

}

@Override

public void onBackPressed() {

    super.onBackPressed();

    finishAfterTransition();

}

注意onBackPressed()方法——这很重要。因为它让操作系统知道在关闭第二个activity之前要完成动画的执行。使用这些简单的代码,我们就拥有了三种activity专场动画。

Explosion Transition

Slide Transition

Fade Transition

虽然我没有用到这个非常有用的工具,但是应当引起注意的是专场动画监听——Transition.TransitionListener。使用监听可以在进入和退出动画生命周期中的特定点执行一些操作,给你更多让应用如何表现的控制权。为了防止内容泄漏,需要在Ondestory()方法中移除监听。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

getWindow().getEnterTransition().addListener( new Transition.TransitionListener {

    @Override

    public void onTransitionStart(Transition transition) {

    }

    @Override

    public void onTransitionEnd(Transition transition) {

    }

    @Override

    public void onTransitionCancel(Transition transition) {

    }

    @Override

    public void onTransitionPause(Transition transition) {

    }

    @Override

    public void onTransitionResume(Transition transition) {

    }

});

Activity专场动画之元素共享

除了标准的过渡动画,现在支持在两个activity过渡动画过程中共享元素。第一件要做的就是设置activity,使用内容转场动画并且允许覆盖转场动画。可以通过样式来设置:


1

2

3

<item name="android:windowContentTransitions">true</item>

<item name="android:windowAllowEnterTransitionOverlap">true</item>

<item name="android:windowAllowExitTransitionOverlap">true</item>

元素共享动画也可以在代码中设置,此例中,我将使用样式来完成:


1

2

<item name="android:windowSharedElementEnterTransition">@transition/changebounds</item>

<item name="android:windowSharedElementExitTransition">@transition/changebounds</item>

Changebounds转场动画被定义以xml文件的形式存放在资源文件中。注意,我增加了两位两个属性:时长和插值器,让动画更有趣。


1

2

3

4

5

changebounds.xml:

<changeBounds

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:duration="1000"

    android:interpolator="@android:interpolator/bounce" />

下一步就是,确定在两个activity的布局文件中都使用实现Comparable接口的View类型(此例中使用ImageView),并且他们的viewName 属性值必须相同。在第一个activity中具有共享元素的View是这样的:


1

2

3

4

5

<ImageView

    android:id="@+id/image"

    android:viewName="image"

    android:layout_width="match_parent"

    android:layout_height="250dp" />

第二个activity中的是这样的:


1

2

3

4

5

6

<ImageView

    android:id="@+id/image"

    android:layout_alignParentBottom="true"

    android:viewName="image"

    android:layout_width="match_parent"

    android:layout_height="250dp" />

既然所有的xml设置都准备好了,我们可以开始在执行动画的activity中写代码了。在第一个activity中我们设置父类容器视图setTransitionGroup为false,然后获取我们想要共享元素的ImageView的drawable,把它转变为字节流对象放到intent的bundle中。然后,为ImageView使用场景动画转换创建ActivityOptions 对象,开启下一个activity。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

Intent intent = new Intent( this, SharedElementSecondAnimationActivity.class );

((ViewGroup) mImageView.getParent()).setTransitionGroup( false );

ByteArrayOutputStream stream = new ByteArrayOutputStream();

( (BitmapDrawable) mImageView.getDrawable() ).getBitmap().compress(Bitmap.CompressFormat.PNG, 100, stream);

intent.putExtra( "image", stream.toByteArray() );

ActivityOptions options;

try {

    options = ActivityOptions.makeSceneTransitionAnimation( this, mImageView, "image" );

} catch( NullPointerException e ) {

    Log.e( "SharedElementAnimationChangeBoundsActivity", "Did you set your ViewNames in the layout file?" );

    return;

}

if( options == null ) {

    Log.e("sharedelementanimation", "Options is null. Something broke. Good luck!");

} else {

    startActivity(intent, options.toBundle());

}

在第二个activity中,从Intent的bundle中读取字节流并解码为bitmap对象,然后把它设置到Imageview上。第二个activity也重写了onBackPressed()方法,为了当返回键按下的时候执行退出动画。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_shared_element_second_animation);

    mImageView = (ImageView) findViewById( R.id.image );

    byte[] byteArray = getIntent().getByteArrayExtra("image");

    Bitmap bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);

    mImageView.setImageBitmap(bitmap);

}

@Override

public void onBackPressed() {

    super.onBackPressed();

    finishAfterTransition();

}

基于以上这些我们完成了共享元素转换动画,在第二个activity中共享元素被移动到新的位置,并且有一个回弹效果。

这几个动画的例子仅是android L的冰山一角,而且没有涉及Kit Kat中引入的场景动画。我希望这篇教程帮助其他开发者学习到新的东西,使用动画让应用不但好看而且有趣。

时间: 2024-11-10 04:11:53

Android L动画入门的相关文章

ANDROID L——Material Design详解(动画篇)

转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lollipop(5.0). 前几天发现Android5.0正式版的sdk已经可以下载了,而且首次搭载Android L系统的Nexus 6和 Nexus 9也即将上市. 所以是时候开始学习Android L了! 关于Android L如何配置模拟器和创建项目,如果大家有兴趣的话可以看看我之前的一篇文章: A

Android L New API之Verctor动画 1 —— SVG Path

导入 1.VectorDrawable是Android L中新增的一个API,让你可以创建基于XML的矢量图,并结合AnimatedVectorDrawable来实现动画效果. 2.Android L新增支持Vector标签,可以使用Path创建动画,同时支持SVG格式. SVG 简介 1.SVG 指可伸缩矢量图形 (Scalable Vector Graphics)2.SVG 用来定义用于网络的基于矢量的图形3.SVG 使用 XML 格式定义图形4.SVG 图像在放大或改变尺寸的情况下其图形质

android 动画入门(一)

准备花一些时间研究下androd动画,因为一些酷的效果是离不开动画的,但是所有的知识都是要从最基本的讲起,只有把基础打好,学一些高级的技术或者效果才会有思路,而不会在某一基础点卡住,今天就讲下动画的入门知识, 我们知道android动画有好几种,什么属性动画,过渡动画等,这篇讲下动画最基础,在属性动画出现之前就是view 动画了, 它有二种 第一类是Tween动画,就是对view进行(旋转.平移.放缩和渐变)等动画. 第二类就是 Frame动画,就好像看电影一样,只是帧每表播放的很快,这样就感觉

[转]ANDROID L——Material Design详解(动画篇)

转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 转自:http://blog.csdn.net/a396901990/article/details/40187203 Android L: Google已经确认Android L就是Android Lollipop(5.0). 前几天发现Android5.0正式版的sdk已经可以下载了,而且首次搭载Android L系统的Nexus 6和 Nexus 9也即将上市. 所以是时候开始学习

android L 的开机动画流程

其实与android开机动画启动流程基本一模一样.除了文件换了位置,就是添加了一些函数. 内核起来后会启动第一个进程,即init进程. init进程会根据init.rc配置启动surfaceflinger进程. service surfaceflinger /system/bin/surfaceflinger class main user system group graphics drmrpc onrestart restart zygote surfaceflinger进程便启动了,跟着就

Android Wear 开发入门

大家好,我是陆嘉杰,我是一名Android开发者.我想和大家进行一些技术交流,希望越来越多的人能和我成为好朋友. 大家都知道,智能手表是下一个开发的风口,而这方面的技术又属于前沿,所以和大家分享下Android Wear的开发流程. 首先,我推荐大家使用Android Studio来进行Wear的开发,这也是谷歌推荐的,本次讲授过程也将以Android Studio作为开发集成环境进行. 下面我们来创建Android Wear项目. 请注意,Android Wear项目中同时包含mobile和w

Android L Preview for mako本人编译版的启动log

本人没此手机, log由cofface获取, 目前是卡到开机动画: https://gist.github.com/syhost/d9f2481b28d5aa8b01a0 编译时使用的vendor是Android4.4.4的, 看log貌似ks大面积报错, 也可能是内核跟vendor不搭配 Android L Preview for mako本人编译版的启动log,布布扣,bubuko.com

ANDROID L——Material Design详解(主题和布局)

Android L: Android L可能就是Android Lollipop或者Lemon Pie(4.5或者5.0),因为Google一直以来都是用甜点为版本命名. Google之前就已经提前推出了Android L Developer Preview(开发者预览版)来帮助开发者更快的了解Android特性,而不久前也推出了64位的模拟器镜像.相信Android L正式版也不远了,所以是时候开始学习Android L了. 关于Android L如何配置模拟器和创建项目,如果大家有兴趣的话可

《Android开发从入门到精通》扶松柏.扫描版.pdf

下载地址:网盘下载 内容简介 编辑 <Android开发从入门到精通>系统讲解了Android软件开发的基础知识,图文并茂地帮助读者学习和掌握SDK.开发流程以及常用的API等.书中以讲述实战实例为导向,用一个个典型应用生动地引领读者进行项目开发实践.<Android开发从入门到精通>是一本内容翔实,理论实践紧密结合的教程. [1] 目录 编辑 第1章 走进Android世界 1.1 智能手机飞速发展 1.1.1 主流手机系统介绍 1.1.2 Android横空出世 1.2 And