第11天:Material Design

欢迎来到第11天的Android编程教程!今天我们将深入学习Material Design,这是Google推出的一套设计规范,旨在帮助开发者创建美观且用户友好的应用界面。本节内容将包括Material Design的基本概念、设计原则、常用组件的使用以及主题和样式的自定义。通过详细的讲解和实践实例,您将能够掌握如何利用Material Design提升应用的用户体验和视觉效果。


目录

  1. Material Design简介
  2. Material Design的基本原则
  3. 使用Material组件
  4. 自定义主题和样式
  5. 实践实例:美化登录界面
  6. 总结与拓展

1. Material Design简介

1.1 什么是Material Design

Material Design 是由Google在2014年推出的一套设计语言,旨在为用户提供统一、美观且直观的用户体验。它结合了经典设计原则和创新的技术,适用于各种设备和屏幕尺寸。Material Design不仅涵盖了视觉设计,还涉及动效设计、布局设计和组件设计等多个方面。

主要特点包括:

  • 一致性:确保不同应用在视觉和交互上的一致性。
  • 灵活性:适应不同设备、屏幕尺寸和用户需求。
  • 可扩展性:支持从简单到复杂的各种界面设计。
  • 美观性:通过精心设计的组件和布局,提升应用的整体视觉效果。

1.2 Material Design的发展历程

  • 2014年6月:Google在I/O开发者大会上首次发布Material Design,标志着Google设计语言的重大升级。
  • 2015年:Material Design正式应用于Android Lollipop(5.0)及之后版本,带来了全新的界面元素和交互模式。
  • 2017年:发布Material Design 2,强调更丰富的色彩、图标和组件,进一步提升用户体验。
  • 2022年:推出Material Design 3(也称为Material You),引入更个性化的设计元素,支持动态颜色和自定义主题,使用户能够根据自己的喜好定制应用外观。

1.3 Material Design的重要性

  • 提升用户体验:通过一致且直观的设计,帮助用户更容易地理解和操作应用。
  • 增强品牌识别度:统一的设计规范使应用在视觉上更具专业性和品牌特色。
  • 简化开发流程:提供丰富的预定义组件和工具,减少设计和开发时间,提高开发效率。
  • 跨平台一致性:适用于多种设备和平台,确保用户在不同设备上的体验一致。

1.4 Material Design与Android的关系

Material Design是Android官方推荐的设计语言,与Android的UI组件深度集成。Android Studio内置了大量支持Material Design的模板和组件,使开发者能够轻松创建符合Material Design规范的应用。通过使用Material Components库,开发者可以利用预定义的样式和组件,快速实现现代化的应用界面。


2. Material Design的基本原则

Material Design遵循以下几个核心设计原则,这些原则帮助开发者创建直观且美观的用户界面。

2.1 材质与光影(Material and Light)

  • 真实世界的模拟:Material Design模拟真实世界中的物理材质和光影效果,赋予界面深度和层次感。例如,通过使用阴影和高光,可以区分不同层级的元素,如按钮、卡片和背景。
  • 阴影与高光:阴影用于表示元素的层级关系和可点击性,而高光则用于强调特定的互动区域。这些视觉效果有助于用户理解界面结构和元素的功能。

应用示例

  • 按钮:使用阴影和高光效果,使按钮看起来像浮在页面上,增加其可点击性。
  • 卡片:卡片组件通过阴影分层,提升内容的可读性和视觉吸引力。

2.2 大胆的图形与意图(Bold, Graphic, Intentional)

  • 大胆的色彩:使用鲜明且对比强烈的色彩,吸引用户注意力,并传达明确的信息。色彩不仅用于装饰,还用于引导用户的注意力和行为。
  • 简洁的图标和图形:采用简洁、易懂的图标和图形,确保用户能够快速理解和操作。例如,使用直观的导航图标和操作按钮。
  • 清晰的排版:通过合理的字体选择和排版,提升信息的可读性和层次感。强调关键信息,使用不同的字体大小和样式来区分标题、正文和辅助信息。

应用示例

  • 导航栏:使用清晰的图标和简洁的文字标签,帮助用户快速定位和切换不同的应用部分。
  • 卡片标题:通过加粗和增大字体,使标题在卡片中更加突出,易于识别。

2.3 动效带来的连贯体验(Motion Provides Meaning)

  • 自然流畅的动画:动画应当自然流畅,帮助用户理解界面元素的变化和操作反馈。例如,当用户点击按钮时,按钮的颜色或大小变化可以作为点击反馈。
  • 引导用户:通过动效引导用户的注意力,突出重要的操作和信息。例如,使用过渡动画引导用户从一个界面过渡到另一个界面。
  • 提升互动感:适当的动效能够增强用户的互动感,使操作更加直观和有趣。例如,拖拽元素时的动画效果,使操作过程更加流畅。

