2024-04-07

【Kotlin】以資源檔自定向量圖 ImageButton(View) 外觀

參考資料 ----


覺得以程式控制 ImageButton 的各種狀態(按下按鈕、disabled...) 時的外觀很麻煩,可以透過設定資源檔的方式達到目的。
由於 ImageButton 繼承自 View,原則上,本筆記的做法可以套用 View(含) 的其他子類別。
 

app 層級 build.gradle(若您的程式沒有用到視圖綁定,這部份可忽略)
  1.  
  2. ...
  3. ...
  4. android {
  5. ...
  6. ...
  7. buildFeatures {
  8. viewBinding true
  9. }
  10. ...
  11. ...
  12.  


色表 /values/color.xml
  1.  
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <resources>
  4.  
  5. ...
  6. ...
  7. <color name="blue">#0000FF</color>
  8. <color name="red">#ffff0000</color>
  9. <color name="brown">#8B4513</color>
  10. <color name="gray">#ff888888</color>
  11. <color name="green">#ff00ff00</color>
  12. <color name="yellow">#FFFF00</color>
  13. ...
  14. ...
  15. </resources>
  16.  


分別建立 前景(向量圖)背景 在各種狀態時的顏色的資源檔,並置於 /res/color/
要注意:Android 套用資源檔的原則是以最低限度符合條件就採用,所以預設值要放在最後順位

前景 /res/color/image_state.xml,預設一般狀態是 藍色,按下按鈕時是 棕色,disabled 時是 灰色
  1.  
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <selector xmlns:android="http://schemas.android.com/apk/res/android">
  4. <item android:state_pressed="true"
  5. android:color="@color/brown" />
  6. <item android:state_enabled="false"
  7. android:color="@color/gray" />
  8. <item android:color="@color/blue" /> ← 預設值要放在最後順位
  9. </selector>
  10.  


背景 /res/color/back_state.xml,無預設值(所以跟 app 的 Theme 設定相同),按下按鈕時是 黃色,disabled 時是 綠色
  1.  
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <selector xmlns:android="http://schemas.android.com/apk/res/android">
  4. <item android:state_pressed="true"
  5. android:color="@color/yellow" />
  6. <item android:state_enabled="false"
  7. android:color="@color/green" />
  8. </selector> 


隨手找了個向量圖檔 /res/drawable/hand.xml,tint 屬性指向 image_state.xml
(tint 有著色的意思)
  1.  
  2. <vector
  3. android:height="48dp"
  4. android:width="48dp"
  5. android:tint="@color/image_state" ← 這裡指向 前景 image_state.xml
  6. android:viewportHeight="24"
  7. android:viewportWidth="24"
  8. xmlns:android="http://schemas.android.com/apk/res/android">
  9.  
  10. <path
  11. android:fillColor="@android:color/white"
  12. android:pathData="M13,24c-3.26,0 -6.19,-1.99 -7.4,-5.02l-3.03,-7.61C2.26,10.58 3,9.79 3.81,10.05l0.79,0.26c0.56,0.18 1.02,0.61 1.24,1.16L7.25,15H8V3.25C8,2.56 8.56,2 9.25,2s1.25,0.56 1.25,1.25V12h1V1.25C11.5,0.56 12.06,0 12.75,0S14,0.56 14,1.25V12h1V2.75c0,-0.69 0.56,-1.25 1.25,-1.25c0.69,0 1.25,0.56 1.25,1.25V12h1V5.75c0,-0.69 0.56,-1.25 1.25,-1.25S21,5.06 21,5.75V16C21,20.42 17.42,24 13,24z"/>
  13. </vector>
  14.  


activity_main.xml,ImageButton 的 backgroundTint 屬性指向 back_state.xml
  1.  
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <RelativeLayout
  4. xmlns:android="http://schemas.android.com/apk/res/android"
  5. xmlns:app="http://schemas.android.com/apk/res-auto"
  6. xmlns:tools="http://schemas.android.com/tools"
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent"
  9. tools:context=".MainActivity">
  10.  
  11. <Button
  12. android:id="@+id/Button1"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:layout_alignParentStart="true"
  16. android:layout_alignParentTop="true"
  17. android:onClick="onButton1Clicked"/>
  18.  
  19. <ImageButton
  20. android:id="@+id/Button2"
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23. android:layout_centerInParent="true"
  24. app:srcCompat="@drawable/hand"
  25. android:backgroundTint="@color/back_state" ← 這裡指向 背景 back_state.xml
  26. android:clickable="true" />
  27.  
  28. </RelativeLayout>
  29.  


MainActivity.kt (程式沒什麼功能,只是觀察 Button2enabled / disabled 時的變化)
  1.  
  2.  
  3. ...
  4. ...
  5.  
  6. class MainActivity : AppCompatActivity() {
  7. private lateinit var binding: ActivityMainBinding
  8.  
  9. override fun onCreate(savedInstanceState: Bundle?) {
  10. super.onCreate(savedInstanceState)
  11. binding = ActivityMainBinding.inflate(layoutInflater)
  12. val view = binding.root
  13. setContentView(view)
  14. }
  15.  
  16. fun onButton1Clicked(vv: View) {
  17. binding.Button2.isEnabled = !binding.Button2.isEnabled
  18. }
  19. }
  20.  


相關筆記 ----


沒有留言:

張貼留言