史上难得的自定义效果——屏幕中随机出来十个头像不重叠

项目需求:要求在屏幕上显示十个头像,并且不重叠。

先给大家看一下效果:



技术分析: 很明显这次头像的显示不是列表,所以不能用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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值