应用示例

  • 页面过渡:使用淡入淡出的动画效果,使页面切换更加自然。
  • 按钮点击:按钮点击时的缩放动画,提供即时的反馈,增强用户的操作感。

2.4 自适应布局(Adaptive Layouts)

  • 响应式设计:界面能够自动适应不同设备、屏幕尺寸和方向,确保一致的用户体验。无论是在手机、平板还是不同尺寸的屏幕上,应用都能保持良好的布局和可用性。
  • 灵活的布局组件:使用灵活的布局组件,如ConstraintLayout,方便构建复杂且响应迅速的界面。这些布局组件支持自动调整和对齐,减少开发者的工作量。
  • 适应多种输入方式:支持触摸、键盘、手写笔等多种输入方式,提升应用的可用性。例如,在平板设备上支持手写输入,在手机上支持触摸操作。

应用示例

  • 响应式表单:在不同屏幕尺寸上,表单字段能够自动调整排列方式,确保输入体验一致。
  • 多栏布局:在大屏设备上,使用多栏布局展示更多内容,而在小屏设备上,切换为单栏布局,提升可用性。

2.5 可访问性(Accessibility)

  • 考虑不同用户需求:设计应当考虑不同用户的需求,包括视觉、听觉和运动能力的限制。确保所有用户都能轻松使用应用。
  • 辅助功能支持:确保应用兼容辅助功能,如屏幕阅读器、放大镜等,提升应用的可用性。例如,为按钮和图标添加内容描述,以便屏幕阅读器能够正确识别。
  • 高对比度和可调整文本:使用高对比度色彩和可调整的文本大小,确保内容的可读性。特别是对于有视觉障碍的用户,高对比度和可调整文本能够显著提升阅读体验。

应用示例

  • 内容描述:为所有可交互元素(如按钮、图标)添加contentDescription属性,帮助屏幕阅读器识别。
  • 可调整字体:允许用户在系统设置中调整应用的字体大小,确保内容在不同显示需求下都能清晰可见。

3. 使用Material组件

Material Design提供了丰富的UI组件,这些组件遵循Material Design的设计原则,帮助开发者快速构建美观且功能完善的应用界面。以下是一些常用的Material组件及其使用方法。

3.1 TextInputLayout

TextInputLayout是Material Design中用于包裹EditText的容器,提供了浮动标签、错误提示和辅助文本等功能。

特点

  • 浮动标签:当用户输入内容时,标签会从输入框内部上移,保持可见性,提升输入框的可用性和美观性。
  • 错误提示:当输入内容有误时,可以显示错误提示信息,帮助用户纠正输入。
  • 辅助文本:提供额外的说明或提示信息,指导用户正确输入内容。

使用示例

<com.google.android.material.textfield.TextInputLayoutandroid:id="@+id/til_username"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="用户名"app:boxStrokeColor="@color/purple_500"app:boxBackgroundMode="outline"android:layout_marginBottom="16dp"><com.google.android.material.textfield.TextInputEditTextandroid:id="@+id/et_username"android:layout_width="match_parent"android:layout_height="wrap_content"android:inputType="textPersonName"/>
</com.google.android.material.textfield.TextInputLayout>

说明

  • android:hint:设置输入框的提示文本,浮动标签会基于此文本生成。
  • app:boxStrokeColor:设置输入框边框颜色,增强视觉效果。
  • app:boxBackgroundMode:设置输入框的背景模式,如outline表示外边框样式。

3.2 MaterialButton

MaterialButton是Material Design风格的按钮,支持多种样式,如文本按钮、轮廓按钮和填充按钮。

特点

  • 多种样式:支持不同的视觉样式,适应不同的使用场景。
  • 自定义颜色和形状:可以通过属性自定义按钮的颜色、形状和大小,满足设计需求。
  • 内置动效:自带点击反馈动画,提升用户互动体验。

使用示例

<com.google.android.material.button.MaterialButtonandroid:id="@+id/btn_login"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="登录"android:backgroundTint="@color/purple_500"android:textColor="@color/white"/>

说明

  • android:text:设置按钮的显示文本。
  • android:backgroundTint:设置按钮的背景色。
  • android:textColor:设置按钮文本的颜色。

3.3 Snackbar

Snackbar是一种临时的提示信息,通常用于操作反馈或提示用户完成某项操作。

特点

  • 自动消失:提示信息会在短时间后自动消失,无需用户手动关闭。
  • 可包含操作按钮:可以在Snackbar中添加操作按钮,如“撤销”。
  • 易于使用:通过简单的API调用即可显示,且样式与Material Design一致。

使用示例

Snackbar.make(view, "登录成功!欢迎,$username!", Snackbar.LENGTH_LONG).show()

说明

  • view:Snackbar将显示在此视图的基础上,通常为当前活动的根视图。
  • LENGTH_LONG:设置Snackbar显示的时长,可选值还有LENGTH_SHORTLENGTH_INDEFINITE

