Android过渡动画,发现掘金小秘密
android:gravity=“center”
android:transitionName=“textTransform”
android:text=“我是第一個Activity”
android:textColor="@color/c_333"
android:textSize=“18sp” />
`
ivImage.setOnClickListener { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { val imagePair=Pair<View,String>(ivImage,"activityTransform") val textPair=Pair<View,String>(ivImage,"textTransform") val bundle = ActivityOptions.makeSceneTransitionAnimation(this, imagePair,textPair).toBundle() startActivity(Intent(this, SecondActivity::class.java), bundle) } else { startActivity(Intent(this, SecondActivity::class.java)) } }
這里主要是通過將共享視圖和transitionName屬性的值包裝到Pair對象,其他操作和一個共享元素的操作步驟并無區別。
「效果圖:」
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Z8X4C3b8-1650171556284)(https://user-gold-cdn.xitu.io/2020/7/11/1733cfa764aa491f?imageslim)]
「深坑提醒」
有時從RecyclerView界面進入到詳情頁,由于詳情頁加載延遲,可能出現沒有效果。例如ImageView從網絡加載圖片,可能A界面到B界面沒效果,B回到A界面有效果。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-H8wLsO5B-1650171556284)(https://user-gold-cdn.xitu.io/2020/7/13/173473efe2c8292e?imageslim)] 解決步驟:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { postponeEnterTransition() }
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { startPostponedEnterTransition() }
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-qOjjyeXL-1650171556285)(https://user-gold-cdn.xitu.io/2020/7/13/173473cc8f694a47?imageslim)] 例如我是在Glide加載完再調用:
Glide.with(mContext) .asBitmap() .load(value?.avatar ?: "") .listener(object : RequestListener<Bitmap> { override fun onResourceReady(resource: Bitmap?, model: Any?, target: Target<Bitmap>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean { animatorCallback?.invoke()//回調開始加載過渡動畫 return false } override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Bitmap>?, isFirstResource: Boolean): Boolean { animatorCallback?.invoke()//回調開始加載過渡動畫 return false } }) .apply(RequestOptions.circleCropTransform()) .placeholder(R.mipmap.ic_default) .error(R.mipmap.ic_default) .into(authorBinding!!.ivAvatar)
大家也可以考慮下面代碼:
shareElement.viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener { override fun onPreDraw(): Boolean { shareElement!!.viewTreeObserver.removeOnPreDrawListener(this) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { animatorCallback?.invoke() } return true } })
二)、進入過渡與退出過渡動畫
與共享元素相反的,就是Activity進入與退出過渡動畫,兩個Activity之間在沒有共享的視圖情況下進行動畫切換。下面先看三種動畫效果圖:「爆炸式效果」和「淡入淡出式效果」、「滑動式效果」。
- 「爆炸式」:將視圖移入場景中心或從中移出;
- 「滑動式」:將視圖從場景的其中一個邊緣移入或移出;
- 「爆炸式」:通過更改視圖的不透明度,在場景中添加視圖或從中移除視圖;
第一個界面采用Fade淡入淡出效果,第二個界面采用了Explode爆炸效果。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-qtS1Xyhm-1650171556286)(https://user-gold-cdn.xitu.io/2020/7/12/17340f22a8a3dea0?imageslim)] 前后兩個界面都采用了Slide滑入滑出效果。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-fbWryAxR-1650171556286)(https://user-gold-cdn.xitu.io/2020/7/12/17340fc926f651e5?imageslim)] 利用Android現有的過渡框架,實現起來是很簡單的,步驟如下:
window.requestFeature(Window.FEATURE_CONTENT_TRANSITIONS)
val slide=Slide() slide.slideEdge=Gravity.START slide.duration=300//效果時長,一般Activity切換時間很短,不建議設置過長
如果是Slide效果,可以設置slid **《Android學習筆記總結+最新移動架構視頻+大廠安卓面試真題+項目實戰源碼講義》開源** eEdge屬性來指定滑動方向,默認是Gravity.BOTTOM。
//退出當前界面的過渡動畫 window.exitTransition = slide //進入當前界面的過渡動畫 window.enterTransition = slide //重新進入界面的過渡動畫 window.reenterTransition = slide
startActivity( Intent(this, SecondActivity::class.java), ActivityOptions.makeSceneTransitionAnimation(this).toBundle())
那么Activity的OnCreate()方法看起來是這樣子的。
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { window.requestFeature(Window.FEATURE_CONTENT_TRANSITIONS) window.allowEnterTransitionOverlap=false Slide().apply { duration = 300 excludeTarget(android.R.id.statusBarBackground, true) excludeTarget(android.R.id.navigationBarBackground, true) }.also { window.exitTransition = it window.enterTransition = it window.reenterTransition = it } } setContentView(R.layout.activity_first) ivContent.setOnClickListener { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { startActivity( Intent(this, SecondActivity::class.java), ActivityOptions.makeSceneTransitionAnimation(this).toBundle() ) } } }
上面代碼中調用 了excludeTarget()方法將狀態欄和導航欄排除在過渡動畫效果之外。否則會跟著一起起動畫效果,不是很美觀。
正常情況,退出與進入過渡動畫會有一小段交叉的過程,而window.allowEnterTransitionOverlap=false就是禁止交叉,只有退出過渡動畫結束后才會再顯示進入過渡動畫。
如果第二個Activity在finish掉后,回到第一個Activity界面也想有過渡效果,就不要手動調用finish(),可以調用finishAfterTransition ()方法。
三)、兼容Android 5.0前
如果Android 5.0前也想要有切換動畫怎么辦?
<alpha xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@interpolator/decelerate_quad" android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="@android:integer/config_longAnimTime" />
val intent = Intent(this, TestActivity2::class.java) startActivity(intent) overridePendingTransition(R.anim.fade_in, R.anim.fade_out)
overridePendingTransition()方法第一個參數為下一個界面進入動畫,第二個參數為當前界面退出動畫。
到這里,Activity的切換使用過渡動畫基本就結束了。有朋友可能會問,只有Activity切換才能應用過渡效果么?
二、布局變化過渡動畫
在上一節要理解一個概念:場景。布局的顯示與隱藏可以理解分別為一個場景,過渡動畫就是解決場景切換帶來的生硬視覺感受。Activity切換過渡動畫指在兩個Activity之間,而布局變化過渡動畫,是指同個Activity之間View的變化過渡動畫。
一)、手動創建Scene
手動創建場景的話,需要我們自己創建起始和結束場景,利用現有的過渡效果來達到兩個場景的切換。默認情況下,當前界面就是起始場景。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/tvText" android:text="內容過渡動畫" android:gravity="center" android:textSize="18sp" android:layout_width="match_parent" android:layout_height="50dp"/> <FrameLayout android:id="@+id/flContent" android:layout_weight="1" android:layout_width="match_parent" android:layout_height="0dp"> <include layout="@layout/layout_first_scene"/> </FrameLayout> </LinearLayout>
初始視圖,第一個場景,布局layout_first_scene.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/tvFirst" android:textSize="18sp" android:layout_marginTop="100dp" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal|top" android:text="感謝大家閱讀文章" /> </LinearLayout>
第二個場景,布局layout_second_scene.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:textSize="18sp" android:layout_marginTop="100dp" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal|top" android:text="我是新小夢\n歡迎大家點贊支持一下" /> </LinearLayout>
val firstScene = Scene.getSceneForLayout(flContent, R.layout.layout_first_scene, this) val secondScene = Scene.getSceneForLayout(flContent, R.layout.layout_sencod_scene, this)
默認情況下,過渡動畫應用整個場景,如果場景某個View不參加,可以通過過渡效果對象的removeTarget()方法進行移除。
Slide(Gravity.TOP).removeTarget(tvNoJoin)
面試寶典
面試必問知識點、BATJ歷年歷年面試真題+解析
學習經驗總結
(一)調整好心態
心態是一個人能否成功的關鍵,如果不調整好自己的心態,是很難靜下心來學習的,尤其是現在這么浮躁的社會,大部分的程序員的現狀就是三點一線,感覺很累,一些大齡的程序員更多的會感到焦慮,而且隨著年齡的增長,這種焦慮感會越來越強烈,那么唯一的解決辦法就是調整好自己的心態,要做到自信、年輕、勤奮。這樣的調整,一方面對自己學習有幫助,另一方面讓自己應對面試更從容,更順利。
(二)時間擠一擠,制定好計劃
一旦下定決心要提升自己,那么再忙的情況下也要每天擠一擠時間,切記不可“兩天打漁三天曬網”。另外,制定好學習計劃也是很有必要的,有邏輯有條理的復習,先查漏補缺,然后再系統復習,這樣才能夠做到事半功倍,效果才會立竿見影。
(三)不斷學習技術知識,更新自己的知識儲備
對于一名程序員來說,技術知識方面是非常重要的,可以說是重中之重。**要面試大廠,自己的知識儲備一定要非常豐富,若缺胳膊少腿,別說在實際工作當中,光是面試這一關就過不了。對于技術方面,首先基礎知識一定要扎實,包括自己方向的語言基礎、計算機基礎、算法以及編程等等。
有幫助,另一方面讓自己應對面試更從容,更順利。
(二)時間擠一擠,制定好計劃
一旦下定決心要提升自己,那么再忙的情況下也要每天擠一擠時間,切記不可“兩天打漁三天曬網”。另外,制定好學習計劃也是很有必要的,有邏輯有條理的復習,先查漏補缺,然后再系統復習,這樣才能夠做到事半功倍,效果才會立竿見影。
(三)不斷學習技術知識,更新自己的知識儲備
對于一名程序員來說,技術知識方面是非常重要的,可以說是重中之重。**要面試大廠,自己的知識儲備一定要非常豐富,若缺胳膊少腿,別說在實際工作當中,光是面試這一關就過不了。**對于技術方面,首先基礎知識一定要扎實,包括自己方向的語言基礎、計算機基礎、算法以及編程等等。
總結
以上是生活随笔為你收集整理的Android过渡动画,发现掘金小秘密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jp.ne.so_net.ga2.no_
- 下一篇: c语言做土壤湿度传感器程序,单片机土壤湿