當前位置:首頁 » 安卓系統 » androidactivity動畫

androidactivity動畫

發布時間: 2023-09-11 11:20:21

❶ Android轉場動畫一說

所謂轉場動畫,通俗的講就是一個Activity跳轉到另一個Activity是的動畫。

Activity的轉場動畫很早就有了,5.0之前用的是overridePendingTransition()這個方法。在5.0之後,Google使用Material Design設計風格,進而有了的新的轉場轉場動畫的誕生,效果還是挺炫酷的,下面我們先看下效果。



其實這里主要是靠overridePendingTransition(int enterAnim, int exitAnim)來載入動畫,顧名思義第一個參數是進場動畫,第二個是出場動畫。
這幾個效果是可以交互使用,比如進場用Fade效果,出場用SLide效果。也可以使用自定義的效果,這里不細說。當然5.0後了類似共享元素這類的效果那就另當別論了



說到這里不得不說Google在5.0MD設計中給我提供全新的過度動畫ActivityOptions,以及兼容包ActivityOptionsCompat.下面來說一說它提供幾種過度效果的方法











❷ 開發者選項窗口動畫和過渡動畫區別

窗口動畫和過渡動畫是指在窗口(activity或dialog)切換時的顯示動畫,窗口動畫的范圍相對較廣,包括activity和dialog,而過渡動畫只包括activity。

? 第一種方法是調用overridePendingTransition的方法,記得要在startActivity之前調用,還可以用startActivity(Intent, Bundle)設置Bundle來實現,這種可以跨Context,而overridePendingTransition只能在當前app內實現,具體做法是ActivityOptions.makeCustomAnimation(context, enterResId, exitResId).toBundle(),這種方法要求系統是4.1以後的。這兩種方法實現的都是過渡動畫。

? 前面這些方法都只能做activity的動畫,要做dialog的動畫,就必須用窗口動畫。方法是設置style,然後dialog.getWindow().setWindowAnimations(R.style.MyStyle)或者dialog.getWindow().getAttributes().windowAnimations = R.style.MyStyle;這樣就可以在彈出dialog的時候播放動畫了。窗口動畫也可以作用在activity上,style的設置一樣,代碼也差不多,直接在activity內就可以調用getWindow這條方法。style還有另外一種做法:

? 這種設置的是過渡動畫,只對activity有用,對dialog沒用。(除了用getWindow來設置動畫資源外,還可以在你的Theme里添加一個item,item的name是android:windowAnimationStyle,然後指定上面的一種style)。

? 從原理上看,窗口動畫和過渡動畫其實就是系統在切換窗口時讀取相應的動畫資源,上面的所有做法本質上就是在替換那些資源。開發者需要處理的是如何選擇,是窗口動畫還是過渡動畫。如果是dialog,只有窗口動畫可選,也只能通過style來完成。如果是activity,就兩種動畫都可以,但大多情況下還是用過渡動畫,因為通過像overridePendingTransition這些api可以很簡單的實現,而如果想把動畫應用到整個Activity,用style就更方便,至於用上面哪種style,其實沒什麼影響。

? 在實際的開發中,其實並不提倡用上面這些方法,因為手機的設置可以關閉這兩種動畫(在開發者選項那裡),你沒法保證app一定能顯示動畫。對於activity動畫來說,可以在新的activity初始化結束後啟動常規的動畫,但這種方法要求你必須等到窗口的相關view初始化結束,但什麼時候結束是無法預測的,這和手機性能有關,所以你可以設置定時器來播放,而對於dialog就沒有其他解決的方法了。

❸ Android之Activity全面解析,有些知識點容易忘記

Activity作為安卓四大組件之一,是最重要也是用得最多的組件,涉及的知識點非常多,有些知識點平時開發很少用到,但在某些場景下需要特別注意,本文詳細整理了Activity涉及的知識點,供開發參考。

針對Activity可以提出很多問題,如:
Activity 的生命周期?
Activity 之間的通信方式?
Activity 各種情況下的生命周期?
橫豎屏切換時 Activity 的生命周期?
前台切換到後台,然後再回到前台時 Activity 的生命周期?
彈出 Dialog 的時候按 Home 鍵時 Activity 的生命周期?
兩個Activity之間跳轉時的生命周期?
下拉狀態欄時 Activity 的生命周期?
Activity 與 Fragment 之間生命周期比較?
Activity 的四種 LaunchMode(啟動模式)的區別?
Activity 狀態保存與恢復?
Activity的轉場動畫有哪些實現方式?
Activity的生命周期中怎麼獲取控制項寬高?
onNewIntent的執行時機?
如何連續退出多個Activity?

如何把Acitivty設置成Dialog樣式 ,android:theme="@android:style/Theme.Dialog"

