Activity 切换动画(小米图库列表进入详情页,图片从固定位置放大进入,缩小退出)

直接上效果图

ok,来分析下如何实现的吧

分析原理

首先确定,这是两个不同的 Activity,从图片列表页跳入到图片详情页;先来看进入详情页时的动画,从列表中所在 item 的位置一直放大到详情页的显示位置,这里我可以先告诉大家,当我们点击了这个 item 的时候,就已经启动了详情页,然后在详情页做相应的动画效果。既然是在详情页做动画效果,就需要在列表页把相应的值传过去,列表页 item 在屏幕上的位置,item 的大小,当然还有图片的资源,然后在详情页计算动画执行的参数。分析了进入动画,那么退出 Activity 的动画就好实现了,跟进入动画相反,但是也是要确定什么时候执行退出动画,这里退出动画也是放在详情页面实现的,当按下返回按钮时,开始执行退出动画,在动画执行完之后,把详情页的 Activity 结束掉;大家会问了,可以把动画放在列表页执行吗?大家仔细想一下就知道,如果是进入动画,肯定是不能的,因为详情页没有启动,有些参数无法知道,比如放大到多大,放大以后的位置是哪里等,但是退出动画是可以的,但比较麻烦,需要把详情页的参数返回给列表页,如果有兴趣可以试着做一下。

效果实现

1、传入详情页的参数获取

            @Override
            public void onItemClick(View view) {
                int location[] = new int[2] ;
                view.getLocationOnScreen(location);
                int resId = (int) view.getTag();
                Bundle bundle = new Bundle() ;
                bundle.putInt("locationX",location[0]);
                bundle.putInt("locationY",location[1]);
                bundle.putInt("width",view.getWidth());
                bundle.putInt("height",view.getHeight());
                bundle.putInt("resId",resId);
                Intent intent = new Intent() ;
                intent.putExtras(bundle);
                intent.setClass(getActivity(),PicDetailActivity.class) ;
                getActivity().startActivity(intent);
                getActivity().overridePendingTransition(0, 0);
                Log.v("zgy","========view========"+view.getWidth()) ;
            }

item 在屏幕中的坐标,可以通过

int location[] = new int[2] ;
view.getLocationOnScreen(location);

来获取,记得把 Activity 的切换动画去掉

getActivity().overridePendingTransition(0, 0);

2、进入动画参数的 获取

获取列表页传入的值

        final int left = getIntent().getIntExtra("locationX", 0);
        final int top = getIntent().getIntExtra("locationY", 0);
        final int width = getIntent().getIntExtra("width", 0);
        final int height = getIntent().getIntExtra("height", 0);
        int resId = getIntent().getIntExtra("resId", 0);

计算动画执行的参数

        mImageView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                mImageView.getViewTreeObserver().removeOnPreDrawListener(this);
                int location[] = new int[2];
                mImageView.getLocationOnScreen(location);
                mLeft = left - location[0];
                mTop = top - location[1];
                mScaleX = width*1.0f / mImageView.getWidth();
                mScaleY = height*1.0f / mImageView.getHeight();
                Log.v("zgy", "========resId========" + mImageView.getWidth()) ;
                Log.v("zgy", "========resId========" + mScaleY) ;
                activityEnterAnim();
                return true;
            }
        });

因为是在 OnCreate方法中执行的,不能直接获取的 View 的大小,因为这时 View 尚未测量完成,需要功过监听 View 的绘制来获取,这里计算当前 显示的 View 距离列表 View 的距离及放缩比例;

3、设置动画开始执行的位置

        mImageView.setPivotX(0);
        mImageView.setPivotY(0);
        mImageView.setScaleX(mScaleX);
        mImageView.setScaleY(mScaleY);
        mImageView.setTranslationX(mLeft);
        mImageView.setTranslationY(mTop);

4、开始执行进入动画

这个时候已经启动了 详情页面,所以执行动画以后不需要做任何操作了

        mImageView.animate().scaleX(1).scaleY(1).translationX(0).translationY(0).
                setDuration(1000).setInterpolator(new DecelerateInterpolator()).start();
        ObjectAnimator objectAnimator = ObjectAnimator.ofInt(mBackground,"alpha",0,255);
        objectAnimator.setInterpolator(new DecelerateInterpolator());
        objectAnimator.setDuration(1000);
        objectAnimator.start();

来看看这时候的效果图

5、退出动画

        mImageView.setPivotX(0);
        mImageView.setPivotY(0);
        mImageView.animate().scaleX(mScaleX).scaleY(mScaleY).translationX(mLeft).translationY(mTop).
                withEndAction(runnable).
                setDuration(1000).setInterpolator(new DecelerateInterpolator()).start();
        ObjectAnimator objectAnimator = ObjectAnimator.ofInt(mBackground,"alpha",255,0);
        objectAnimator.setInterpolator(new DecelerateInterpolator());
        objectAnimator.setDuration(1000);
        objectAnimator.start();

这里在动画结束的时候传入了一个 Runnable 对象,这个 Runnable 的作用就是结束详情页面


        activityExitAnim(new Runnable() {
            @Override
            public void run() {
                finish();
                overridePendingTransition(0, 0);
            }
        });

