Android Material Design学习笔记

news2024/11/28 2:41:48

Material Design控件学习记录

Toolbar

新建一个工程后,在res/values/themes.xml文件里

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.MaterialTest" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/purple_500</item>
        <item name="colorPrimaryVariant">@color/purple_200</item>
        <item name="colorOnPrimary">@color/white</item>
        <!-- Secondary brand color. -->
        <item name="colorSecondary">@color/teal_200</item>
        <item name="colorSecondaryVariant">@color/teal_700</item>
        <item name="colorOnSecondary">@color/black</item>
        <!-- Status bar color. -->
        <item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
        <!-- Customize your theme here. -->

    </style>
</resources>

在页面里有详细的说明

Attribute NameDescriptionDefault Value
colorPrimaryThe color displayed most frequently across your app’s screens and components. This color should pass accessibilty guidelines for text / iconography when drawn on top of the surface or background color.#6200EE
colorPrimaryVariantA tonal variation of the primary color.#3700B3
colorOnPrimaryA color that passes accessibility guidelines for text/iconography when drawn on top of the primary color.#FFFFFF
colorSecondaryThe secondary branding color for the app, usually an accented complement to the primary branding color.#03DAC6
colorSecondaryVariantA tonal variation of the secondary color.#018786
colorOnSecondaryA color that passes accessibility guidelines for text/iconography when drawn on top of the secondary color.#000000

我浅显的理解
这个colorPrimary:就是顶部深色的颜色
这个colorPrimaryVariant :就是MaterialTest的背景色
在这里插入图片描述

修改ActionBar成ToolBar
https://github.com/TeaAndCoffeeParty/android_practice/commit/e9698a219cf3fd88c2fbeffedf1c441bb64def2f

增加Label显示标题
https://github.com/TeaAndCoffeeParty/android_practice/commit/4bce5102e813eb7026276211a83fb2bfa45c45e8

然后给Toolbar增加Action按钮
https://github.com/TeaAndCoffeeParty/android_practice/commit/d51241dde601677227d93c1c1a65c69f33e72fb0

showAsAction主要有以下几种值可选:
always表示永远显示在Toolbar中,如果屏幕空间不够则不显示;
ifRoom表示屏幕空间足够的情况下显示在Toolbar中,不够的话就显示在菜单当中;
never则表示永远显示在菜单当中。

滑动菜单

在这里插入图片描述

Drawer Layout

在主屏幕左边可以滑出一个菜单,这样既节省了空间,也实现了非常好的效果。这是Material Design推荐的做法。
如果自己去实现,难度很大。google直接写好了控件,只需要使用它就行了。

Drawer layout是一个布局,在布局中允许放入两个直接子控件:
一个用于显示主程序中的内容
一个用于显示滑动菜单中的内容

https://github.com/TeaAndCoffeeParty/android_practice/commit/81aee6c6675904d4f9ccb01898c01f3df5d03a2a

这里最外层使用了supportv4提供的drawerlayout,放置了两个控件,一个时framelayout用于显示主程序,另一个时TextView用于显示滑动菜单中的内容。这只是简单的示例,其实换成其他的都可以。
但是第二个控件的layout_gravity属性必须是指定的,因为需要告诉drawer layout从哪里划出菜单。start在不同的语系里会表示左边或者右边。

只是稍微改动了一下,就有不错的效果了。
接下来在toolbar的左边新增一个按钮,让他能显示滑动菜单,防止用户不知道左边可以拖出菜单

https://github.com/TeaAndCoffeeParty/android_practice/commit/df2107e6c32c312dc7adfa3c5ddcf2444e17a3d5

使用supportActionBar获取toobar,然后调用setDisplayHomeAsUpEnabled开启最左侧的按钮。最左侧的按钮就是home。
并且在toolbar的click信号中添加触发滑动菜单的按钮。注意openDrawer需要传入一个layout_grivity的参数。为了保证和xml一致,我们传入GravityCompat.START

Navgation View

滑动菜单的内容有点丑陋,使用NavgationView可以优化它。

  1. 首先需要在app/build.gradle里引入需要的苦
  2. 创建nav_menu.xml文件,并添加一系列的控件内容
  3. 创建nav_header.xml,来显示menu菜单和个人信息
  4. 在main_activity.xml里替换textView
    https://github.com/TeaAndCoffeeParty/android_practice/commit/73caf17906158abc14262edc0dd8541a5a63354a
  5. 添加点击时间触发动作
    https://github.com/TeaAndCoffeeParty/android_practice/commit/45c56d9c8fd219c9379f676ab69a2ea9f5dfed39