關於橫豎屏切換的生命周期,對應不同的手機,由於廠商定製的原因,會有不同的效果,如設置了configChanges="orientation」在有些手機會執行各個生命周期,但有些手機卻不會執行。
網上常見的結論如下:

但實際的測試如下:

可以看出,不同廠商的手機切屏生命周期會有差異。
從API 13以上,當設備在橫豎切屏時,「屏幕尺寸」也會發生變化,因此為了杜絕切屏導致頁面銷毀重建,需要加上screenSize,使用設置4,即 android:configChanges="orientation|keyboardHidden|screenSize" .

Activity的四種狀態如下:

在activity處於paused或者stoped狀態下,如果系統內存緊張,可能會被銷毀,當重回該activity時會重建,正常返回和被回收後返回的生命周期如下:

如果是回收後返回,onCreate的參數savedInstanceState不為空。

有哪些場景會觸發onNewIntent回調呢?跟啟動模式有關,首先該Activity實例已經存在,再次啟動才可能觸發。一種情況是啟動模式是singleTask或者singleInstance,無論該activity在棧中哪個位置,都會觸發onNewIntent回調,並且把上面其他acitivity移除,另一種情況是啟動模式是singleTop或者以FLAG_ACTIVITY_SINGLE_TOP啟動,並且該activity實例在棧頂,會觸發onNewIntent,如果不在棧頂是重新創建的,不會觸發。

在實際業務開發中,往往碰到需要連續退出多個activity實例,下面整理了幾種常見方法:

● 發送特定廣播
1、在需要處理連續退出的activity注冊該特定廣播;
2、發起退出的activity發送該特定廣播;
3、接收到該廣播的activity 調用finish結束頁面。
● 遞歸退出
1、用startActivityForResult啟動新的activity;
2、前一個頁面finish時,觸發onActvityResult回調,再根據requestCode和resultCode處理是否finish,達到遞歸退出的效果。
● FLAG_ACTIVITY_CLEAR_TOP
通過intent.setFlag(Intent.FLAG_ACTIVITY_CLEAR_TOP)啟動新activity,如果棧中已經有該實例,則會把該activity之上的所有activity關閉,達到singleTop啟動模式的效果。
● 自定義activity棧
1、自定義activity列表,新打開activity則加入棧中,關閉則移除棧;
2、需要退出多個activity時,則循環從棧中移除activity實例,並調用finish。

在討論Activity啟動模式經常提到任務棧,那到底什麼是任務棧?
任務是一個Activity的集合,它使用棧的方式來管理其中的Activity,這個棧又被稱為返回棧(back stack),棧中Activity的順序就是按照它們被打開的順序依次存放的。返回棧是一個典型的後進先出(last in, first out)的數據結構。下圖通過時間線的方式非常清晰地向我們展示了多個Activity在返回棧當中的狀態變化:

taskAffinity 任務相關性,可以用於指定一個Activity更加願意依附於哪一個任務,在默認情況下,同一個應用程序中的所有Activity都具有相同的affinity, 名字為應用的包名。當然了,我們可以為每個 Activity 都單獨指定 taskAffinity 屬性(不與包名相同)。taskAffinity 屬性主要和 singleTask 啟動模式和 allowTaskReparenting 屬性配對使用,在其他情況下沒有意義。
taskAffinity 有下面兩種應用場景:

分為顯示啟動和隱式啟動。
(1)顯示啟動
直接指定待調整的Activity類名。

(2)隱式啟動
Intent 能夠匹配目標組件的 IntentFilter 中所設置的過濾信息,如果不匹配將無法啟動目標 Activity。IntentFilter 的過濾信息有 action、category、data。
IntentFilter 需要注意的地方有以下:
● 一個 Activity 中可以有多個 intent-filter
● 一個 intent-filter 同時可以有多個 action、category、data
● 一個 Intent 只要能匹配任何一組 intent-filter 即可啟動對應 Activity
● 新建的 Activity 必須加上以下這句,代表能夠接收隱式調用
<category android:name="android.intent.category.DEFAULT" />

只要匹配一個action即可跳轉,注意的是action要區分大小寫。

規則:如果intent中有category,則所有的都能匹配到intent-filter中的category,intent中的category數量可用少於intent-filter中的。另外,單獨設置category是無法匹配activity的,因為category屬性是一個執行Action的附加信息。

intent不添加category會匹配默認的,即 「android:intent.category.DEFAULT」
如果上面例子,如果去掉intent.setAction("action_name"),則會拋出異常:

規則:類似action,但data有復雜的結構,只要匹配一個data並且與data中所有屬性都一致就能匹配到Activity,只要有1個屬性不匹配,都無法找到activity。
data的結構:

