飞道的博客

全新Android Material 组件你在用了吗?

566人阅读  评论(0)


一、接入说明

1、配置根目录下的buid.gradle文件


   
  1. allprojects {
  2. repositories {
  3. google()
  4. jcenter()
  5. }
  6. }

2、配置项目下的buid.gradle文件


   
  1. dependencies {
  2. // ...
  3. implementation 'com.google.android.material:material:<version>'
  4. // ...
  5. }

访问获取最新版本:                                         https://mvnrepository.com/artifact/com.google.android.material/material

注意:

1、您不应该同时使用com.android.support以及com.google.android.material。

2、如果你不想切换到新的androidx和com.google.android.material ,您可以依赖com.android.support:design:28.0.0。

3、设置compileSdkVersion to 29

4、确保使用AppCompatActivity

5、更换应用主题


   
  1. Theme .MaterialComponents
  2. Theme .MaterialComponents .NoActionBar
  3. Theme .MaterialComponents .Light
  4. Theme .MaterialComponents .Light .NoActionBar
  5. Theme .MaterialComponents .Light .DarkActionBar
  6. Theme .MaterialComponents .DayNight
  7. Theme .MaterialComponents .DayNight .NoActionBar
  8. Theme .MaterialComponents .DayNight .DarkActionBar

   
  1. <style name="Theme.MyApp" parent="Theme.MaterialComponents.DayNight">
  2. <!-- ... -->
  3. </style>

6、添加Material component

可以通过这个网站https://material.io/develop/android,去查找要使用的Material components,里边都有使用接入说明。

例如添加一个输入框


   
  1. <com.google.android.material.textfield.TextInputLayout
  2. android:layout_width= "match_parent"
  3. android:layout_height= "wrap_content"
  4. android:hint= "@string/textfield_label">
  5. <com.google.android.material.textfield.TextInputEditText
  6. android:layout_width= "match_parent"
  7. android:layout_height= "wrap_content"/>
  8. </com.google.android.material.textfield.TextInputLayout>

还可以自定义样式


   
  1. <com.google.android.material.textfield.TextInputLayout
  2. style= "@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
  3. android:layout_width= "match_parent"
  4. android:layout_height= "wrap_content"
  5. android:hint= "@string/textfield_label">
  6. <com.google.android.material.textfield.TextInputEditText
  7. android:layout_width= "match_parent"
  8. android:layout_height= "wrap_content"/>
  9. </com.google.android.material.textfield.TextInputLayout>

二、Android Material组件1.2.0更新说明

如果您尚未开始使用 MDC 的 1.2.0 版本,现在可以更新了。

  • MDC 1.1.0

    https://medium.com/google-design/material-design-components-for-android-1-1-0-are-now-available-45e1d576037c

三、Material 动效

Material 动效系统包含一套 (四种) 转场动画模式。它们可以帮助用户理解应用并在其中导航浏览,还能增强组件之间或全屏视图之间的联系。这些转场模式包括:

  • 容器变换

    https://material.io/design/motion/the-motion-system.html#container-transform

  • 共享轴

    https://material.io/design/motion/the-motion-system.html#shared-axis

  • 淡入淡出

    https://material.io/design/motion/the-motion-system.html#fade-through

  • 弹出

    https://material.io/design/motion/the-motion-system.html#fade

这些转场模式可用于 Fragment (包括 Jetpack Navigation) 、Activity 和 View 之间的过渡。

  • Jetpack Navigation

    https://developer.android.google.cn/guide/navigation