3.4 FloatingActionButton(FAB)

FloatingActionButton是Material Design中的圆形按钮,通常用于突出显示主要操作,如添加新项或启动重要任务。

特点

  • 突出显示:圆形设计和鲜明颜色使其在界面中突出显示,吸引用户注意。
  • 可移动性:FAB可以在界面中移动,提供更灵活的布局设计。
  • 内置动效:自带点击动画,提升用户体验。

使用示例

<com.google.android.material.floatingactionbutton.FloatingActionButtonandroid:id="@+id/fab_add"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/ic_add"android:contentDescription="添加"app:backgroundTint="@color/teal_200"app:layout_anchor="@id/bottom_app_bar"app:layout_anchorGravity="end|bottom"/>

说明

  • android:src:设置FAB的图标。
  • android:contentDescription:为无障碍功能提供描述。
  • app:backgroundTint:设置FAB的背景色。
  • app:layout_anchorapp:layout_anchorGravity:用于将FAB锚定到特定的布局组件上,如底部应用栏。

3.5 AppBarLayout & Toolbar

AppBarLayoutToolbar用于构建应用的顶部导航栏,支持标题、菜单和导航图标。

特点

  • 灵活布局:支持多种布局方式,如固定顶部栏、可滚动顶部栏等。
  • 集成搜索和菜单:可以轻松集成搜索框和菜单项,提升应用功能性。
  • 主题和样式:支持自定义主题和样式,确保与应用整体风格一致。

使用示例

<com.google.android.material.appbar.AppBarLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar"><androidx.appcompat.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:background="?attr/colorPrimary"app:title="Material Login Demo"app:titleTextColor="@color/white"/>
</com.google.android.material.appbar.AppBarLayout>

说明

  • AppBarLayout:容纳顶部栏的容器,支持多种滚动行为。
  • Toolbar:自定义的应用工具栏,支持设置标题、图标和菜单项。
  • android:theme:为AppBarLayout设置主题,确保工具栏与整体主题一致。

3.6 CardView

CardView是Material Design中的卡片组件,用于展示相关信息的集合,如图片、文本和按钮。

特点

  • 圆角和阴影:自带圆角和阴影效果,提升视觉层次感和美观性。
  • 内容分组:适合用于分组展示相关内容,提升信息的组织性和可读性。
  • 灵活布局:可以嵌套其他布局组件,如LinearLayout、ConstraintLayout等,构建复杂的界面。

使用示例

<androidx.cardview.widget.CardViewandroid:layout_width="match_parent"android:layout_height="wrap_content"app:cardCornerRadius="8dp"app:cardElevation="4dp"android:layout_margin="8dp"><LinearLayoutandroid:orientation="vertical"android:padding="16dp"android:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:text="Card Title"android:textSize="18sp"android:textStyle="bold"android:layout_width="wrap_content"android:layout_height="wrap_content"/><TextViewandroid:text="Card content goes here."android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="8dp"/></LinearLayout>
</androidx.cardview.widget.CardView>

说明

  • app:cardCornerRadius:设置卡片的圆角半径,提升视觉美感。
  • app:cardElevation:设置卡片的阴影高度,增强层次感。
  • android:layout_margin:设置卡片的外边距,确保与其他元素有适当的间距。

3.7 BottomNavigationView

BottomNavigationView是Material Design中的底部导航栏,用于在应用的不同主要部分之间切换。

特点

  • 简洁导航:通过图标和文本标签,提供简洁明了的导航选项,帮助用户快速定位不同功能模块。
  • 适应多种屏幕尺寸:自动适应不同屏幕尺寸和方向,保持一致的用户体验。
  • 支持动效:内置动效,提升导航的流畅性和反馈感。

使用示例

<com.google.android.material.bottomnavigation.BottomNavigationViewandroid:id="@+id/bottom_navigation"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="bottom"app:menu="@menu/bottom_nav_menu"app:itemIconTint="@color/bottom_nav_color"app:itemTextColor="@color/bottom_nav_color"/>

菜单资源示例(res/menu/bottom_nav_menu.xml)

<menu xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:id="@+id/nav_home"android:icon="@drawable/ic_home"android:title="首页"/><itemandroid:id="@+id/nav_dashboard"android:icon="@drawable/ic_dashboard"android:title="仪表盘"/><itemandroid:id="@+id/nav_notifications"android:icon="@drawable/ic_notifications"android:title="通知"/>
</menu>

说明

  • app:menu:指定底部导航栏的菜单资源。
  • app:itemIconTintapp:itemTextColor:设置导航项图标和文本的颜色。
  • 菜单资源文件定义了导航栏中的各个导航项,包括图标和标题。

4. 自定义主题和样式

通过自定义主题和样式,可以统一应用的外观和感觉,提升品牌识别度和用户体验。Material Design提供了强大的主题和样式定制功能,允许开发者根据需求进行灵活调整。

