iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 8
0
自我挑戰組

學習 Android Kotlin 隨筆系列 第 8

[ Day 8 ] 探討 Fragment 從年少輕狂,到老年退休生活!(三)樸實無華但有質感,開場動畫

  • 分享至 

  • xImage
  •  

| 生命週期

  • 連結 | 旋轉跳躍

  • 連結 | 忍術!變身術

  • 樸實無華但有質感,開場動畫

| 前言概念

ㄅ歉,寫在生命週期,有點牽強 哈哈

寫生命週期寫到快沒梗了,靈光一閃,就寫了這篇牽強的~這個作品唯一有扯到的生命週期,就只是 onCreate() 的部分而已!

這種動畫比較像是帥一下的,沒啥實質效果哈哈XD而動畫的概念想要營造出,在整個 app 開始前,可以先秀一下自己公司的 logo 啦~或者是贊助的乾爹廠商之類的,所以需要寫在 ActivityonCreate() 時期,在這個時期,看似是前面這個動畫跑了,才進入主程式,但其實主程式會跟著動畫一起生成,這時候,我先把主程式的 Drawer 先隱藏起來,當整個動畫結束之後,再把 Drawer 顯示出來。

這邊可以觀察一下,前面的動畫其實也是一個 layout ,而這個 layout 跟後面的 Drawer 有個蠻大的差別,就是有無 Toolbar 最上面綠色那一列!如果不把 Drawer 先隱藏起來,那個這個 Toolbar 會因為 Drawer 的產生而出現,就不會有滿版的效果了,如下。

  • 失敗的例子

| 實作概念

以下是比較冗長的實作方法,較好的做法將在下一篇做討論,程式碼也會一併提供唷!

  • 設定動畫

    這邊我使用了 DecorView 去當作 container,這個 decorView 是整個 FrameLayout 的頂層,意思就是說我希望把這個開場動畫,直接蓋在 app 的最上層的意思

    fun setStartAnim(){
        val decorView = window.decorView as ViewGroup
        val inflater = getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
        val startLayoutView = inflater.inflate(R.layout.start_layout, null)
        var performAnimation:Animation = AnimationUtils.loadAnimation(this, R.anim.fade_in);
    
        decorView.addView(startLayoutView, 0)
        val animListnerEnd = animListnerEnd()
        performAnimation.setAnimationListener(animListnerEnd)
        startLayoutView.startAnimation(performAnimation)
    }
    
  • 設定動畫的監聽 (animation listener)

    為了要達到上述的效果,我先執行 fade in ,並且監聽這個動畫,當 fade in 動畫整個結束之後,我立刻接 fade out,達到這個效果,並且在最後將原本隱藏的 drawer_layout 顯示出來,並且把動畫隱藏起來,在下一篇將會講解這樣的寫法還能夠如何改(這個版本太過冗長了)

    • fade_in

      inner class animListner_fadein():Animation.AnimationListener{
          override fun onAnimationRepeat(p0: Animation?) {
          }
      
          override fun onAnimationEnd(p0: Animation?) {
              val performAnimation:Animation = AnimationUtils.loadAnimation(this, R.anim.fade_out);   
              val animListner_fadeout = animListner_fadeout()
              performAnimation.setAnimationListener(animListner_fadeout)
              startLayoutView.startAnimation(performAnimation)
          }
          override fun onAnimationStart(p0: Animation?) {
          }
      }
      
    • fade_out

      inner class animListner_fadeout():Animation.AnimationListener{
          override fun onAnimationRepeat(p0: Animation?) {
          }
      
          override fun onAnimationEnd(p0: Animation?) {
              start_anim.visibility = GONE
              drawer_layout.visibility = VISIBLE
          }
          override fun onAnimationStart(p0: Animation?) {
          }
      }
      

| 實作小泥坑

  • 動畫沒有 Toolbar,但是主程式 (drawer_layout) 有,怎辦?

    如同上述所講的,只要把主程式先隱藏,在整個動畫結束之後,再顯示出來即可!

  • 為何從本機進來的圖片,為何都有奇怪的背景圖?

    在新增 image Asset 的時候,一直覺得很奇怪,為何明明已經去背的 png 檔案了,加進來之後 Android Studio 自動幫我填上一層奇怪的背景,才知道問題出在這邊

    他預設了的 shape 是正方形的,所以會自動填成正方形的形狀,只要把這個選項改成 None,就會依照原圖的外觀去長囉!


上一篇
[ Day 7 ] 探討 Fragment 從年少輕狂,到老年退休生活!(二)忍術 切頁之術!
下一篇
[ Day 9 ] 探討 Fragment 從年少輕狂,到老年退休生活!(四)樸實無華但有質感,開場動畫
系列文
學習 Android Kotlin 隨筆30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言