data 主要是由 URI 和 mimeType 組成的。
URI 可配置很多信息,的結構如下:

與url類似,例如:

mineType:指資源類型包括文本、圖片、音視頻等等,例如:text/plain、 image/jpeg、video/* 等

下面看下data匹配的例子:
只匹配scheme

只匹配scheme也是能匹配到activity的。

匹配scheme、host、port
將上面的data改為

匹配mineType

如果有mineType,則不能僅設置setData或setMineType了,因為setData會把mineType置為null,而setMineType會把data置為null,導致永遠無法匹配到activity,要使用setDataAndType。

使用scheme的默認值contentfile

注意該方法需要在startAtivity方法或者是finish方法調用之後立即執行,不能延遲,但可以在子線程執行。

而在windowAnimationStyle中存在四種動畫:
activityOpenEnterAnimation // 打開新的Activity並進入新的Activity展示的動畫
activityOpenExitAnimation // 打開新的Activity並銷毀之前的Activity展示的動畫
activityCloseEnterAnimation //關閉當前Activity進入上一個Activity展示的動畫
activityCloseExitAnimation // 關閉當前Activity時展示的動畫

overridePendingTransition的方式比較生硬,方法也比較老舊了,不適用於MD風格,google提供了新的轉場動畫ActivityOptions,並提供了兼容包ActivityOptionsCompat。

我們知道在onCreate和onResume裡面直接獲取到控制項寬高為0,那有什麼辦法獲取到控制項的實際寬高?只要有onWindowFocusChanged、view.post、ViewTreeObserver三種方式獲取。

當用戶點擊桌面圖標啟動APP時,背後的流程如下:

我們看到的手機桌面是Launch程序的界面,點擊應用圖標會觸發點擊事件,調用startActivity(intent),然後通過Binder IPC機制,與ActivityManagerService(AMS)通訊,AMS執行一系列操作,最終啟動目前應用,大概流程如下:

通過PackageManager的resolveIntent()收集跳轉intent對象的指向信息,然後通過grantUriPermissionLocked()方法來驗證用戶是否有足夠的許可權去調用該intent對象指向的Activity。如果有許可權,則在新的task中啟動目標activity,如果發現沒有進程,則先創建進程。

如果進程不存在,AMS會調用startProcessLocked創建新的進程,在該方法中,會通過socket的通訊方式通知zygote進程孵化新的進程並返回pid,在新的進程中會初始化ActivityThread,並依次調用Looper.prepareLoop()和Looper.loop()來開啟消息循環。

創建好進程後下一步要將Application和進程綁定起來,AMS會調用上一節創建的ActivityThread對象的bindAppliction方法完成綁定工作,該方法會發送一條BIND_APPLICATION的消息,最終會調用handleBindApplication方法處理消息,並調用makeApplication方法處理消息,載入APP的classes到內存中。

通過前面的步驟,系統已經擁有了該Application的進程,後續的啟動則是從已存在其他進程中啟動Acitivity,即調用realStartAcitvityLocked,該方法會調用Application的主線程對象ActivityThread的sheleLaunchActivity方法,在方法中會發送LAUNCH_ACTIVITY到消息隊列,最終通過handleLaunchActivity處理消息,完成Acitivty的啟動。

Activity
Activity 的 36 大難點,你會幾個?「建議收藏」
[譯]Android Application啟動流程分析

❹ Android動畫一:Activity過渡動畫詳細實現原理

雖然 Android 5.0 之後推出了新的過渡動畫方式,但通常只是用於特定的場合使用, activity.overridePendingTransition() 通用方式的過渡動畫還是很常用。

overridePendingTransition有兩個參數,第一個參數(enterAnim)是作用於SecondActivity 的 進入屏幕可見區域 效果,第二個參數(exitAnim)是作用於當前 Activity 離開屏幕可見區域 效果。

iOS 默認的效果,新的Activity從右邊(R)數蘆進入顯示區域,當前Activity從左邊離開顯示區域到(L)。

enterAnim(activity_right_to_left_enter.xml):X軸從 100% 到 0

exitAnim(activity_right_to_left_exit.xml):X軸從 0 到 -100%

使用

一般從底部彈出新Activity,就是從B區域到屏幕可薯悔帶見區域,當前的Activity是保持不變的。
enterAnim(activity_bottom_to_top_enter.xml):Y軸從 100% 到 0

exitAnim(no_anim.xml):Y軸保持不變

使用

前面講了startActivity的轉場動畫,下面講finish()的轉場動畫。overridePendingTransition有兩個參數,第一個參數(enterAnim)是作用於上一個Activity的進入屏幕可見區域效果,第二個參數(exitAnim)是作用於當前嘩前 Activity 離開屏幕可見區域效果。

iOS默認的finish動畫,是當前的Activity從屏幕可見區域到R區域,上一個Activity從L區域到屏幕可見區域。

enterAnim(activity_left_to_right_enter.xml):X軸從 -100% 到 0

exitAnim(activity_left_to_right_exit.xml):X軸從 0 到 100%

使用

從屏幕底部滑出效果是,當前Activity從底部滑出屏幕可見區域,上一個Activity保持不變,和BottomIn不同的是,enterAnim是不需要使用動畫,因為上一個Activity已經在屏幕的後面了,只需要改變當前Activity消失的效果。
exitAnim(activity_top_to_bottom_exit.xml):Y軸從 0 到 100%

使用

https://github.com/taoweiji/ActivityAnimationExample

❺ android 怎麼將activity 退出的動畫效果關閉

在AndroidMenifest.xml文件裡面的Activity聲明中,增加自己的Theme聲明,如下:
<activity
android:name=".MyOrderListServiceActivity"
android:theme="@style/MyTheme"
>
在values的style.xml文件里 聲明 一個style,起名為MyTheme,注意這裡面有我自定義的東西,涉及到動畫的聲明,就只有 <item name="android:windowAnimationStyle">@style/AnimationActivity</item>這一項。
<style name="MyTheme">
<!-- float_box為我們定義的窗口背景 -->
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowFrame">@null</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowAnimationStyle">@style/AnimationActivity</item>
</style>

在values的style.xml文件里 聲明 一個style,起名為AnimationActivity,沒錯就是上面的MyTheme中的windowAnimationStyle的實現,如下:
<style name="AnimationActivity" mce_bogus="1" parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/slide_in_bottom</item>
<item name="android:activityOpenExitAnimation">@anim/slide_out_bottom</item>
<item name="android:activityCloseEnterAnimation">@anim/slide_in_bottom</item>
<item name="android:activityCloseExitAnimation">@anim/slide_out_bottom</item>
</style>
添加完以上的內容,有的機器雖然進入的動畫是可用的,但是退出的動畫無效,還需要在你的Activity中添加一些代碼,保證animation的完美運行
添加全局變數
protected int activityCloseEnterAnimation;
protected int activityCloseExitAnimation
在OnCreate裡面添加如下代碼:
TypedArray activityStyle = getTheme().obtainStyledAttributes(new int[] {android.R.attr.windowAnimationStyle});
int windowAnimationStyleResId = activityStyle.getResourceId(0, 0);
activityStyle.recycle();
activityStyle = getTheme().obtainStyledAttributes(windowAnimationStyleResId, new int[] {android.R.attr.activityCloseEnterAnimation, android.R.attr.activityCloseExitAnimation});
activityCloseEnterAnimation = activityStyle.getResourceId(0, 0);
activityCloseExitAnimation = activityStyle.getResourceId(1, 0);
activityStyle.recycle();
在你的程序finish之前,需要調用如下代碼:
overridePendingTransition(activityCloseEnterAnimation, activityCloseExitAnimation);
我調用的例子如下:
@Override
public void finish() {
Log.i(TAG, "finish");
super.finish();
overridePendingTransition(activityCloseEnterAnimation, activityCloseExitAnimation);
}

這樣就可以了。

❻ 安卓獲取過渡動畫實際時間

一般為1秒左右。
打開開發者模式,裡面可以設置動畫速度。
目前的App在安裝後,第一次打開,都會顯示兩秒左右的logo,然後進入引導頁。如果關閉App,再重新打開,則只會顯示logo,然後直接進入主頁。可以使用了Handler的postDelayed方法。把過渡動畫的Activity設為默認啟動的Activity。在當前Activity中,執行postDelayed方法,把延時的時長設為兩秒即可。

熱點內容
資料庫超載 發布:2025-02-01 00:57:15 瀏覽:32
fgo安卓如何玩日服 發布:2025-02-01 00:49:40 瀏覽:715
sql2000服務管理器 發布:2025-02-01 00:48:02 瀏覽:677
榮耀暢玩什麼配置 發布:2025-02-01 00:36:35 瀏覽:458
電腦對時伺服器 發布:2025-02-01 00:36:22 瀏覽:162
閃迪存儲卡港版 發布:2025-02-01 00:31:25 瀏覽:78
visualstudio編譯器 發布:2025-02-01 00:31:20 瀏覽:753
如何移植安卓上面的軟體 發布:2025-02-01 00:28:03 瀏覽:121
一刀傳世混沌和破天是什麼伺服器 發布:2025-02-01 00:28:00 瀏覽:688
紅米k40怎麼修改安卓data 發布:2025-02-01 00:23:04 瀏覽:886