4.1 主题(Theme)

主题定义了应用的整体外观,包括颜色、字体、形状等。通过主题,可以确保应用中的所有组件遵循统一的设计规范。

4.1.1 主题的类型
  • 全局主题:应用于整个应用的所有活动和组件。
  • 局部主题:仅应用于特定活动或组件,覆盖全局主题的设置。
4.1.2 主题的继承

主题通常继承自Material Components的基础主题,如Theme.MaterialComponents.DayNight.DarkActionBar,确保应用兼容最新的Material Design组件。这种继承关系使得开发者可以在基础主题的基础上进行自定义,而不需要从头开始定义所有属性。

4.1.3 定义主题

res/values/themes.xml中定义主题:

<resources xmlns:tools="http://schemas.android.com/tools"><style name="Theme.MaterialLoginDemo" parent="Theme.MaterialComponents.DayNight.DarkActionBar"><!-- 主色调 --><item name="colorPrimary">@color/purple_500</item><item name="colorPrimaryVariant">@color/purple_700</item><item name="colorOnPrimary">@color/white</item><!-- 次色调 --><item name="colorSecondary">@color/teal_200</item><item name="colorSecondaryVariant">@color/teal_700</item><item name="colorOnSecondary">@color/black</item><!-- 其他属性 --></style>
</resources>

说明

  • colorPrimary:应用的主色调,影响应用的主要组件颜色,如工具栏、按钮等。
  • colorPrimaryVariant:主色调的变体,用于强调或区分不同状态。
  • colorOnPrimary:在主色调背景上的文字和图标颜色。
  • colorSecondary:次色调,通常用于强调辅助操作和信息。
  • colorSecondaryVariant:次色调的变体,用于强调或区分不同状态。
  • colorOnSecondary:在次色调背景上的文字和图标颜色。

4.2 样式(Style)

样式用于定义单个组件或一组组件的外观,可以复用样式来保持一致性。

4.2.1 定义样式

res/values/styles.xml中定义样式:

<resources><!-- 按钮样式 --><style name="Widget.MaterialLoginDemo.Button" parent="Widget.MaterialComponents.Button"><item name="cornerRadius">8dp</item><item name="android:paddingLeft">16dp</item><item name="android:paddingRight">16dp</item></style><!-- 输入框样式 --><style name="Widget.MaterialLoginDemo.TextInputLayout" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox"><item name="boxStrokeColor">@color/purple_500</item><item name="hintTextAppearance">@style/HintTextAppearance</item></style><!-- 提示文本样式 --><style name="HintTextAppearance" parent="TextAppearance.AppCompat.Caption"><item name="android:textColor">@color/purple_500</item></style>
</resources>

说明

  • 按钮样式

    • cornerRadius:设置按钮的圆角半径,提升视觉美感。
    • android:paddingLeftandroid:paddingRight:设置按钮的左右内边距,增加按钮的可点击面积和视觉效果。
  • 输入框样式

    • boxStrokeColor:设置输入框的边框颜色,确保与主题颜色一致。
    • hintTextAppearance:设置浮动标签的文本样式,提升可读性和视觉一致性。
  • 提示文本样式

    • 定义浮动标签的文本颜色,确保在不同背景色上的可见性。
4.2.2 应用样式

在布局文件中应用自定义样式:

<com.google.android.material.button.MaterialButtonandroid:id="@+id/btn_login"style="@style/Widget.MaterialLoginDemo.Button"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="登录"android:textColor="@color/white"/>

说明

  • 使用style属性引用预定义的样式,确保按钮的外观与整个应用一致。
  • 通过样式复用,减少代码重复,提高维护效率。

4.3 颜色资源(Color Resources)

使用颜色资源文件(res/values/colors.xml)统一管理应用的颜色,确保颜色的一致性和易维护性。

示例

<resources><color name="purple_200">#BB86FC</color><color name="purple_500">#6200EE</color><color name="purple_700">#3700B3</color><color name="teal_200">#03DAC5</color><color name="teal_700">#018786</color><color name="white">#FFFFFF</color><color name="black">#000000</color><!-- 其他颜色 -->
</resources>

说明

  • 定义所有在主题和样式中使用的颜色,便于统一管理和修改。
  • 使用有意义的命名,如purple_500,便于识别和引用。

4.4 形状资源(Shape Resources)

通过形状资源定义组件的形状,如圆角、边框等,增强界面的视觉效果。

示例

<!-- res/drawable/rounded_background.xml -->
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"><solid android:color="@color/purple_500"/><corners android:radius="8dp"/>
</shape>

在布局文件中应用形状资源:

<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/rounded_background"android:text="圆角按钮"/>

说明

  • shape标签定义了形状的基本属性,如solid用于填充颜色,corners用于设置圆角半径。
  • 将形状资源应用于组件的android:background属性,统一组件的外观。

4.5 字体和排版