悬浮按钮和可交互提示

FloatingActionButton

在Framelayout里添加一个floatingActionButton并放在屏幕的最右下角
https://github.com/TeaAndCoffeeParty/android_practice/commit/e1bd140309b2a14a5ba2a59455ac33192d72a9f9

使用app:elevation="8dp"来添加阴影,数字越大光照越高,阴影也就越大,颜色深度也越深。
https://github.com/TeaAndCoffeeParty/android_practice/commit/a04298930a83c3577bb73425e1ea8287bc4c84e0

给floatingActionButton添加触发事件
https://github.com/TeaAndCoffeeParty/android_practice/commit/456d1b938a2830a89f595473784572bf445f61b0

Snackbar

相比于Toast可以使用SnackBar扩展它,相比于Toast只能告诉用户发生了什么。SnakBar可以有一个交互按钮,当用户点击交互按钮的时候,可以触发某些动作。比如如果误删了某个文件,可以按下Undo来撤销这个操作。

用法也非常简单,使用时需要传入view,只要是当前布局的view就行。Snackbar会自动找到当前最外层的布局,第二个参数是显示的内容,第三个参数是显示的时长。
https://github.com/TeaAndCoffeeParty/android_practice/commit/12d602bf2089c07eb15fee288963262d55b565dd

目前有一个bug,就是悬浮的按钮被提示挡住了,使用coordinate layout可以避免这个问题

coordinate layout

coordinate layout是加强版的framelayout,这个布局也是desig support库提供的。
在普通情况下,它和Frame Layout是一样的,不过它可以监听所有子控件的事件,自动帮我们作出最优的响应
当coordinate layout监听到snackbar的弹出消息时,它会自动把floating action bar上移从而确保不会被遮挡,改动也很简单
https://github.com/TeaAndCoffeeParty/android_practice/commit/833737d35eccf54996f93019df9d92e6a17f45f7

卡片式布局

MaterialCardView

MaterialCardView是用于实现卡片式布局效果的重要空间,由Material库提供。
MaterialCardView也是一个FrameLayout,只是额外提供了圆角和阴影等效果,看上去会有立体的感觉。

  1. 在app/build.gradle文件中声明库的依赖,是添加了Glide库的依赖
    https://github.com/TeaAndCoffeeParty/android_practice/commit/a9c5a97c57e5b9cee9659bfa6815a9ad1f5ed7c3
  2. 修改activity_main.xml中的代码,在CoordinatorLayout中添加了一个RecyclerView,给它指定一个id,然后将宽度和高度都设置为match_parent,这样RecyclerView就占满了整个布局的空间。
    https://github.com/TeaAndCoffeeParty/android_practice/commit/3b0061c666a8a55e63626b970062b87dbf535a04
  3. 定义一个实体类Fruit,name表示水果的名字,imageId表示水果对应图片的资源id
  4. 为RecyclerView的子项指定一个我们自定义的布局,在layout目录下新建fruit_item.xml
  5. 为RecyclerView准备一个适配器,新建FruitAdapter类,让这个适配器继承自RecyclerView.Adapter,并将泛型指定为FruitAdapter.ViewHolder
  6. 修改MainActivity中的代码,定义了一个水果集合,集合里面存放了很多个Fruit的实例,每个实例都代表一种水果。然后在initFruits()方法中,先是清空了一下fruitList中的数据,接着使用一个随机函数,从刚才定义的Fruit数组中随机挑选一个水果放入fruitList当中,这样每次打开程序看到的水果数据都会是不同的。另外,为了让界面上的数据多一些,这里使用了repeat()函数,随机挑选50个水果
    https://github.com/TeaAndCoffeeParty/android_practice/commit/99769bedc2364bae758bd2a32058d90f2a4efdd9

AppBarLayout
我们的Toolbar被RecyclerView给挡住了,需要借助另外一个工具——AppBarLayout
CoordinatorLayout就是一个加强版的FrameLayout,那么FrameLayout中的所有控件在不进行明确定位的情况下,默认都会摆放在布局的左上角,从而产生了遮挡的现象。

使用Material库中提供的另外一个工具——AppBarLayout。AppBarLayout实际上是一个垂直方向的LinearLayout,它在内部做了很多滚动事件的封装,并应用了一些Material Design的设计理念。

