关于activity转场动画makeSceneTransitionAnimation没效果的问题的解决办法

前言

这几天项目的需求里有个在activity跳转的时候,要求头像平移到下一个activity,我一下就想到了使用activity的转场动画了,下面我们就简单的介绍下activity的转场动画以及遇到的问题&对应的解决办法。

转场动画简介

相信大家对于Activity的过度动画都很熟悉了,一般情况下我们直接使用

overridePendingTransition(enterAnim, exitAnim);

但是这种老旧、生硬的方式怎么能适合我们的MD风格的App呢!好在google在新的sdk中给我们提供了另外一种Activity的过度动画——ActivityOptions。并且提供了兼容包——ActivityOptionsCompat。ActivityOptionsCompat是一个静态类,提供了为数不多的几个方法,下面我们来罗列一下:

1.平移,跟我们的overridePendingTransition效果是一样的,从第二个和第三个参数就可以看出
ActivityOptionsCompat.makeCustomAnimation(Context context, int enterResId, int exitResId)

2.将一个控件平滑的放大过渡到第二个activity,一般用于相册的具体照片的查看
ActivityOptionsCompat.makeScaleUpAnimation(View source,int startX, int startY, int startWidth, int startHeight)

3.
ActivityOptionsCompat.makeThumbnailScaleUpAnimation(View source,Bitmap thumbnail, int startX, int startY)

4.平滑的将一个控件平移的过渡到第二个activity
ActivityOptionsCompat.makeSceneTransitionAnimation(Activity activity, View sharedElement, String sharedElementName)

5. 平滑的将多个控件平移的过渡到第二个activity
ActivityOptionsCompat.makeSceneTransitionAnimation(Activity activity,Pair<View, String>… sharedElements)

恩,就这5个方法可以调用,也就是说为我们提供了这么5中过度方式,在使用的时候我们需要在theme指定:

<style name="AppTheme" parent="Theme.AppCompat">
    <item name="android:windowContentTransitions">true</item>
</style>

ps:我们项目中要实现的功能就和第四个的效果是一样的

遇到的问题

运行没效果

知道使用第四个方法,我们就按照这个方法把代码添加到项目中,要过渡的两个控件也都添加了translationName属性,很高兴的以为问题就这样简单的解决了,但是理想是丰满的,现实是骨感的,真机测试没有出现我要的效果。

点击返回键出现效果,但是刚开始跳转的时候没有效果

在网上搜了很多帖子,最后看到stackoverflow有个帖子中有句话引起了我的注意,大概意思是你的手机系统版本得是5.0以上的,看到这个,我就换了公司的三星s6测试机,很忐忑的运行了程序,没有效果,但是点击返回键时出现了我想要的效果了。

实现最终的效果

于是我就自己新建了个demo测试一下这个转场动画,结果出乎意料的实现了效果,我就用这个demo和我的项目比对,发现代码没有差别,唯一的差别就是demo中的两个控件都是在activity的布局中的,但是我的项目中的第二个控件是listview的一个headerView中的,不在activity的布局文件中,我想是不是这个原因,结果经过的一番修改,终于是出现了我想要的结果了。

遇到的其他的问题

因为第二个控件是listView的header,所以要把header中的view都得放在list view上面,不能用addHeaderView的方式了,这就用到了Scrollview,自然的也就得解决Listview和ScrollView的冲突问题,还有就是进入第二个activity之后,scrollview不在最上面,而是现实list view的部分。下面给出解决办法:
1.继承listview,重写他的onMeasure()

@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,  
                MeasureSpec.AT_MOST);  
        super.onMeasure(widthMeasureSpec, expandSpec);  
    }

2.因为listview抢占了scrollview的焦点,所以进入页面才显示listview
在activity的代码中添加

mListView.setFocusable(false);

即可;
ps:在listview的布局文件中添加

android:focusable="false"

是没有效果的。
还有个方法就是设置scrollview滚动到顶部

mScrollView.smoothScrollTo(0,0);

总结

本篇博客的中心思想就是:
1.makeSceneTransitionAnimation必须运行在android5.0以上的系统才可以

2.要实现过度的两个控件必须都得在activity的布局文件中,使用include也行,但是不能用listview.addHeaderView 的形式使用

3.scrollview和listview的滑动冲突解决

4.焦点问题导致scrollview不在顶部

以上都是我自己的拙见,如果有问题的地方,请各位留言,我去改正,不要因为我的笔误或者是错误的思想误导了即将成神的你们。最后,希望可以帮助到和我遇到同样问题的同学们,祝大家天天开心,都成大神!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值