2018年1月28日 星期日

Android CoordinatorLayout

CoordinatorLayout  是在 android support library 提供的一個頂層 Layout,他的作用主要是讓在 layout 中的 child view 可以讓有特定的互動,例如如果不是用 CoordinatorLayout 而使用 FloatingActionButton 和 SnackBar 的話,SnackBar 彈出時會覆蓋到 FAB,但是如果使用 CoordinatorLayout,SnackBar 彈出時 FAB 位置會隨之往上移動,不會被 SnackBar 蓋到

而一些效果也需要 CoordinatorLayout,例如在 CoordinatorLayout 中包含一個 ListView,並讓使用者在滑動的時候讓 app bar 隨著上滑的動作隱藏,下拉的動作顯示

像這些比較經典的效果在 library 中都已經做好簡單的實作讓開發者可以方便的完成,當然也許還可以實現更特殊的效果,但需要對 CoordinatorLayout  的原理更加熟悉

Reference:
https://www.jianshu.com/p/4a77ae4cd82f
https://code.tutsplus.com/articles/scrolling-techniques-for-material-design--cms-24435
http://blog.30sparks.com/material-design-5-appbarlayout/

2018年1月27日 星期六

Android support library preference 坑

當使用 v7 support library 的 preference 時,你會發現你的 preference 不是 material design 的樣式,如同在這邊提到的狀況一樣,原因是因為 google 在 v7 support library 中漏放了 material design 的 theme,所以才會導致你的 preference 看起來很奇怪

雖然在 v7 中沒放,但是在 v14 中有放,所以網路上有人的解法就是再將 v14 support library include 進來,然後引用 v14 中的 theme,如這邊提到的作法



但是這樣還不是完美的,因為你會發現你的 PreferenceCategory 的文字的顏色和字體不對,在 google issue tracker 有人說明在 color.xml 中加入 preference_fallback_accent_color 並定義你想要的顏色就可解決此問題

經過了上述修改,現在 preference 看起來終於像樣一點了,但是引用 v14 support library 也帶來了一些其他缺點,例如你的 app size 會變大,另外用 v14 就必須把 minSdkVersion 設定在 14 以上這對想支援舊機種的 app 來說也會造成困擾

只能說 Android 又挖坑給別人跳了

Android 添加 自定義 Toolbar


在使用 Android support library 中有一些 theme 可以用,例如 heme.AppCompat.Light.DarkActionBar,這些 theme 中已經幫 user 定義好了 app bar,但有時我們需要自訂自己的 app bar,這時可以在 activity layout xml 中宣告自己的 Toolbar 元素



但單只這樣還不夠,因為這樣自己宣告的 Toolbar 和 內建的 Toolbar 有衝突,執行時會出錯,這時需將該 activity 預定義好的 Toolbar 拿掉,support library 中也有包含了無 Toolbar 的 theme,例如 Theme.AppCompat.Light.NoActionBar,或者我們自己在 styles.xml 中定義自己的 no action bar 的 theme,定義自己 no action bar 的 theme 需要設定兩個欄位 windowActionBar 和 windowNoTitle 如下



這樣才能正確使用我們自定義的 action bar

2018年1月14日 星期日

ImageView 的android:adjustViewBounds

之前使用 ImageView 時遇到一個問題,把 ImageView 中的圖縮小之後,ImageView 卻沒有跟著縮小到符合內含 image 的寬高,Google 後發現 ImageView 要設定 adjustViewBounds=true 才會讓 ImageView將自己縮到符合 Image 的寬高,在 StackOverflow 這邊也有提到,令人奇怪的是這個欄位為什麼預設不是 true

2018年1月13日 星期六

Android 動畫

Android 目前的動畫處理系統是 property  animation system(pas),這是用來取代更早時期的 Android 動畫系統 View animation system(vas),vas 的缺點是只能改變 view 在 screen 上被畫出來的位置,實際上的位置沒有改變,例如將一個 button 從 x = 0 的位置平移到 x = 10 的位置,從畫面上來看 button 移動了,但是 button 實際上還在 x = 0 的位置,要點擊 x = 10 位置才會觸發 button 的 onClick event,pas 就解決了這個問題,它會將 view 的 property 一起改變

pas 提供了 ValueAnimator,ObjectAnimator讓使用者操作動畫,用 ObjectAnimator  應該可以處理大部分的動畫,pas也提供了 View 一般預設 property 型態的 evaluator 例如 IntEvaluator,FloatEvaluator 和 ArgbEvaluator,用來在動畫過程中計算出 view property

此外還提供了多種 Interpolators 可供選擇,它的作用是決定動畫的速度,例如 LinearInterpolator 就是動畫過程中速度是一致的,而 AccelerateInterpolator 就是動畫一開始速度慢後面慢慢變快

還有 AnimatorSet 可以讓使用者將多個動畫結合在一起操作,例如哪些動畫要同時啟用,哪些動畫要在特定動畫前啟用等等

Keyframes 跟 PropertyValuesHolder 讓使用者更簡單的實現出複雜的動畫,Keyframe 的概念是從傳統動畫中衍伸出,一個 Keyframe 定義了某個時間點該 view 的 property,而兩個 Keyframe 中間的動畫則由系統幫你補起來,例如 Keyframe 1 定義了時間 0 和 x = 0,Keyframe 2 定義了時間 10 和 x = 10,則系統會幫你做出平移 x 從 0 到 10 的動畫,藉由定義多個 Keyframe,就可以實現比較複雜的動畫效果

也可以將 animator 或 animator set 寫在 xml 裡面,方便多個 activity 可以共享同樣的動畫效果

Reference
https://developer.android.com/guide/topics/graphics/prop-animation.html