怎样使用AppBarLayout才能解决前面的遮挡问题呢?其实只需要两步就可以了

  1. 第一步将Toolbar嵌套到AppBarLayout中
    https://github.com/TeaAndCoffeeParty/android_practice/commit/c0aca1b570fae7c34a2b594997ae3359c9ece0df
  2. 第二步给RecyclerView指定一个布局行为。
    https://github.com/TeaAndCoffeeParty/android_practice/commit/812c7632f67d881f1cdc156c008a90d59feddfd2

下拉刷新

SwipeRefreshLayout就是用于实现下拉刷新功能的核心类,我们把想要实现下拉刷新功能的控件放置到SwipeRefreshLayout中,就可以迅速让这个控件支持下拉刷新。

  1. 使用SwipeRefreshLayout之前首先需要在app/build.gradle文件中添加依赖
  2. 修改activity_main.xml中的代码,在RecyclerView的外面又嵌套了一层SwipeRefreshLayout,这样RecyclerView就自动拥有下拉刷新功能了。
  3. 修改MainActivity中的代码,在代码中处理具体的刷新逻辑才行。
    https://github.com/TeaAndCoffeeParty/android_practice/commit/2d883dec1a5342169514c66a4f0cc59c7bd6b0cd

可折叠式标题栏

实现一个可折叠式标题栏的效果,这需要借助CollapsingToolbarLayout这个工具

CollapsingToolbarLayout
CollapsingToolbarLayout是一个作用于Toolbar基础之上的布局,它也是由Material库提供的。

首先我们需要一个额外的Activity作为水果的详情展示界面,右击com.example.materialtest包→New→Activity→Empty Activity,创建一个FruitActivity,并将布局名指定成activity_fruit.xml,然后我们开始编写水果详情展示界面的布局。
activity_fruit.xml中的内容主要分为两部分,一个是水果标题栏,一个是水果内容详情

  1. 首先实现标题栏部分,这里使用CoordinatorLayout作为最外层布局
  2. 接着我在CoordinatorLayout中嵌套一个AppBarLayout
  3. 接下来在AppBarLayout中再嵌套一个CollapsingToolbarLayout
  4. 接下来在CollapsingToolbarLayout中定义标题栏的具体内容
  5. 继续修改activity_fruit.xml中的代码,水果内容详情的最外层布局使用了一个NestedScrollView。不管是ScrollView还是NestedScrollView,它们的内部都只允许存在一个直接子布局。
  6. 通常会先嵌套一个LinearLayout,然后再在LinearLayout中放入具体的内容就可以了
  7. 接下来在LinearLayout中放入具体的内容,这里我准备使用一个TextView来显示水果的内容详情,并将TextView放在一个卡片式布局当中
  8. 还可以在界面上再添加一个悬浮按钮。
  9. 界面完成了之后,接下来我们开始编写功能逻辑,修改FruitActivity中的代码。在onCreate()方法中,我们通过Intent获取了传入的水果名和水果图片的资源id。接着使用了Toolbar的标准用法,将它作为ActionBar显示,并启用Home按钮。由于Home按钮的默认图标就是一个返回箭头,这正是我们所期望的,因此就不用额外设置别的图标了。
  10. 接下来开始填充界面上的内容,调用CollapsingToolbarLayout的setTitle()方法,将水果名设置成当前界面的标题,然后使用Glide加载传入的水果图片,并设置到标题栏的ImageView上面。接着需要填充水果的内容详情,由于这只是一个示例程序,并不需要什么真实的数据,所以我使用了一个generateFruitContent()方法将水果名循环拼接500次,从而生成了一个比较长的字符串,将它设置到了TextView上面。
  11. 最后,我们在onOptionsItemSelected()方法中处理了Home按钮的点击事件,当点击这个按钮时,就调用finish()方法关闭当前的Activity,从而返回上一个Activity
  12. 处理RecyclerView的点击事件,不然的话,我们根本就无法打开FruitActivity。修改FruitAdapter中的代码
    https://github.com/TeaAndCoffeeParty/android_practice/commit/11d7507f2671a8bca6c28240685a24ed05a4c77e