通过自定义字体和排版,提升应用的阅读体验和品牌形象。

4.5.1 添加自定义字体
  1. 将字体文件添加到项目中

    • 将字体文件(如.ttf.otf格式)放入res/font目录。如果font目录不存在,请手动创建。
  2. 在布局文件中应用字体

<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="自定义字体"android:fontFamily="@font/custom_font"/>

说明

  • @font/custom_font:引用在res/font目录下的字体文件,如custom_font.ttf
4.5.2 定义排版样式

res/values/styles.xml中定义排版样式:

<style name="CustomTitleText" parent="TextAppearance.MaterialComponents.Headline6"><item name="fontFamily">@font/custom_font</item><item name="android:textColor">@color/purple_500</item>
</style>

在布局文件中应用排版样式:

<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="标题文本"style="@style/CustomTitleText"/>

说明

  • TextAppearance.MaterialComponents.Headline6:继承自Material Design的排版样式,确保与整体设计一致。
  • 通过定义和应用自定义排版样式,确保不同组件之间的文字风格一致,提升整体视觉效果。

5. 实践实例:美化登录界面

本节将通过一个具体的实践实例,演示如何使用Material组件和自定义主题来美化一个简单的登录界面。实践过程中,我们将使用Kotlin语言编写代码,并详细解释每个步骤和代码的作用。

5.1 项目创建过程

步骤一:启动Android Studio并创建新项目
  1. 打开Android Studio

    • 启动Android Studio,如果尚未安装,请参考第1天的教程进行安装。
  2. 创建新项目

    • 点击**“Start a new Android Studio project”**。
    • 在模板选择界面,选择**“Empty Activity”,点击"Next"**。
  3. 配置项目属性

    • NameMaterialLoginDemo
    • Package namecom.example.materiallogindemo
    • Save location:选择合适的目录
    • Language:选择Kotlin
    • Minimum SDK:选择API 21: Android 5.0 (Lollipop)(确保支持Material Components)
    • 点击**“Finish”**,等待项目创建完成。
步骤二:添加Material Components依赖

确保项目使用的是Material Components库,以支持最新的Material Design组件。

  1. 打开build.gradle文件

    • 在项目视图中,展开app模块,找到并打开build.gradle (Module: app)文件。
  2. 添加Material Components依赖

    • dependencies部分添加以下行:
    dependencies {implementation 'com.google.android.material:material:1.9.0'// 其他依赖...
    }
    
  3. 同步项目

    • 点击提示框中的**“Sync Now”**按钮,等待Gradle同步完成。
步骤三:设置应用主题
  1. 打开themes.xml文件

    • 导航到res/values/themes.xml文件。
  2. 修改主题为MaterialComponents主题

    <resources xmlns:tools="http://schemas.android.com/tools"><style name="Theme.MaterialLoginDemo" parent="Theme.MaterialComponents.DayNight.DarkActionBar"><!-- 主色调 --><item name="colorPrimary">@color/purple_500</item><item name="colorPrimaryVariant">@color/purple_700</item><item name="colorOnPrimary">@color/white</item><!-- 次色调 --><item name="colorSecondary">@color/teal_200</item><item name="colorSecondaryVariant">@color/teal_700</item><item name="colorOnSecondary">@color/black</item><!-- 其他属性 --></style>
    </resources>
    
  3. 确保在AndroidManifest.xml中引用了正确的主题

    • 打开AndroidManifest.xml文件,确保application标签中引用了新定义的主题:
    <applicationandroid:theme="@style/Theme.MaterialLoginDemo"...>...
    </application>
    

5.2 布局文件(XML)

我们将设计一个包含用户名和密码输入框,以及登录按钮的登录界面。

  1. 打开activity_main.xml文件

    • 导航到res/layout/activity_main.xml文件。
  2. 替换默认内容为以下代码

    <?xml version="1.0" encoding="utf-8"?>
    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:padding="16dp"><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center_horizontal"><!-- 应用Logo或图标 --><ImageViewandroid:layout_width="100dp"android:layout_height="100dp"android:src="@mipmap/ic_launcher"android:contentDescription="App Logo"android:layout_marginBottom="24dp"/><!-- 用户名输入框 --><com.google.android.material.textfield.TextInputLayoutandroid:id="@+id/til_username"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="用户名"app:boxStrokeColor="@color/purple_500"app:boxBackgroundMode="outline"android:layout_marginBottom="16dp"><com.google.android.material.textfield.TextInputEditTextandroid:id="@+id/et_username"android:layout_width="match_parent"android:layout_height="wrap_content"android:inputType="textPersonName"/></com.google.android.material.textfield.TextInputLayout><!-- 密码输入框 --><com.google.android.material.textfield.TextInputLayoutandroid:id="@+id/til_password"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="密码"app:passwordToggleEnabled="true"app:boxStrokeColor="@color/purple_500"app:boxBackgroundMode="outline"android:layout_marginBottom="24dp"><com.google.android.material.textfield.TextInputEditTextandroid:id="@+id/et_password"android:layout_width="match_parent"android:layout_height="wrap_content"android:inputType="textPassword"/></com.google.android.material.textfield.TextInputLayout><!-- 登录按钮 --><com.google.android.material.button.MaterialButtonandroid:id="@+id/btn_login"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="登录"android:backgroundTint="@color/purple_500"android:textColor="@color/white"/></LinearLayout>
    </ScrollView>
    

