1. 程式人生 > >兩個activity之間透明過渡效果和經驗

兩個activity之間透明過渡效果和經驗

來看下效果圖:
這裡寫圖片描述

大致效果解釋:
1. 當用戶點選登入時logo下滑一定距離
2. 下滑後旋轉90時 變化圖示
3. 繼續旋轉90度
4. 然後移動到左上角 透明度漸變到上個activity 最後銷燬當前activity

術語

登入介面我們 稱為 A (本質是activity) 如下圖
這裡寫圖片描述

返回介面我們 稱為 B (本質是activity) 如下圖
這裡寫圖片描述

大致思路

讓A介面的A的logo移動到左上角時候 我們讓A介面透明到B
然後在finish() A 即可

注意: 結束A的時候(呼叫A的finish時候,會有一個閃屏 或者左移動的切換動畫 切換到B 此時很突兀)

解決:在finish()後面自己寫一個過渡動畫(隨便寫就行 甚至可以不寫任何效果,只是為了覆蓋原來的預設過渡效果)

//結束A
finish();
//設定動畫,第一個是進入動畫第二個是出動畫                      
overridePendingTransition(R.anim.scale_in, R.anim.scale_out);

具體程式碼步驟

  1. 定義一個樣式 在values/style下建立一個主題樣式:

    
        <style name="activityTheme" parent="@android:style/Theme">         
    <item
    name="android:windowIsTranslucent">true</item> <item name="android:windowBackground">@color/transparent</item> <item name="android:windowContentOverlay">@null</item>
    </style>

    程式碼解釋

    <item name="windowBackground"> 窗體的背景 </item>
     <item name="android:windowContentOverlay"
    >@null</item> 自定義Titlebar時去掉多餘的陰影。 <item name="android:windowIsTranslucent">false</item> 窗體是否半透明
  2. 讓其A 繼承此主題(在清單檔案內繼承)

      <activity
                android:name="A"
                android:theme="@style/activityTheme"
     />
  3. 讓其A的根佈局開啟透明動畫
    假設A的佈局如下

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/ll_root"
        android:background="@color/all_bg"
        android:orientation="vertical" />
      AlphaAnimation alphaAnimation = new
                     AlphaAnimation(1.0f,0.0f);
                      alphaAnimation.setDuration(2*1000);
                     alphaAnimation.setFillAfter(true);
        //透明度 變化 alphaAnimation.setAnimationListener(new
                     alphaAnimation.setAnimationListener(new AnimationListener() {
    
                        @Override
                        public void onAnimationStart(Animation animation) {
                            // TODO Auto-generated method stub
    
                        }
    
                        @Override
                        public void onAnimationRepeat(Animation animation) {
                            // TODO Auto-generated method stub
    
                        }
    
                        @Override
                        public void onAnimationEnd(Animation animation) {
    
                            finish();
    overridePendingTransition(R.anim.scale_in, R.anim.scale_out);
                        }
                    });
      ll_root.startAnimation(alphaAnimation);  

這裡隨便給大家看一個進入的動畫原始碼吧

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
   <scale  
          android:fromYScale="0.0"
          android:toYScale="1.0"
          android:pivotY="50%"
          android:fillAfter="false"
          android:duration="200" />
</set>

補充

以下屬性以Dialog為例來講解:

<item name="windowBackground"> 窗體的背景 </item>
<item name="windowFrame">Dialog 是否有邊框 </item>
<item name="windowNoTitle">窗體是否有標題</item>
<item name="windowFullscreen">false</item>        是否為全屏
<item name="windowOverscan">false</item>          是否要求窗體鋪滿整螢幕               
<item name="windowIsFloating">false</item>        窗體是否浮在下層之上
<item name="windowContentOverlay">@null</item>    設定窗體內容背景
<item name="windowShowWallpaper">false</item>     是否顯示桌布
<item name="windowTitleStyle">@android :style/WindowTitle</item>        窗體的標題欄Style
<item name="windowTitleSize">25dip</item>                              窗體文字大小

 窗體標題欄背景
<item name="windowTitleBackgroundStyle">@android :style/WindowTitleBackground</item>            窗體切換時的動畫樣式
<item name="android:windowAnimationStyle">@android :style/Animation.Activity</item>

 在使用輸入法時窗體的適配
<item name="android:windowSoftInputMode">stateUnspecified|adjustUnspecified</item>
<item name="windowActionBar">false</item>                    是否開啟ActionBar
<item name="windowActionModeOverlay">false</item>            這個暫時不知道,希望大神能回答一下。
<item name="windowCloseOnTouchOutside">false</item>          是否再點選外部可關閉

<item name="android:windowIsTranslucent">false</item>    窗體是否半透明
<item name="android:backgroundDimEnabled">false</item>: 背景是否模糊顯示

   6. <item name="android:windowContentOverlay">@null</item>  自定義Titlebar時去掉多餘的陰影。