FlowLayout流式布局
在android开发中,随着开发需求的不断提升,android原生的控件在很大程度上已不能满足开发者以及用户的需求,为了更好的增加用户体验,更有利的维护UI,在一个完整的程序中,自定义控件往往是不可或缺的知识,我根据自己的学习经验,现在对自定义控件的分类,以及自定义控件的流程,然后根据FlowLayout案例进行简单分析
一.自定义控件的流程
//1.第一步,测量
onMeasure();
//2.第二步,布局
onLayout();
//3.第三部,绘制
onDraw()
二.自定义控件的分类
继承View重写onDraw方法
用于实现一些不规则的效果,不方便通过组合的方式达到,需要通过静态或者动态的显示一些不规则的图形的,需要通过绘制的方式实现,这种方法需要手动的填写支持padding和wrap_content方法
继承ViewGroup派生特殊的Layout
这也是我们这此文章介绍的一种自定义布局,即除LinearLayout,RelativeLayout,FrameLayout这几种系统的布局以外的布局,需要稍微的处理元素和子元素的测量和绘制过程,
继承特定的View(比如TextView)
这种方法用来扩展已经有的View的功能,这种方法相对比较简单
继承特定的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的尺寸以及测量模式,按照上面的原理分析进行处理,代码如下