说明

  • ScrollView:确保在小屏幕设备上内容可滚动,防止内容被截断。
  • LinearLayout:垂直排列组件,并居中对齐。
  • ImageView:展示应用Logo或图标,增强品牌识别度。
  • TextInputLayout:包裹TextInputEditText,实现浮动标签和输入框样式。
    • 属性解释
      • android:hint:设置输入框的提示文本。
      • app:boxStrokeColor:设置输入框边框颜色。
      • app:boxBackgroundMode:设置输入框的背景模式为outline,即外边框样式。
      • app:passwordToggleEnabled:启用密码可见性切换按钮。
  • MaterialButton:使用Material风格的按钮,设置背景色和文字颜色。

5.3 Activity代码(Kotlin)

接下来,我们将编写Kotlin代码,实现登录按钮的点击事件,并使用Snackbar显示反馈信息。

  1. 打开MainActivity.kt文件

    • 导航到src/main/java/com/example/materiallogindemo/MainActivity.kt文件。
  2. 替换默认内容为以下代码

    package com.example.materiallogindemoimport android.os.Bundle
    import android.text.TextUtils
    import androidx.appcompat.app.AppCompatActivity
    import com.google.android.material.button.MaterialButton
    import com.google.android.material.snackbar.Snackbar
    import com.google.android.material.textfield.TextInputEditTextclass MainActivity : AppCompatActivity() {private lateinit var etUsername: TextInputEditTextprivate lateinit var etPassword: TextInputEditTextprivate lateinit var btnLogin: MaterialButtonoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)// 设置布局文件setContentView(R.layout.activity_main)// 初始化视图etUsername = findViewById(R.id.et_username)etPassword = findViewById(R.id.et_password)btnLogin = findViewById(R.id.btn_login)// 设置登录按钮点击事件btnLogin.setOnClickListener { view ->performLogin(view)}}/*** 执行登录操作*/private fun performLogin(view: android.view.View) {val username = etUsername.text.toString().trim()val password = etPassword.text.toString().trim()// 简单验证if (TextUtils.isEmpty(username)) {Snackbar.make(view, "请输入用户名", Snackbar.LENGTH_LONG).show()return}if (TextUtils.isEmpty(password)) {Snackbar.make(view, "请输入密码", Snackbar.LENGTH_LONG).show()return}// 模拟登录成功Snackbar.make(view, "登录成功!欢迎,$username!", Snackbar.LENGTH_LONG).show()}
    }
    

代码详解

  • 视图初始化

    • 使用findViewById获取布局中的输入框和按钮,并赋值给变量。
    • lateinit var用于延迟初始化变量,确保在使用前已赋值。
  • 按钮点击事件

    • btnLogin设置点击事件监听器,当用户点击登录按钮时,执行performLogin方法。
    • setOnClickListener接收一个lambda表达式,view参数代表点击事件的视图。
  • performLogin方法

    • 获取用户输入
      • 使用etUsername.text.toString().trim()etPassword.text.toString().trim()获取并去除输入内容的前后空白。
    • 简单验证
      • 检查用户名和密码是否为空,若为空,使用Snackbar提示用户输入相应内容。
      • TextUtils.isEmpty用于判断字符串是否为空或长度为0。
    • 模拟登录成功
      • 如果输入有效,使用Snackbar显示欢迎信息,包含用户输入的用户名。

注意事项

  • Snackbar:与Toast类似,但支持更多的自定义选项,如动作按钮等。它会出现在屏幕底部,并自动消失。
  • 输入验证:实际应用中,应进行更严格的输入验证,如格式检查、密码强度验证等。

5.4 运行与效果展示

  1. 连接设备或启动模拟器

    • 确保有一台Android设备连接,或在Android Studio中启动一个虚拟设备(AVD)。
  2. 运行应用

    • 点击Android Studio顶部工具栏的Run按钮(绿色三角形)。
    • 选择目标设备,等待应用部署并启动。
  3. 应用启动后

    • 你将看到一个美观的登录界面,包含Logo、用户名和密码输入框以及登录按钮。
  4. 测试功能

    • 输入用户名和密码
      • 输入框会显示浮动标签,提升输入体验。
    • 点击登录按钮
      • 如果用户名或密码为空,会弹出相应的Snackbar提示。
      • 输入有效内容后,点击登录按钮,会显示欢迎信息的Snackbar

效果预览


6. 总结与拓展

