【Android 开发技巧】Ken Burns特效的幻灯片

Ken Burns特效,是视频产品中使用的一种平移和缩放的静态图片的特效。

先看维基百科针对Ken Burns特效的介绍。

http://en.wikipedia.org/wiki/Ken_Burns_effect

要实现这个效果,需要使用NineOldAndroids库,这个库可以在旧版本上使用Android 3.0的动画库。

准备工作

这些动画在ImageView上面执行。动画执行的基本思路,当一个动画执行结束,另一个新的动画在另一个新的ImageView上面执行,循此往复。

主布局使用FrameLayout,其中放置一个ImageView。代码如下:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContainer = new FrameLayout(this);
        mContainer.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                LayoutParams.FILL_PARENT));

        mView = createNewView();
        mContainer.addView(mView);

        setContentView(mContainer);
    }

    private ImageView createNewView() {
        ImageView ret = new ImageView(this);
        ret.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                LayoutParams.FILL_PARENT));
        ret.setScaleType(ScaleType.FIT_XY);
        ret.setImageResource(PHOTOS[mIndex]);
        mIndex = (mIndex + 1 < PHOTOS.length) ? mIndex + 1 : 0;

        return ret;
    }

存放图片资源的数组,代码如下:

    private static final int[] PHOTOS = new int[] { R.drawable.photo1,
            R.drawable.photo2, R.drawable.photo3, R.drawable.photo4,
            R.drawable.photo5, R.drawable.photo6 };

通过createNewView,创建一个用于显示下一张图片的ImageView对象。

编写动画

编写nextAnimation方法,这个方法用于设置动画并启动动画。代码如下:

private void nextAnimation() {
        AnimatorSet anim = new AnimatorSet();
        final int index = mRandom.nextInt(ANIM_COUNT);

        switch (index) {
        case 0:
            anim.playTogether(
                    ObjectAnimator.ofFloat(mView, "scaleX", 1.5f, 1f),
                    ObjectAnimator.ofFloat(mView, "scaleY", 1.5f, 1f));
            break;

        case 1:
            anim.playTogether(ObjectAnimator.ofFloat(mView, "scaleX", 1, 1.5f),
                    ObjectAnimator.ofFloat(mView, "scaleY", 1, 1.5f));
            break;

        case 2:
            AnimatorProxy.wrap(mView).setScaleX(1.5f);
            AnimatorProxy.wrap(mView).setScaleY(1.5f);
            anim.playTogether(ObjectAnimator.ofFloat(mView, "translationY",
                    80f, 0f));
            break;

        case 3:
        default:
            AnimatorProxy.wrap(mView).setScaleX(1.5f);
            AnimatorProxy.wrap(mView).setScaleY(1.5f);
            anim.playTogether(ObjectAnimator.ofFloat(mView, "translationX", 0f,
                    40f));
            break;
        }

        anim.setDuration(3000);
        anim.addListener(this);
        anim.start();
    }

动画事件监听

AnimatorProxy类,是NineOldAndroids库中的一个工具类,用于修改View对象的属性。视图的属性随时间的推移而改变。之所以使用AnimatorProxy类,是因为在Android 3.0以下版本,有些属性没有setters或getters方法。

同时,需要设置动画的监听器,一个动画执行完毕,另一个新的动画在另一个新的ImageView上执行。

@Override
    public void onAnimationEnd(Animator animator) {
        mContainer.removeView(mView);
        mView = createNewView();
        mContainer.addView(mView);
        nextAnimation();
    }

在Activity的onResume回调中,调用nextAnimation方法。这样,在进入Activity后,Ken Burns幻灯片就开始执行了。

后记

Android所支持的动画类型如下:

  • Property Animation 属性动画(Android 3.0新增)
  • Tween Animation 补间动画
  • Frame Animation 帧动画

NineOldAndroids库,就是Android 3.0提供的Property Animation框架,翻译成中文叫 属性动画。这个动画框架对比于低版本的动画框架是做了非常多的改进的,可见Google真是用心良苦。

旧版本动画的缺点如下:

  • 只支持View对象的动画效果。属性动画,不仅仅支持试图对象,而是支持一切“对象”。
  • 只支持移动,缩放,旋转,渐变等效果。
  • 只是改变View对象的视觉效果,而不是改变View对象的真实属性。

Property Animation的应用十分广泛,它是非常值得深入学习和研究的。尽管互联网上已经有很多人对Property Animation进行了总结和归纳,但是,凡事还是要自己去研究,才能做到理解深刻。

参考资料

www.nasatrainedmonkeys.com/portfolio/feedtv/

https://github.com/JakeWharton/NineOldAndroids

http://en.wikipedia.org/wiki/Ken_Burns_effect

http://android-developers.blogspot.com.ar/2011/02/animation-in-honeycomb.html

