日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android过渡动画,发现掘金小秘密

發布時間:2023/12/20 Android 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android过渡动画,发现掘金小秘密 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

android:gravity=“center”
android:transitionName=“textTransform”
android:text=“我是第一個Activity”
android:textColor="@color/c_333"
android:textSize=“18sp” />

<?xml version="1.0" encoding="utf-8"?>




`

  • 構建多個Pair對象,并傳遞給makeSceneTransitionAnimation()函數,啟動Activity。
  • 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)] 解決步驟:

  • 在setContentView后添加下面代碼,延遲加載過渡動畫。
  • 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現有的過渡框架,實現起來是很簡單的,步驟如下:

  • 在Activity的onCreate()方法中調用 setContentView()前設置啟用窗口過渡屬性;
  • window.requestFeature(Window.FEATURE_CONTENT_TRANSITIONS)

  • 創建過渡效果對象Slide、Explode、Fade;
  • val slide=Slide() slide.slideEdge=Gravity.START slide.duration=300//效果時長,一般Activity切換時間很短,不建議設置過長

    如果是Slide效果,可以設置slid **《Android學習筆記總結+最新移動架構視頻+大廠安卓面試真題+項目實戰源碼講義》開源** eEdge屬性來指定滑動方向,默認是Gravity.BOTTOM。

  • 將過渡效果設置給window相關屬性,設置;
  • //退出當前界面的過渡動畫 window.exitTransition = slide //進入當前界面的過渡動畫 window.enterTransition = slide //重新進入界面的過渡動畫 window.reenterTransition = slide

  • 調用第二個Activity界面,使用過渡效果。
  • 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前也想要有切換動畫怎么辦?

  • 在res/anim文件夾下創建想要的效果:
  • <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" />

  • 在啟動Activity后調用o **Android開源項目《ali1024.coding.net/public/P7/Android/git》** verridePendingTransition()方法。
  • 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布局。起始場景和結束場景需要有相同根元素,例如下面代碼id為flConatent的FrameLayout布局。
  • <?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过渡动画,发现掘金小秘密的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。