充分利用系统状态栏空间

  1. 需要借助android:fitsSystemWindows这个属性来实现。在CoordinatorLayout、AppBarLayout、CollapsingToolbarLayout这种嵌套结构的
    布局中,将控件的android:fitsSystemWindows属性指定成true,就表示该控件会出现在系统状态栏里。对应到我们的程序,那就是水果标题栏中的ImageView应该设置这个属性了。
    不过只给ImageView设置这个属性是没有用的,我们必须将ImageView布局结构中的所有父布局都设置上这个属性才可以,修改activity_fruit.xml中的代码。
  2. 即使我们将android:fitsSystemWindows属性都设置好了也没有用,因为还必须在程序的主题中将状态栏颜色指定成透明色才行。指定成透明色的方法很简单,在主题中将android:statusBarColor属性的值指定成@android:color/transparent就可以了。
  3. 打开res/values/styles.xml文件,对主题的内容进行修改
    https://github.com/TeaAndCoffeeParty/android_practice/commit/0856abf7dac525c13b72703ef3d97fbc702e99e2

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

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

相关文章

【C++航海王:追寻罗杰的编程之路】异常——错误处理方式之一

目录 引言 1 -> C语言传统的处理错误的方式 2 -> C异常概念 3 -> 异常的使用 3.1 -> 异常的抛出和捕获 3.2 -> 异常的重新抛出 3.3 -> 异常规范 4 -> 自定义异常体系 5 -> C标准库的异常体系 6 -> 异常的优缺点 引言 在C编程中&#xff…

《剑指 Offer》专项突破版 - 面试题 110 : 所有路径(C++ 实现)

题目链接&#xff1a;所有路径 题目&#xff1a; 一个有向无环图由 n 个节点&#xff08;标号从 0 到 n - 1&#xff0c;n > 2&#xff09;组成&#xff0c;请找出从节点 0 到节点 n - 1 的所有路径。图用一个数组 graph 表示&#xff0c;数组的 graph[i] 包含所有从节点 …

javaWeb项目-游泳馆管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、SSM框架 开发信息…

机器学习实验------决策树

第1关&#xff1a;什么是决策树 任务描述 本关任务&#xff1a;根据本节课所学知识完成本关所设置的选择题。 第2关&#xff1a;信息熵与信息增益 任务描述 本关任务&#xff1a;掌握什么是信息增益&#xff0c;完成计算信息增益的程序设计。 import numpy as npdef calcIn…

3d视图模型乱了怎么调?---模大狮模型网

在进行3D建模时&#xff0c;有时候您可能会遇到视图模型混乱的情况。这可能是由于模型结构问题、导入导出错误或编辑操作不当等原因造成的。混乱的模型不仅影响工作效率&#xff0c;还可能导致渲染结果不理想。本文将介绍六种有效的方法来调整混乱的3D视图模型&#xff0c;帮助…

编程新手必看,Python3中函数知识点及语法学习总结(18)

介绍&#xff1a; Python3中的函数是组织好的、可重复使用的代码段&#xff0c;用于实现单一或相关联的功能。 以下是Python3中函数的一些基本介绍&#xff1a; 函数定义&#xff1a;在Python中&#xff0c;可以通过def关键字来定义一个函数。函数定义后&#xff0c;可以多次调…

从建表语句带你学习doris_表索引