Fragment 之间的容器变换 (使用 Jetpack Navigation)


   
  1. <!-- fragment_a.xml -->
  2. <View
  3. android:id= "@+id/start_view"
  4. android:transitionName= "start_container" />
  5. <!-- fragment_b.xml -->
  6. <View
  7.      android:id= "@+id/end_view"
  8.      android:transitionName= "end_container" />
  9. // FragmentB.kt
  10. override fun onCreate(savedInstanceState: Bundle?) {
  11.     super.onCreate(savedInstanceState)
  12.     ...
  13.     sharedElementEnterTransition = MaterialContainerTransform()
  14. }
  15. // FragmentA.kt
  16. fun onCreate(savedInstanceState: Bundle?) {
  17.     super.onCreate(savedInstanceState)
  18.     ...
  19.     exitTransition = Hold()
  20. }
  21. ...
  22. val directions = FragmentADirections.actionFragmentAToFragmentB()
  23. val extras = FragmentNavigatorExtras(startView to "end_container")
  24. findNavController().navigate(directions, extras)

Fragment 之间的共享 Z 轴


   
  1. / / FragmentA.kt
  2. override fun onCreate(savedInstanceState: Bundle?) {
  3. super.onCreate(savedInstanceState)
  4.     ...
  5.     reenterTransition = MaterialSharedAxis(
  6.         MaterialSharedAxis.Z, /* forward = * / false)
  7. exitTransition = MaterialSharedAxis(
  8. MaterialSharedAxis.Z, /* forward = * / true)
  9. }
  10. / / FragmentB.kt
  11. override fun onCreate(savedInstanceState: Bundle?) {
  12. super.onCreate(savedInstanceState)
  13. ...
  14. enterTransition = MaterialSharedAxis(
  15. MaterialSharedAxis.Z, /* forward = * / true)
  16. returnTransition = MaterialSharedAxis(
  17. MaterialSharedAxis.Z, /* forward = * / false)
  18. }

Fragment 之间的淡入淡出


   
  1. // FragmentA.kt
  2. override fun onCreate(savedInstanceState: Bundle?) {
  3. super.onCreate(savedInstanceState)
  4.     ...
  5.     exitTransition = MaterialFadeThrough()
  6. }
  7. // FragmentB.kt
  8. override fun onCreate(savedInstanceState: Bundle?) {
  9.      super.onCreate(savedInstanceState)
  10.     ...
  11.     enterTransition = MaterialFadeThrough()
  12. }

弹出目标视图 (使用 TransitionManager)


   
  1. val fade = MaterialFade()
  2. TransitionManager.beginDelayedTransition(container, fade)
  3. view.visibility = View.VISIBLE // Use View.GONE to fade out

详细了解如何在 Android 上实现动效:

https://material.io/develop/android/theming/motion

四、Slider

利用 Slider (滑动条),用户可以在一定的数值范围内进行选择,非常适合用于调整音量、亮度等设置数值或在应用图像滤镜时调整其参数。

  • Sliders

    https://material.io/components/sliders

在 MDC 1.2.0 中,您可以通过 Slider 和 RangeSlider widget 在 Android 应用中使用滑动条。这些 widget 类似于 SeekBar,但包含更多功能并支持Material 主题


   
  1. <!-- In layout -->
  2. <com.google.android.material.slider.Slider
  3. android:id= ”@+id/slider”
  4. ...
  5. android:valueFrom= "0.0"
  6. android:valueTo= "100.0"
  7. android:stepSize= "10.0" />
  8. ...
  9. <com.google.android.material.slider.RangeSlider
  10. android:id= ”@+id/rangeSlider”
  11. ...
  12. android:valueFrom= "0.0"
  13. android:valueTo= "100.0"
  14. android:stepSize= "10.0"
  15. app:values= "@array/initial_slider_values" />
  16. <!-- In res/values/arrays.xml -->
  17. <resources>
  18. ...
  19. <array name="initial_slider_values">
  20. <item>20.0 </item>
  21. <item>70.0 </item>
  22. </array>
  23. </resources>
  24. // In code
  25. slider.addOnChangeListener { slider, value, fromUser ->
  26. // Respond to change in slider's value
  27. }
  28. ...
  29. val values = rangeSlider.values

这里详细了解如何实现滑动条。

  • Slider

    https://github.com/material-components/material-components-android/blob/master/lib/java/com/google/android/material/slider/Slider.java

  • RangeSlider

    https://github.com/material-components/material-components-android/blob/master/lib/java/com/google/android/material/slider/RangeSlider.java

  • Material 主题

    https://material.io/design/material-theming/overview.html

  • 实现滑动条

    https://material.io/develop/android/components/slider

五、ShapeableImageView

全新的 ShapeableImageView widget 是 AppCompatImageView 的扩展,用于处理形状主题 (shape theming)。常见用例是对矩形源图像进行圆角遮罩。不过,该 widget 也支持各种圆角尺寸、切角以及不同的描边宽度和颜色。


   
  1. <!-- res/values/shape.xml -->
  2. <style name=”ShapeAppearanceOverlay.App.CornerSize50Percent”
  3. parent= ””>
  4.      <!--
  5.     Sets size of corners to be 50% of min(width, height) of widget
  6.     -->
  7.      <item name=”cornerSize”>50% </item>
  8. </style>
  9. <!-- res/values/styles.xml -->
  10. <style name=”Widget.App.ShapeableImageView”
  11. parent= ”Widget.MaterialComponents.ShapeableImageView”>
  12. <item name=”shapeAppearance”>
  13. ?attr/shapeAppearanceSmallComponent
  14. </item>
  15. <item name=”shapeAppearanceOverlay”>
  16. @style/ShapeAppearanceOverlay.App.CornerSize50Percent
  17. </item>
  18. <item name=”strokeWidth”>1dp </item>
  19. <item name=”strokeColor”>?attr/colorPrimary </item>
  20. </style>
  21. <!-- In layout -->
  22. <com.google.android.material.imageview.ShapeableImageView
  23. ...
  24. style= ”@style/Widget.App.ShapeableImageView”
  25. app:srcCompat= ”@drawable/image” />
  • ShapeableImageView

    https://github.com/material-components/material-components-android/blob/master/lib/java/com/google/android/material/imageview/ShapeableImageView.java

六、MaterialColors

MaterialColors 实用程序类也已正式加入 MDC 1.2.0。该类提供了各种有用的静态方法,可供您在应用中以编程方式处理颜色时使用。


   
  1. // Resolve color from theme attr
  2. val primaryColor = MaterialColors.getColor(
  3. view, R.attr.colorPrimary)
  4. // Layer background color  with overlay color + alpha
  5. val overlayedColor = MaterialColors.layer(
  6.     view, R.attr.colorSurface, R.attr.colorPrimary,  0.38f)
  • MaterialColors

    https://github.com/material-components/material-components-android/blob/master/lib/java/com/google/android/material/color/MaterialColors.java

七、MaterialButton 会遵循 android:background 的相应设置

MaterialButton 此前会忽略通过 android:background 应用的自定义背景可绘制内容 (drawable)。MDC 1.2.0 中已修复此问题。如果未设置自定义背景,则 MaterialShapeDrawable 仍将用作默认背景。

  • MaterialButton

    https://github.com/material-components/material-components-android/blob/master/lib/java/com/google/android/material/button/MaterialButton.java

  • MaterialShapeDrawable

    https://github.com/material-components/material-components-android/blob/master/lib/java/com/google/android/material/shape/MaterialShapeDrawable.java

注意: MaterialButton 的默认样式包含 backgroundTint,后者也将应用于自定义背景可绘制内容。您可能需要将其更改为其他颜色或将其设置为 @empty,从而移除此内容。


     
  1. <!--
  2. Note: Button is auto-inflated as
  3. MaterialButton by MaterialComponentsViewInflater
  4. -->
  5. <Button
  6. ...
  7. android:background= ”@drawable/custom_background”
  8. app:backgroundTint= ”@empty” />

关注我获取更多知识或者投稿


转载:https://blog.csdn.net/c6E5UlI1N/article/details/108271155
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场