2017-07-03 72 views
1

我試圖在我的啓動畫面活動完成時和/或當我的主要活動開始時添加淡入淡出效果(理想情況下,主要活動會在啓動畫面結束後淡入,但我正在嘗試任何操作)。我嘗試過很多涉及動畫和過渡的東西,但是迄今爲止它們都沒有奏效。正如你所看到的,我對動畫並不熟悉,而且我知道我的問題可能來自我對它的缺乏瞭解。我一直在閱讀很多東西,但仍然感到迷失。Android上兩個活動之間的淡入淡出效果

我想知道,如果我的SplashActivity沒有佈局設置爲內容視圖的事實影響我的結果。我只使用啓動畫面活動的主題。下面是它在清單執行:

<activity 
    android:name=".SplashActivity" 
    android:theme="@style/SplashTheme"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 

和主題(最初沒有最後2項):

<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar"> 
    <item name="android:windowBackground">@drawable/launch_logo</item> 
    <item name="android:windowContentTransitions">true</item> 
    <item name="android:windowExitAnimation">@android:anim/fade_out</item> 
</style> 

我也試圖「在主題褪色」添加到我的MainActivity:

<style name="AppTheme.FadeIn" parent="AppTheme" > 
    <item name="android:windowNoTitle">true</item> 
    <item name="android:activityOpenEnterAnimation">@anim/fade_in</item> 
</style> 

關於動畫,我看到人們有時使用:

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 
    <alpha xmlns:android="http://schemas.android.com/apk/res/android" 
     android:interpolator="@android:anim/accelerate_interpolator" 
     android:fromAlpha="0.0" android:toAlpha="1.0" 
     android:duration="1000" /> 
</set> 

,而使用其他時間:

<?xml version="1.0" encoding="utf-8"?> 
<alpha xmlns:android="http://schemas.android.com/apk/res/android" 
    android:interpolator="@android:anim/accelerate_interpolator" 
    android:fromAlpha="0.0" android:toAlpha="1.0" 
    android:duration="1000" /> 

所以,我想這兩個...(可選的問題:什麼是它們之間的區別)

在SplashActivity,我想:

Intent intent = new Intent(this, MainActivity.class); 
startActivity(intent); 
overridePendingTransition(R.anim.fade_in, R.anim.fade_out); 

Intent intent = new Intent(this, MainActivity.class); 
Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getBaseContext(), android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); 
startActivity(intent, bundle); 

也試過這在MainActivity的onCreate功能:

super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_login); 
ViewGroup mRootView = (ViewGroup) findViewById(R.id.main_layout); 
Fade mFade = new Fade(IN); 
// Start recording changes to the view hierarchy 
TransitionManager.beginDelayedTransition(mRootView, mFade); 

ViewGroup mRootView = (ViewGroup) findViewById(R.id.main_layout); 
mRootView.animate().alpha(0.0f); // at this point the view is totally transparent 
mRootView.animate().alpha(1.0f).setDuration(2000); // here the view becomes 100% visible instantly, there is no animation 

這主要活動的佈局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/main_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center" 
    android:orientation="vertical" 
    android:weightSum="16" 
    android:background="@color/background" 
    android:animateLayoutChanges="true" 
    tools:context=".MainActivity"> 
    ... 

我檢查了過渡動畫縮放在我的設置是否正確(我使用的是Android工作室的模擬器爲我的測試)。我的兩項活動之間從來沒有淡化效果。請有人賜教。

出於某種原因,我有某種淡入淡出效果,當我這樣做:

Intent intent = new Intent(this, MainActivity.class); 
Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getBaseContext(), 
       android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); 
startActivity(intent, bundle); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent); 
overridePendingTransition(R.anim.fade_in, R.anim.fade_out); 

我真的不明白。當然它會變黑,然後主要活動的淡入效果正在起作用,但我不明白它爲什麼以這種方式工作。如果我刪除了一行,它就會停止工作(當我忘記評論第二個startActivity命令時,我發現它正在以這種方式工作)。當我說我試圖刪除一條線時,我也改變了這樣的順序:

Intent intent = new Intent(this, MainActivity.class); 
Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getBaseContext(), 
       android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent, bundle); 
overridePendingTransition(R.anim.fade_in, R.anim.fade_out); // with or without this line, this code doesn't work. 
// I must have tried pretty much all combinations without any success... 

我只是張貼在這裏我所使用的所有以前的解決方案(我已經試過各自獨立)失敗後進行。當我想在打開下一個活動時獲得淡入效果時,我附加了一個布爾額外的意圖。然後在開放活動的onCreate方法,我有:

boolean fadeEffect = getIntent().getBooleanExtra("fade_in", false); 
LinearLayout mainLayout = (LinearLayout) findViewById(R.id.login_main_layout); 
if(fadeEffect) { 
    mainLayout.setAlpha(0.f); 
    mainLayout.animate() 
       .alpha(1.f) 
       .setDuration(1000) 
       .start(); 
} 

如果有人需要幫助實現這種解決方案,我可以提供幫助。

+1

嘗試使用默認的淡入淡出的動畫,而不是創建自己的堅持。閱讀:https://developer.android.com/training/transitions/transitions.html –

+0

謝謝,我試圖使用Android默認的動畫太多,但還是沒有結果... – Lilamuse

+0

你與Android默認動畫試過什麼?他們應該使用Fade類正常工作! –

回答

2

這個選項包添加到您的startActivity方法,使兩項活動之間的褪色動畫:

Bundle bundle = ActivityOptionsCompat.makeCustomAnimation(getContext(), 
     android.R.anim.fade_in, android.R.anim.fade_out).toBundle(); 
     startActivity(intent, bundle); 

無需再添加其他代碼來完成你的要求! :)

+0

還不行...:/ – Lilamuse

0

我曾與活動之間的動畫類似的問題。

我知道你說你嘗試過了,不過你有沒有與其他窗口動畫搞砸周圍的

Intent intent = new Intent(this, MainActivity.class); 
startActivity(intent); 
overridePendingTransition(R.anim.fade_in, R.anim.fade_out); 

解決方案應該只要工作。也許通過使用可能的解決方案的一些組合,它不能正常工作?嘗試刪除他人,這種解決方案

+0

我單獨想盡解決方案,這是我的只有窗口動畫。只是爲了確保我再次嘗試,但沒有效果。在我的所有嘗試都沒有成功後我所做的事情,我爲可能需要淡入淡出的活動創建了一個「淡入」額外部分。我將編輯我的問題以添加我用過的代碼,因爲它使我的評論如果我嘗試在此處發佈,則時間太長。 – Lilamuse