通过今天的学习和实践,你已经掌握了以下内容:

  • Material Design的基本概念和原则,理解其在现代应用开发中的重要性。
  • 使用Material组件,如TextInputLayoutMaterialButton,提升应用界面的美观性和用户体验。
  • 自定义主题和样式,统一应用的视觉风格,增强品牌识别度。
  • 使用Snackbar进行用户反馈,提供更友好的交互体验。

拓展建议

  1. 探索更多Material组件

    • 尝试使用FloatingActionButtonCardViewBottomNavigationView等组件,丰富应用界面。
    • 学习CoordinatorLayoutAppBarLayout的高级用法,实现复杂的交互效果。
  2. 深入学习Material Theming

    • 通过自定义颜色、形状和排版,打造独特的应用风格。
    • 使用动态颜色主题,支持用户个性化设置。
  3. 实现动态主题切换

    • 让用户在应用中选择不同的主题(如浅色/深色模式),提升用户体验。
    • 学习如何在运行时更改主题,确保应用界面即时更新。
  4. 学习Motion Design

    • 添加动画和过渡效果,使应用更加生动和流畅。
    • 学习MotionLayout,实现复杂的动画和布局变化。
  5. 优化布局适配

    • 使用ConstraintLayout等高级布局组件,实现更加复杂和响应式的界面设计。
    • 学习如何为不同屏幕尺寸和设备方向优化布局,确保一致的用户体验。
  6. 提高可访问性

    • 深入学习Material Design中的可访问性指南,确保应用对所有用户友好。
    • 添加辅助功能支持,如内容描述、焦点管理等,提升应用的可用性。

进一步学习资源

  • 官方文档

    • Material Design 官方网站
    • Android Material Components 文档
  • 在线课程

    • Google Developers - Material Design for Android
  • 开源项目

    • 在GitHub上搜索Material Design Android,查找并学习开源项目,提升实战经验。

通过不断实践和学习,你将能够熟练运用Material Design的各项功能,打造出既美观又功能强大的Android应用。祝你在Material Design的学习旅程中取得更大的进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/59325.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu24.04安装matlab失败

又是摸鱼摆烂的一天&#xff0c;好难过&#xff5e; 官方教程&#xff1a;https://ww2.mathworks.cn/help/install/ug/install-products-with-internet-connection.html 问题描述&#xff1a;https://ww2.mathworks.cn/matlabcentral/answers/2158925-cannot-install-matlab-r2…

Hive1.2.1与Hbase1.4.13集成---版本不兼容问题

