11. Location Base Service
获取为主可通过GPS和网络定位的方式,GPS定位准确但在室内信号不好;网络定位根据手机附近的三个基站进行定位,精度一般,但室内可用。后面的实践基于百度地图SDK进行,实现了获取经纬度、具体地址、在地图中实时更新位置。使用时需要注意的任然是权限的静态配置和动态授予。
12. Material Design
Google推荐的android设计理念,提供了一个便于实现这种效果的组件库,后面主要是Material库中封装组件的使用。
12.1 ToolBar
与ActionBar
对比,都可实现自定义标题栏,不过ActionBar
只能位于Activity
顶部,不利于实现Material
效果,官方不推荐使用。ToolBar
继承自前者,更加灵活,可以实现更多效果。
1. 隐藏默认ActionBar
在androidManifest
中指定的@style/AppTheme
中parent
指定了actionBar
的主题,通过指定NoActionBar
隐藏默认actionBar
.
1 | <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> |
需要注意几个属性的意义:
colorPrimary
、colorPrimaryDark
、windowsBackground
、navigationBarColor
表示页面不同位置的颜色。colorAccent
: 这个颜色用于表达强调的意思,比如按钮或者一些控件的选中状态。
2. 自定义ToolBar
通过FrameLayout
来包裹ToolBar
。需要注意,外部指定了light
主题后ToolBar
也是淡色主题,其上的各种元素会自动深色主题(与默认actionBar
不一致),因此指定android:theme
为Dark
,此时弹出元素也会变成深色,因此需要指定app:popupTheme
。
1 | <androidx.appcompat.widget.Toolbar |
然后在MainActivity
中将自定义toobar
设置为actionBar
.
1 | Toolbar toolbar = findViewById(R.id.toolbar); |
3. 定义更多按钮
通过自定义menu
资源,并在其中使用<item>
实现按钮定义。需要注意showAsAction
属性的定义,此属性可指定item
根据屏幕宽度的显示方案,ifRoom
表示有空间才显示,否则会折叠到右侧option
,option
中只显示文字,不显示图标。
然后在mainActivity
中注入自定义menu
,并可通过重写函数onOptionsItemSelected
实现每个按钮点击事件的处理。
1 | public boolean onCreateOptionsMenu(Menu menu) { |
12.2 滑动菜单
从屏幕边缘划出的菜单,可节省页面空间。
1. DrawerLayout 实现主页面和滑动菜单布局
第一个子控件是主页面、第二个子控件是滑动菜单。第二个控件layout_graity
可指定划出位置left
、right
、start
,start
表示根据
2. ToolBar左侧增加导航按钮进入滑动菜单
此方式方便不知道滑动边缘可以出现滑动菜单的用户。需要注意,最左侧导航按钮的的资源id是android.R.id.home
而不是自定义。在onOptionsItemSelected
中处理点击事件。
1 | ActionBar actionBar = getSupportActionBar(); |
3. NavigationView 布局滑动菜单
以用户个人页面为例、自定义header_layout
和menu
,前者可包含头像和基本信息,后者则是菜单列表。头像可以使用开源的de.hdodenhof:circleimageview
实现图片圆形化。
1 | <com.google.android.material.navigation.NavigationView |
然后在activity
实现点击监听器的注册。
1 | // 导航栏 |
12.3 FloatingActionButton和Snackbar
悬浮按钮不属于主界面一部分,通过layout_gravity
指定位置,bottom
表示位于底部,end
表示位于系统语言的末尾。
1 | <com.google.android.material.floatingactionbutton.FloatingActionButton |
然后设置点击事件监听器即可。
1 | // 悬浮按钮 |
Snackbar
Snackbar
与Toast
略不同,允许在其中加入一个按钮便于用户反馈。需要注意第一个参数view
的使用
CoordinatorLayout
上面使用FrameLayout
布局时,位于底部的浮动按钮会被弹出的Snackbar
遮盖,CoordinatorLayout
继承自FrameLayout
且能够监听子元素所有事件以实现避免遮挡。Snackbar
并不是CoordinatorLayout
的子元素,但由于其view
参数是CoordinatorLayout
的子元素,因此可以实现。
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏
扫描二维码,分享此文章