http://android-developers.blogspot.com.ar/2011/05/ introducing-viewpropertyanimator.html http://android-developers.blogspot.com.ar/2011/05/ introducing-viewpropertyanimator.html

源码下载

百度网盘 http://pan.baidu.com/s/1qWwO0bU

时间: 2024-09-27 15:34:13

【Android 开发技巧】Ken Burns特效的幻灯片的相关文章

Android 开发技巧总结(三)

1.在界面中按返回键判断某个控件的可见性,如果可见,则用动画让其消失,应用并不退出. Onkeydown方法中: if(keyCode == 4){ if(slidingMenu.getVisibility() == View.VISIBLE){ //退出的动画 AnimationSet animationSet = new AnimationSet(true); TranslateAnimation animation = new TranslateAnimation(0,-280, 0, 0

50个Android开发技巧(10 为TextView加入样式)

首先来看一个控件的例子: (原文地址:http://blog.csdn.net/vector_yi/article/details/24428085) 手机上类似这种场景你一定已经见过非常多次了,但有没有考虑过它是如何实现的? 或许你会觉得这是一个略微复杂的自己定义的View,但,没错,这实际上仅仅是一个原生的TextView而已. TextView是一个简单而奇妙的Widget,你能够利用它以不同风格不同格式来展现文字. 举两个简单的样例: 1.在TextView中加入一个超链接 事实上非常e

Android开发技巧——自定义控件之自定义属性

Android开发技巧--自定义控件之自定义属性 掌握自定义控件是很重要的,因为通过自定义控件,能够:解决UI问题,优化布局性能,简化布局代码. 上一篇讲了如何通过xml把几个控件组织起来,并继承某个ViewGroup子类,把它们封装起来使用.这是我们接触到的最简单的一种自定制控件了.但许多时候,我们还需要在布局文件中使用它们的时候,能通过属性传入一些值,来影响最终的显示结果. 我们在做项目中经常会遇到的一个情况:一张图片加一个文本的组合.比如充值账户成功之后显示的一个界面,上面是一个表示成功的

50个Android开发技巧(24 处理ListView数据为空的情况)

在移动平台上为用户展示数据的一个经常用法是将数据填充进一个List内,而此时须要注意的一点就是: 原文地址:(http://blog.csdn.net/vector_yi/article/details/24936163) 怎样处理须要填充的数据为空的情况? ListView及其它继承自AdapterView的类都有一个简便的处理这样的情况的方法:setEmptyView(View). 当ListView的Adapter为空或者Adapter的isEmpty()方法返回true的时候,它将会把设

Android开发技巧——大图裁剪

本篇内容是接上篇<Android开发技巧--定制仿微信图片裁剪控件> 的,先简单介绍对上篇所封装的裁剪控件的使用,再详细说明如何使用它进行大图裁剪,包括对旋转图片的裁剪. 裁剪控件的简单使用 XML代码 使用如普通控件一样,首先在布局文件里包含该控件: <com.githang.clipimage.ClipImageView xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+i

Android开发技巧之viewstub用法详解及实现延迟加载

这一篇是接着上面的include标签的例子来讲的,地址http://blog.csdn.net/jason0539/article/details/26131831 上一篇的布局中间就用了viewstub这个控件,现在来说一下其作用和用法 " ViewStub 是一个不可见的,大小为0的View,最佳用途就是实现View的延迟加载,避免资源浪费,在需要的时候才加载View " 需要注意的是,加载view之后,viewstub本身就会被新加载进来的view替换掉 上代码了,看完就理解了

Android 开发技巧总结(二)

1.首选项的存取数据 写一个类,里面放入存取方法,然后在外面进行调用 public class PrefsUtils { private static final String PREFS_NAME="com.yomoto.util.OtherPrefs"; //这里放入的名字存入的地址是:data/data/项目包名/shared_prefs/PREFS_NAME //得到首选项中的数据 public static String getValue(Context context,St

Android开发技巧——实现可复用的ActionSheet菜单

在上一篇<Android开发技巧--使用Dialog实现仿QQ的ActionSheet菜单>中,讲了这种菜单的实现过程,接下来将把它改成一个可复用的控件库. 本文原创,转载请注明出处: http://blog.csdn.net/maosidiaoxian/article/details/46324941 对于要实现的可复用的控件库,我需要它具备以下两点: 可添加远程依赖(不考虑Eclipse中的使用) 可灵活配置 分离库的实现代码 对于第一点,需要做的就是在Android Studio中新建一

Android 开发技巧总结

1.项目中设置每个activity的启动模式(如果堆栈中存在此activity就会重用,并提到栈顶,不会创建新的activity)  android:launchMode="singleTask" 2.如果界面中的布局被弹出的软键盘改变,则在对应的activity中加入如下代码即可. android:windowSoftInputMode="adjustPan|stateHidden" 3.去掉ScrollView拉倒边缘时的效果: scrollView.setOv