当你正在动手做的时候你可能会发现这样一个现象,来看看

为什么会这样?我前面写了一遍 blog 手势滑动结束 Activity(一)基本功能的实现,看完你就明白了。

总结

这篇 blog 的内容也不多,实现起来页不难,只是看大家能不能想到。当然还是涉及到部分知识点:

1、属性动画的运用,

2、View 在屏幕上位置的获取,可以通过

int location[] = new int[2] ;

View.getLocationOnScreen(location);

3、在 onCreate 中测量 View 的大小,不能直接获取,需要监听 View 的绘制,或者其他测量完成之后的回掉接口。

点击 下载源码

时间: 2024-11-09 01:51:53

Activity 切换动画(小米图库列表进入详情页,图片从固定位置放大进入,缩小退出)的相关文章

activity切换动画和页面切换动画

Activity切换动画 要实现Activity切换动画需要靠overridePendingTransition来实现,里面有两个参数分别是进入Activity时的动画和离开Activity时的动画. 需要注意的是必须在StartActivity()或finish()之后立即调用 比如在MainActivity中有一个Button,点击Button后跳转到OtherActivity中代码如下: Intent intent = new Intent(this, OtherActivity.clas

android Activity切换动画效果

为Activity设置左右进出的效果,可以通过在Mainfest.xml文件中设置主题的方式来实现.还可以使用java代码. 一.设置样式 先看看实现动画的样式: <style name="AnimationRToL" mce_bogus="1" parent="@<span style="color:#ff0000;">android:style/Animation.Activity</span>&quo

Android Activity切换动画overridePendingTransition

Activity在切换或者是退出的时候能够使用渐入,滑动,缩放等动态效果.使用的就是方法overridePendingTransition,能够直在Activity其中直接调用. overridePendingTransition(R.anim.zoomin, R.anim.zoomout) 第一个參数是事实上动画,第二个參数是结束动画.此方法在startActivity()或者是finish()后调用,在切换或是退出时就会调用此动画. Intent phoneIntent=new Intent

Android 编程下设置 Activity 切换动画

为 Activity 设置切换动画 我们知道,我们可以在 AndroidManifest.xml 文件中,通过 android:theme 属性设置 Activity 的主题.主题中定义了关于 Activity 外观的很多特性.同时,主题中还可以定义 Activity 的切换动画.这是应用 Activity 切换动画的一种方法.下面讲解一下如何通过主题来设置 Activity 间的切换动画. 定义包含动画的 Activity 主题 res/values/styles.xml,很简单,就是使用 w

(六十三)Activity切换动画,包括渐变、flip、某个位置进入等等

一.当项目中需要为Activity添加动画时,可以参考这个github的源码 Activity切换动画,包括渐变.flip.某个位置进入等等项目地址:https://github.com/ophilbert/ActivityTransition效果图:类似桌面左右切换的各种效果,不过桌面并非用ViewPager实现而已文档介绍:https://github.com/jfeinstein10/JazzyViewPager/blob/master/JazzyViewPager.apk?raw=tru

Activity切换动画---点击哪里从哪放大

emmmm,这次来梳理一下 Activity 切换动画的研究.首先,老规矩,看一下效果图: 效果图 这次要实现的动画效果就是类似于上图那样,点击某个 view,就从那个 view 展开下个 Activity,Activity 退出时原路返回,即缩放到点击的那个 view. 实现思路 emmm,如果要你来做这样一个效果,你会怎么做呢? 我们就一步步的来思考. 首先来说说,要给 Activity 的切换写动画的话,可以通过什么来实现?也许这种场景比较少,但相信大家多多少少知道一些,嗯,如果你还是不大

Android的Activity切换动画特效库SwitchLayout,视图切换动画库,媲美IOS

由于看了IOS上面很多开发者开发的APP的视图界面切换动画体验非常好,这些都是IOS自带的,但是Android的Activity等视图切换动画并没有提供原生的,所以特此写了一个可以媲美IOS视图切换动画的Android视图切换动画特效库!SwitchLayout!可以说是目前Android上第一个,也是唯一的一个强大的视图切换动画库引擎! 作者:谭东 QQ:852041173 项目开源!推荐使用jar包形式! 没有经过作者允许,不可修改项目库源码自行发布. 如果你的项目中使用了SwtichLay

Activity 切换 动画

overridePendingTransition的简介 1 Activity的切换动画指的是从一个activity跳转到另外一个activity时的动画. 它包括两个部分:一部分是第一个activity退出时的动画:另外一部分时第二个activity进入时的动画:在Android的2.0版本之后,有了一个函数来帮我们实现这个动画.这个函数就是overridePendingTransition 这个函数有两个参数,一个参数是第一个activity进入时的动画,另外一个参数则是第二个activit

Android开发中activity切换动画的实现

(1)我们在MainAcitvity中定义两个textview,用于点击触发切换Activity事件,下面是布局文件代码. <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/top_bg" android:orientation="horizonta