關於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不在頂部

以上都是我自己的拙見,如果有問題的地方,請各位留言,我去改正,不要因爲我的筆誤或者是錯誤的思想誤導了即將成神的你們。最後,希望可以幫助到和我遇到同樣問題的同學們,祝大家天天開心,都成大神!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章