这里有新鲜出炉的精品教程,程序狗速度看过来!
Android 是一种基于 Linux 的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由 Google 公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用 "安卓" 或 "安致"。
这篇文章主要为大家详细介绍了 android 流式布局的 onLayout() 方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
在上一篇中及就写了自定义 view 中的 onMeausre()和 onDraw()两个方法。在这里就用简单的流式布局来介绍一下 onLayout()方法。
在 onLayout 方法中有四个参数,我画了一个简单的图来分清楚值哪里。
好啦,现在就直接看代码吧。
FlowLayout.Java
- package com.example.my_view;
- import android.content.Context;
- import android.util.AttributeSet;
- import android.view.View;
- import android.view.ViewGroup;
- /**
- * 自定义布局 流布局
- */
- public class FlowLayout extends ViewGroup {
- public FlowLayout(Context context) {
- super(context);
- }
- public FlowLayout(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
- /**
- *
- * @param changed
- * @param l 左
- * @param t 上
- * @param r 右
- * @param b 下
- */
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- //获得子控件的数量
- int childCount = getChildCount();
- //当前子控件的左边坐标
- int cl = 0;
- //当前子控件的上边坐标
- int ct = 0;
- //ViewGroup整体宽度
- int width = r - l;
- //行高
- int lineHeight = 0;
- //遍历所有子控件
- for(int i = 0; i < childCount; i++){
- //获取当前控件
- View childAt = getChildAt(i);
- //获取宽度
- int cw = childAt.getMeasuredWidth();
- //获取高度
- int ch = childAt.getMeasuredHeight();
- //当前控件右边
- int cr = cl + cw;
- //当前控件下边
- int cb = ct + ch;
- //判断是否换行
- if(cr > width){
- //如果换行重新计算上下左右地值
- cl = 0;
- cr = cl + cw;
- ct += lineHeight;
- cb = ct + ch;
- //换行后,第一个控件作为最大行高
- lineHeight = ch;
- }else{
- //如果不换行,需要计算最大高度
- lineHeight = Math.max(lineHeight,ch);
- }
- childAt.layout(cl,ct,cr,cb);
- //横向向后移动一个,前面控件的右边作为后面控件的左边
- cl = cr;
- }
- }
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- //测量所有子控件
- measureChildren(widthMeasureSpec, heightMeasureSpec);
- }
- }
activity_main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <com.example.my_view.FlowLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context="com.example.my_view.MainActivity">
- <!--
- <com.example.my_view.Counter
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- app:number="10"
- app:bgColor="#ff002b"
- app:textColor="#0fd444"/>-->
- <!--<TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="我在自定义布局的下面"/>-->
- <Button
- android:layout_width="200dp"
- android:layout_height="50dp"
- android:text="button1"/>
- <Button
- android:layout_width="100dp"
- android:layout_height="100dp"
- android:text="button2"/>
- <Button
- android:layout_width="180dp"
- android:layout_height="60dp"
- android:text="button3"/>
- <Button
- android:layout_width="100dp"
- android:layout_height="50dp"
- android:text="button4"/>
- <Button
- android:layout_width="80dp"
- android:layout_height="100dp"
- android:text="button5"/>
- <Button
- android:layout_width="100dp"
- android:layout_height="50dp"
- android:text="button6"/>
- <Button
- android:layout_width="120dp"
- android:layout_height="70dp"
- android:text="button7"/>
- <Button
- android:layout_width="100dp"
- android:layout_height="50dp"
- android:text="button8"/>
- </com.example.my_view.FlowLayout>
效果图:
来源: http://www.phperz.com/article/17/0707/336138.html