android布局demo
㈠ 【Android进阶】RecyclerView:打造一个悬浮效果的Demo
先欣赏一个效果。
这是一个城市列表,每个城市属于一个省,需要在滑动时让对应省份浮于顶部,随着列表滑动,浮于顶部的省份位置相应调整,实现“顶上去”的视觉效果。
实现思路围绕RecyclerView.ItemDecoration展开。ItemDecoration,字面理解为“Item装饰”。其实,它功能强大,而我们通常仅用它绘制分割线。其实,ItemDecoration不仅能绘制分割线,还拥有更多功能。
查看RecyclerView.ItemDecoration源码(部分)。
其包含了常用方法:RecyclerView的背景、onDraw绘制的内容、Item、onDrawOver绘制的内容。层级关系如下:
一般情况下,分割线绘制如下:
获取当前RecyclerView的Item数量,遍历每个Item,对应位置绘制矩形,完成分割线效果。
打造悬浮效果的实现:
这是一个城市列表,按省份分组,相同城市仅显示一个省份。滑动列表时,省份会浮于顶部。效果如下:
为了实现悬浮效果,在onDrawOver中绘制分组。
通过position对比上一个省份名称,判断当前省份是否为首项。
仅当为首项或新省份时,为悬浮栏预留空间。
通过变量preGroupId和currentGroupId保存当前分组名和上一个分组名。当前Item与上一个Item同组时跳过绘制。代码实现如下:
根据当前Item位置确定分组绘制位置。top设为mGroupHeight和view.getTop()的最大值,确保top不低于mGroupHeight,实现吸顶效果。
当下个分组顶部(当前Item底部近似下个Item顶部)距RecyclerView顶部小于top时,调整当前分组位置,实现在下一个分组上滑时当前分组上移,上一个分组下滑时当前分组下移。
计算baseLine并绘制背景和文字。
至此,带有悬浮功能的列表实现完成。
进阶:利用ItemDecoration实现文字悬浮时,是否还能有更多操作?如添加图标、多个TextView、自定义布局?实现方式类似,仅需在接口中添加获取View的方法。
实现原理与之前相同,由于需要自定义布局,需添加接口的getGroupView方法,用于获取需绘制的分组View,并将其绘制至指定位置。
效果展示如下:
实现详细代码请参阅底部链接。
已封装成库,欢迎提出问题和建议。
具体用法及源码请访问GitHub。
阅读后请点赞,养成习惯,关注公众号“程序猿养成中心”,获取更多干货。此外,Android一线大厂面试完整考点、资料更新在我【GitHub】上,面试有需求的朋友可参考,如对您有帮助,请给予Star支持。
Github链接:https://github.com/733gh/xiongfan
㈡ android一个页面可以有几种布局方法吗
在Android开发中,界面布局是构建用户界面的重要部分。布局类型多样,适用于不同场景。五大常用布局分别为:LinearLayout、FrameLayout、RelativeLayout、AbsoluteLayout、TableLayout。
LinearLayout通过垂直或水平顺序排列子元素,形成界面结构。垂直排列时,形成N行单列结构,水平排列时,形成单行N列结构。构建复杂结构时,通常使用嵌套的LinearLayout。
FrameLayout是最简单的布局方式,整个界面被视为一块空白区域,所有子元素默认置于左上角。后续元素会覆盖前一个元素,实现覆盖效果。此布局方式不常用,因代码较为僵硬,难以适应不同终端。
AbsoluteLayout允许通过设置子元素的坐标位置进行布局,坐标原点位于屏幕左上角。子元素可以相互重叠,但开发中较少使用,因为代码过于固定。
RelativeLayout依据各子元素间的位置关系进行布局,支持通过android:layout_below、android:layout_above等属性指定位置。此布局方式较为灵活,适合复杂界面设计。
TableLayout是LinearLayout的子类,其宽度和高度属性固定为MATCH_PARENT和WRAP_CONTENT。因此,其子元素都为横向排列,宽度和高度一致,类似于表格中的单元格。在TableLayout中,单元格不能跨列,保证布局整齐。
这五大布局各具特色,开发者可根据具体需求选择合适布局方式,构建高效、美观的Android界面。
㈢ android中怎么动态的加载一个布局
由于前段时间项目需要,需要在一个页面上加载根据不同的按钮加载不同的布局页面,当时想到用 tabhot 。不过美工提供的界面图完全用不上tabhot ,所以想到了动态加载的方法来解决这一需求。在这里我整理了一下,写了一个 DEMO 希望大家以后少走点弯路。
首先,我们先把界面的框架图画出来,示意图如下:
㈣ Android 将App的内容延伸到状态栏/导航栏
来自我的CSDN博客: http://blog.csdn.net/dahaohan/article/details/52175190
看过Android的桌面应用都是介样的:
如何让自己的应用也达到这般效果呢?这里就介绍几种常用的方法以及它们之间的区别。
首先展示下此次demo的布局和初始状态:
初始效果图如下:
使用这个方式首先要理解几个概念,窗口层级以及窗口background/窗口透明:
Google在API-19 以及API-21新增对状态栏/导航栏窗口透明和颜色的控制:
对应的在主题内即可控制:
这里首先要明了这里状态栏和导航栏窗口是系统级窗口而Activity对应的时应用窗口,它们属于不同的窗口层级;
然后状态栏/导航栏系统级窗口是在App应用窗口之上,故而Activity应用窗口虽然有整个屏幕的大小,但是可显示内容的区域得除去其上叠加的不透明的窗口区域。详细的窗口计算绘制可参考大神老罗的博文:
Android窗口管理服务WindowManagerService计算Activity窗口大小的过程分析
下面来使用主题控制导航栏/状态栏透明,同时看看上述两种设置透明的方式效果有何不同:
初始桌面和启动Activity效果图:
可以看到虽然导航栏/状态栏透明了,当时应用窗口显示的内容依然只是除去了两个系统窗口之外的区域,并没有衍生到导航栏/状态栏之下。
效果如下:
可以看到已经将应用的内容布局延伸到导航栏/状态栏下方了,来看看关于android:windowTranslucentStatus
android:windowTranslucentNavigation的官方说明看看来理解其与设置color transparent的区别:
根据FLAG的说明,可以看出设置该标志位等同于View申请设置:
PS:从效果图看,虽然布局延伸到状态栏导航栏区域,但是相应的内容“hello world”文字也被状态栏/导航栏遮住了。在布局根视图设置fitsSystemWindows为true可以使得,系统自动为视图添加一个状态栏/导航栏高度的padding:
效果如下:
查看SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 和 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN的说明,可以发现其实还有两个非常接近的FLAG:
根据官方的说明提示,SYSTEM_UI_FLAG_FULLSCREEN / SYSTEM_UI_FLAG_HIDE_NAVIGATION主要用于动态切换隐藏/显示系统导航栏/状态栏;例如书籍阅读应用/视频播放应用等。而像游戏类的全屏应用则推荐使用window flag。
上述的透明导航栏/状态栏等API基本是需要API-19或是API-21才能使用的,这里还有一种API-1的方案能够实现布局内容全屏:
实际上只需要设置FLAG_LAYOUT_NO_LIMITS就足够了;这FLAG是看Android原生的Launcher / Keyguard源码,看到有用到如此设置,其窗口设置具体原理我也没有弄清..... 有大神了解可以指点下。
PS:这个套路下,使用fitsSystemWindows="true"是无效的,智能自己控制号布局位置。