1、doris建表概述 1.1、doris建表模板 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [DATABASE.]table_name (column_definition1[,column_deinition2,......][,index_definition1,[,index_definition2,]] ) [ENGINE [olap|mysql|broker|hive]] [key_desc] [COMMENT "tabl…

【Shell语言学堂】sed命令最全详解

三剑客之sed linux sed命令详解1.简介2.定址3.sed选项4.正则表达式元字符5.具体应用1、行打印2、替换指定文本3、插入文本行&#xff0c;追加文本行4、sed命令的删除功能5、其他命令6、sed 的分组替换功能7、sed -r或者sed -E linux sed命令详解 CSDN划过手的泪滴t 1.简介 se…

L2-1 堆宝塔分数

本题链接&#xff1a;PTA | 程序设计类实验辅助教学平台 题目&#xff1a; 样例&#xff1a; 输入 11 10 8 9 5 12 11 4 3 1 9 15 输出 4 5 思路&#xff1a; 这是一道模拟题&#xff0c;需要有耐心读题&#xff0c;跟着题目走一遍&#xff0c;就可以了。 代码详解如下&…

润乾报表平台 InputServlet 任意文件读取漏洞复现

0x01 产品简介 润乾报表是一个纯JAVA的企业级报表工具&#xff0c;支持对J2EE系统的嵌入式部署&#xff0c;无缝集成。服务器端支持各种常见的操作系统&#xff0c;支持各种常见的关系数据库和各类J2 EE的应用服务器&#xff0c;客户端采用标准纯html方式展现&#xff0c;支持…

基于SSM的游戏攻略管理系统

游戏攻略管理系统的构建与实现 一、系统概述二、系统架构与技术选型三、系统功能模块四、系统特点五、总结与展望 随着网络游戏的普及和发展&#xff0c;游戏攻略成为玩家们提升游戏技能、了解游戏机制的重要途径。为了更好地满足玩家需求&#xff0c;提高游戏攻略的管理效率和…

Xinstall:实现注册后自动绑定,提升用户体验

在移动互联网时代&#xff0c;App的注册与绑定流程对于用户体验至关重要。繁琐的注册步骤和手动绑定操作往往会让用户望而却步&#xff0c;导致用户流失。为了解决这一问题&#xff0c;Xinstall品牌推出了注册后自动绑定功能&#xff0c;极大提升了用户体验。 Xinstall的自动…

优惠券布局的最终方案------css属性mask

先贴图&#xff1a; 以上这些都是通过mask去实现出来&#xff1a; <!DOCTYPE html><html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&g…

实战小项目 | ESP32-S3和ESP32-C3通过ESP-Mesh-Lite组网 温湿度传感器案例

传统Wi-Fi网络所有终端设备都需要直接与路由器相连&#xff0c;这使得Wi-Fi的覆盖区域受到路由器位置的限制&#xff0c;可接入终端设备的数量也受到路由器容量的限制。而乐鑫ESP-Mesh-Lite Wi-Fi组网方案&#xff0c;所有终端设备都可以与相邻设备连接&#xff0c;摆脱了对路由…

升级多款教育行业解决方案 星辰天合推动高校高质量发展

4 月 12-14 日&#xff0c;由江苏省高校教育信息化研究会网络信息管理专业委员&#xff08;以下简称&#xff1a;江苏高校网委会&#xff09;主办&#xff0c;河海大学网络安全与信息化办公室、常州大学信息化建设与管理处联合承办的 2024 研讨会暨学术年会在江苏金坛召开。本次…

IDjpg Ai:开启艺术风格的无限可能

在这个充满创意的时代&#xff0c;每个人都可以成为艺术家。IDjpg Ai&#xff0c;一款由人工智能AI模型驱动的图片转换工具&#xff0c;让您的照片瞬间变身为3D、卡通、线稿、动漫、电影等无限种艺术风格。这不仅仅是一款软件&#xff0c;它是您通往创意宇宙的钥匙。 一键转换&…

竞技游戏新纪元:如何打造满足现代玩家需求的极致体验?

文章目录 一、现代玩家需求分析二、以玩家体验为核心的游戏设计三、个性化与定制化服务四、强化社交互动与社区建设五、持续更新与优化《游戏力&#xff1a;竞技游戏设计实战教程》亮点编辑推荐内容简介目录获取方式 随着科技的飞速发展和游戏产业的不断壮大&#xff0c;现代玩…

代码随想录算法训练营第四十一天| 343. 整数拆分,96.不同的二叉搜索树

题目与题解 343. 整数拆分 题目链接&#xff1a;343. 整数拆分 代码随想录题解&#xff1a;343. 整数拆分 视频讲解&#xff1a;动态规划&#xff0c;本题关键在于理解递推公式&#xff01;| LeetCode&#xff1a;343. 整数拆分_哔哩哔哩_bilibili 解题思路&#xff1a; 一眼懵…

Banana Pi开源社区推出BPI-5202开发板,国产龙芯Loongson 2K1000LA

BPI-5202开发板&#xff0c;国产龙芯Loongson 2K1000LA BPI-5202作为单纯的嵌入式通用控制器软硬件开发平台&#xff0c;采用龙芯2K1000LA芯片设计&#xff0c;基本配置中有2个独立MAC以太网端口、2个RS485端口1个RS232端口2个CAN2.0端口&#xff0c;配置灵活&#xff0c;广泛适…

SQL注入利用学习 - 延时盲注

延时盲注原理 无法利用页面显示结果判断SQL注入是否执行成功&#xff0c;此时可以利用 SQL语句执行的延时 判断SQL是 否执行成功。 只要可以执行延时&#xff0c;那么就可以利用该注入技术。 sql时间类型的盲注本质是利用插入的SQL语句执行造成时间延迟&#xff0c;插入的SQ…