项目需求:要求在屏幕上显示十个头像,并且不重叠。
先给大家看一下效果:
技术分析: 很明显这次头像的显示不是列表,所以不能用RecyclerView这样的控件实现了。所以只能自己动手来打造一个控件了——自定义Layout
思路 : 1、创建MyViewLayout 继承 LinearLayout
2、重写onMeasure方法 —— 获取控件的宽和高
3、重写onLayout方法 (重点) —— 用来摆放子View的位置(头像的位置)
4、摆放子View的方法: —— X、Y随机一点当做子View的左上顶点,然后通过得到子View的宽和高去找到子View的右下点(通过子View.layout(左上右下) 方法设置子View的位置)
核心算法 : 计算摆放任意头像不重叠的思路
1、新建一个集合List<Point>,用来存储不重叠的坐标。(摆放第一个View把坐标放到list中,摆放第二个要跟集合里面比较有没有重叠,有重新找坐标比较,没有继续
把第二个放到list中,然后摆放第三个比较,一次类推)。
2、重叠的条件 : (Math.abs(x2 - x1) <= measuredWidth && Math.abs(y2 - y1) <= measuredHeight) 表示重叠
下面就是代码:
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); /** * 获得此ViewGroup上级容器为其推荐的宽和高,以及计算模式 */ sizeWidth = MeasureSpec.getSize(widthMeasureSpec); sizeHeight = MeasureSpec.getSize(heightMeasureSpec); // 计算出所有的childView的宽和高 measureChildren(widthMeasureSpec, heightMeasureSpec); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { //得到子View