hive与hbase集成失败,汗流夹背了吧老弟......哈哈哈哈,刷到这篇文章,那你可真是太幸运啦~ 常见错误一: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. org.apache.hadoop.hbase.HTableDescriptor.addFamily(Lorg/apache/hadoop/h…

项目1:井字棋 --- 《跟着小王学Python》

项目1&#xff1a;井字棋 — 《跟着小王学Python新手》 文章目录 项目1&#xff1a;井字棋 --- 《跟着小王学Python新手》目标功能设计1. 数据结构2. 功能模块3. 用户界面 实现步骤代码实现测试注意事项小结 目标 本技术文章旨在指导读者如何使用 Python 编程语言来实现一个简…

Python 的 Pygame 库,编写简单的 Flappy Bird 游戏

Pygame 是一个用 Python 编写的开源游戏开发框架&#xff0c;专门用于编写 2D 游戏。它提供了丰富的工具和功能&#xff0c;使得开发者能够快速实现游戏中的图形渲染、声音播放、输入处理和动画效果等功能。Pygame 非常适合初学者和想要快速创建游戏原型的开发者。 Pygame 的主…

LeetCode-222.完全二叉树的节点个数

. - 力扣&#xff08;LeetCode&#xff09; 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一…

【MongoDB】MongoDB的核心-索引原理及索引优化、及查询聚合优化实战案例(超详细)

文章目录 一、数据库查询效率问题引出索引需求二、索引的基本原理及作用&#xff08;一&#xff09;索引的创建及数据组织&#xff08;二&#xff09;不同类型的索引&#xff08;三&#xff09;索引的额外属性 三、索引的优化与查询计划分析&#xff08;一&#xff09;通过prof…

企业如何实现无缝数据中心进行大数据迁移呢?

数据中心迁移是企业面临的一个复杂而关键的挑战&#xff0c;涉及到大量的数据移动和系统的重新部署。随着业务的扩展和技术的进步&#xff0c;企业可能需要将数据中心迁移到新的位置或升级到更先进的设备。在进行数据迁移时&#xff0c;必须精心规划和执行&#xff0c;以确保数…

初始JavaEE篇 —— 网络编程(2):了解套接字,从0到1实现回显服务器

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 TCP 与 UDP Socket套接字 UDP TCP 网络基础知识 在一篇文章中&#xff0c;我们了解了基础的网络知识&#xff0c;网络的出…

【人工智能】10分钟解读-深入浅出大语言模型(LLM)——从ChatGPT到未来AI的演进

文章目录 一、前言二、GPT模型的发展历程2.1 自然语言处理的局限2.2 机器学习的崛起2.3 深度学习的兴起2.3.1 神经网络的训练2.3.2 神经网络面临的挑战 2.4 Transformer的革命性突破2.4.1 Transformer的核心组成2.4.2 Transformer的优势 2.5 GPT模型的诞生与发展2.5.1 GPT的核心…

最全最简单理解迭代器

1. 迭代器的基础概念(iterator) 1.1 本质 迭代器能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针。 1.2 作用: 能够让迭代器与算法不干扰的相互发展,最后又能无间隙的粘合起来。重载了*,++,==,!=,=运算符。用以操作复杂的数据结构。容器提供迭代…

MTSET可溶于DMSO、DMF、THF等有机溶剂,并在水中有轻微的溶解性,91774-25-3

一、基本信息 中文名称&#xff1a;[2-(三甲基铵)乙基]甲硫基磺酸溴&#xff1b;MTSET巯基反应染料 英文名称&#xff1a;MTSET&#xff1b;[2-(Trimethylammonium)ethyl]methanethiosulfonate Bromide CAS号&#xff1a;91774-25-3 分子式&#xff1a;C6H16BrNO2S2 分子量…

CC1链学习记录

&#x1f338; 前言 上篇文章学习记录了URLDNS链&#xff0c;接下来学习一下Common-Colections利用链。 &#x1f338; 相关介绍 Common-Colections是Apache软件基金会的项目&#xff0c;对Java标准的Collections API提供了很好的补充&#xff0c;在其基础上对常用的数据结构…

数据结构PTA

20&#xff1a;C 22&#xff1a;B 27&#xff1a;D 填空 4-2&#xff1a;19 4-4&#xff1a;66 4-5&#xff1a;8 5-x&#xff1a;不加分号 ⬇&#xff1a;top p->next 编程 单链表 每个节点除了存放数据元素外&#xff0c;还要存储指向下一节点的指针…

【学术会议介绍,SPIE 出版】第四届计算机图形学、人工智能与数据处理国际学术会议 (ICCAID 2024,12月13-15日)

第四届计算机图形学、人工智能与数据处理国际学术会议 2024 4th International Conference on Computer Graphics, Artificial Intelligence and Data Processing (ICCAID 2024) 重要信息 大会官网&#xff1a;www.iccaid.net 大会时间&#xff1a;2024年12月13-15日 大会地…

【go从零单排】Command-Line Flags、Command-Line Subcommands命令行和子命令

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在 Go 语言中&#xff0c;命令行标志&#xff08;Command-Line Flags&#xff09…

WEB攻防-通用漏洞SQL读写注入MYSQLMSSQLPostgraSQL

知识点&#xff1a; 1、SQL注入-MYSQL数据库&#xff1b; 2、SQL注入-MSSQL数据库&#xff1b; 3、SQL注入-PostgreSQL数据库&#xff1b; 首先要找到注入点 详细点&#xff1a; Access无高权限注入点-只能猜解&#xff0c;还是暴力猜解 MYSQL&#xff0c;PostgreSQL&am…

自定义springCloudLoadbalancer简述

概述 目前后端用的基本都是springCloud体系&#xff1b; 平时在dev环境开发时&#xff0c;会把自己的本地服务也注册上去&#xff0c;但是这样的话&#xff0c;在客户端调用时请求可能会打到自己本地&#xff0c;对客户端测试不太友好. 思路大致就是前端在请求头传入指定ip&a…

腾讯云11.11云服务器活动--上云拼团GO

目录 云服务器活动介绍&#xff1a; 轻量服务器 上GO拼团领券 云服务器购买 HAI现金券 学生专享GPU 活动总结 云服务器活动介绍&#xff1a; 双十一临近,这是您一年中最期待的购物狂欢时刻。作为国内领先的云计算服务商,腾讯云诚挚为您呈献前所未有的优惠福利,助您在这…

防脱生发最有效的产品,测评总结早看少踩雷

别人脱单、脱贫你脱发&#xff0c;就问你心酸不心酸&#xff1f;探索防脱之路确实不易&#xff0c;到底怎么才能有效防脱养发呢&#xff0c;很有必要分享一下我多年的防脱心得&#xff0c;这几款一直在用的防脱育发好物&#xff0c;秃头朋友们可以看看~ **露卡菲娅防脱精华液**…

c++:string(一)

文章目录 一string类1C语言中的字符串2C中的string二遍历1[ ]2迭代器3const迭代器4范围for5auto6总结三String的尾插1size和length2max_size,capacity和clear3访问接口4尾插字符和字符串5 append的重载三string的扩容问题&#xff08;1&#xff09;怎么扩容&#xff08;2&#…