Android自定义控件--流式布局(FlowLayout)--自动适配

原文链接:

FlowLayout流式布局


在android开发中,随着开发需求的不断提升,android原生的控件在很大程度上已不能满足开发者以及用户的需求,为了更好的增加用户体验,更有利的维护UI,在一个完整的程序中,自定义控件往往是不可或缺的知识,我根据自己的学习经验,现在对自定义控件的分类,以及自定义控件的流程,然后根据FlowLayout案例进行简单分析

一.自定义控件的流程

//1.第一步,测量
    onMeasure();
//2.第二步,布局
    onLayout();
//3.第三部,绘制
    onDraw()

二.自定义控件的分类

  1. 继承View重写onDraw方法 

        用于实现一些不规则的效果,不方便通过组合的方式达到,需要通过静态或者动态的显示一些不规则的图形的,需要通过绘制的方式实现,这种方法需要手动的填写支持padding和wrap_content方法  
    
  2. 继承ViewGroup派生特殊的Layout

    这也是我们这此文章介绍的一种自定义布局,即除LinearLayout,RelativeLayout,FrameLayout这几种系统的布局以外的布局,需要稍微的处理元素和子元素的测量和绘制过程,
    
  3. 继承特定的View(比如TextView)

      这种方法用来扩展已经有的View的功能,这种方法相对比较简单
    
  4. 继承特定的ViewGroup(比如LinearLayout)

     这种方法比较普遍,当某种效果比较像很多种View组合在一起的时候,可以采用这种方法来实现,采用这种方法不需要自己处理ViewGroup的测量和布局这两个过程.
    
    上次的文章中介绍了一个PullRefresh(下拉刷新,与加载更多按钮)
    

    下拉刷新,加载很多的地址PullRefresh

三.此次的布局控件时第二种类型,继承ViewGrop派生特殊的Layout

(一).具体作用

    FlowLayout是一种流式布局,主要根据自控件的加入顺序进行依次排序,当每一行排满时,进行换行操作,然后根据每一行的未使用空间对View进行屏幕的适配,实例图如下图

这里写图片描述

(二).原理分析

自定义流式布局的原理大概分为以下几点

这里写图片描述

(三).具体的代码实现

第一步.首先需要先自定义一个类然后继承ViewGroup
public class FlowLayout extends ViewGroup {
   
    public FlowLayout(Context context) {
        super(context);
    }
    public FlowLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public FlowLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    //onMeasure()方法,用于View以及自身的测量,是本次自定义控件需要重写的重要的方法之一,
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
    //onLayout()方法,主要对View进行布局
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
    }
}
第二步.我们现在着手看看onMeasure()方法的实现

1.对ViewGrop进行测量,首先要拿到ViewGrop的尺寸,以及测量模式    

        MeasureSpec.getSize(widthMeasureSpec) - getPaddingLeft() - getPaddingRight();
        MeasureSpec.getSize(heightMeasureSpec) - getPaddingTop() - getPaddingBottom();
        iMeasureSpec.getMode(widthMeasureSpec);
        MeasureSpec.getMode(heightMeasureSpec);

2.对所有的子控件进行遍历测量,根据相同方式拿到每个View的尺寸以及测量模式,按照上面的原理分析进行处理,代码如下

1.计算每一行的已经使用的高度
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值