Android-->自定义ViewGroup, 银行卡片布局
来源:互联网 发布:安装ug时java有什么用 编辑:程序博客网 时间:2024/06/05 00:41
首先了解下, 自定义View的三部曲.
1:onMeasure方法
此方法主要目的, 就是根据xml的 android:layout_width="wrap_content"
android:layout_height="wrap_content"
wrap_content
match_parent
这2个属性, 来确定测量自身的大小.
当然, 这2个值, 只是parent
告诉你, 需要按照此规则来测量, 如果你是一个坏孩子, 那么可以无视测量规则, 任意设置一个宽度和高度, 比如: setMeasuredDimension(1万, 2万)
就是如此简单;
2:onLayout方法
如果你是自定义View, 此方法可以不必override
如果你是自定义的ViewGroup, 那么就必须override
, 此方法的目的就是由你决定child view在界面上的位置.
3:onDraw方法
在这个方法里面, 你可以展开你天才般的做图功能, 想画啥就画啥. 美美的view, 就这样出来了.
友情提示:如果你是自定义的ViewGroup, 还需要调用setWillNotDraw(false)
方法, 否则onDraw
方法不会执行哦
本文由于是自定义的ViewGroup, 所以重点是在onLayout方法里面;
不着急, 分析一波:
此需求, 说难不难, 说易不易.
易: 因为只要重写onLayout方法就行.
难: 你需要有一套规则限制onLayout方法.(如果你的规则很简单, 那么相当容易. 反之…)
1: 在默认情况下, 所有卡片按照层级和一定的偏移距离进行布局(相当于FrameLayout+marginTop的组合)
2: 当手指往下滑动的时候, 最顶层的卡片优先滑动到一定距离, 然后倒数第二层的卡片再滑动.以此类推
3: 当手指快速滑动的时候, 根据滑动方向,进行fling操作, 卡片自动折叠或展开.
需求就这么点.
这里说一下我相当的思路, 如果你有更简洁的思路, 欢迎交流.
假设卡片的高度(cardHeight)一定, 宽度一定. 相邻之间卡片默认状态时偏移的高度(offsetTop);
这种情况下, onLayout之后, 卡片的布局就是默认看到的状态了.
@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) { int top = 0; int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { View childAt = getChildAt(i); int layoutTop = top + offsetTop; childAt.layout(getPaddingLeft(), layoutTop, getMeasuredWidth() - getPaddingRight(), layoutTop + childAt.getMeasuredHeight()); top += offsetTop; }}
这样就完成了第一阶段了.
当手指滑动的时候, 比如向下滑动了dy.
我这里的思路就是, 把dy平分给每一个卡片的top上. 并且显示每一个卡片允许分到的最大top值;
这样, 在onLayout的时候, 加上这个top就行了.
//翻译成代码, 就是 /** * 默认状态是, 每个View之间的间隔 */ public final int DEFAULT_MIN_OFFSET = (int) (40 * density()); /** * 每一个View, 最多可以消耗多少距离 */ public final int DEFAULT_MAX_OFFSET = (int) (80 * density()); private void refreshLayout() { int top = getPaddingTop(); int childCount = getChildCount(); //计算每个item view,能够消耗的高度 for (int i = 0; i < childCount; i++) { View childAt = getChildAt(i); int needOffset = (childCount - 1 - i) * DEFAULT_MAX_OFFSET; if (currentOffset > needOffset) { needOffset = Math.min(currentOffset - needOffset, DEFAULT_MAX_OFFSET); if (i == 0) { //如果是第一个item, 限制能够消耗的高度 //needOffset = Math.min(DEFAULT_MIN_OFFSET, needOffset); needOffset = 0; } } else { needOffset = 0; } childAt.setTag(needOffset); } //开始布局item for (int i = 0; i < childCount; i++) { View childAt = getChildAt(i); int offsetTop = getViewTop(childAt); int layoutTop = top + offsetTop; childAt.layout(getPaddingLeft(), layoutTop, getMeasuredWidth() - getPaddingRight(), layoutTop + childAt.getMeasuredHeight()); top += DEFAULT_MIN_OFFSET + offsetTop; } }
联系作者
请使用QQ扫码加群, 小伙伴们在等着你哦!
关注我的公众号, 每天都能一起玩耍哦!
- Android-->自定义ViewGroup, 银行卡片布局
- Android自定义布局:ViewGroup
- 自定义viewGroup+ViewDragHelper: 仿探探主页卡片式滑动,层叠布局
- Android自定义viewgroup实现自定义布局
- android自定义viewgroup实现等分格子布局
- android自定义viewgroup实现等分格子布局
- android自定义viewgroup实现等分格子布局
- Android 自定义ViewGroup 实现流式布局
- Android自定义ViewGroup实现流式布局
- android自定义viewgroup实现等分格子布局
- Android自定义ViewGroup实战-----流式布局
- android 继承ViewGroup实现自定义布局
- Android 实现卡片布局
- android卡片式布局
- Android自定义View--用ViewGroup打造一个3D堆叠卡片容器
- Android 自定义ViewGroup 实现FlowLayout,动态添加布局
- Android自定义ViewGroup(四、打造自己的布局容器)
- android 实现FlowLayout 流线布局(自定义ViewGroup)
- 关于mysql错误:Subquery returns more than 1 row
- FreeRTOS之源代码文件预览
- 弦图与区间图总结
- Python 星号表达式(starred expression)
- MS Office 漏洞CVE-2017-8759复现
- Android-->自定义ViewGroup, 银行卡片布局
- 802.11协议精读9:初探节能模式(PS mode)与缓存机制
- idea解决dubplicate class found the file
- solr6.6教程-从mysql数据库中导入数据(三)
- SDN测试工具-iperf、Cbench、sFlow(缺图)
- Eclipse 修改所有文件默认编码为UTF-8
- mybatis在xml文件中处理大于号小于号的方法
- Linux下重要文件不小心被删除?别着急,看这里!
- poj 2029 二维树状数组入门