博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android自定义控件笔记
阅读量:2060 次
发布时间:2019-04-29

本文共 2191 字,大约阅读时间需要 7 分钟。

android系统提供的控件有时候满足不了我们的需求 ,这个时候我们就可以通过自定义控件来实现自己想要的控件样式和功能,下面把自己记录的自定义控件的一些笔记拿出来给大家参考:

自定义控件有组合自定义控件和单个的自定义控件,组合自定义控件就是一个容器里面包含一个TextView和一个EditText,容器可以是LinearLayout或者RelativeLayout,或者自己自定义的,一般就是继承ViewGroup,在代码中根据自己容器的不同来继承:

比如你选择组合容器是LinearLayout,那么代码中继承LinearLayout,如果是RelativeLayout那就继承RelativeLayout,如果是自己来自定义那就直接继承ViewGroup。

比如这里我直接继承ViewGroup,

public class FlowLayout extends ViewGroup
继承之后,我们就需要实现构造方法,一般一个参数的构造方法是当你在代码中直接new的时候调用

public FlowLayout(Context context) {	super.(context);	}
两个参数的构造方法,这个是在xml创建但是没有指定style的时候被调用
public FlowLayout(Context context, AttributeSet attrs) 
三个参数的构造方法是在xml创建,并且指定了style的时候被调用

public FlowLayout(Context context, AttributeSet attrs, int defStyle)
一般我们都在第二个构造方法中获取xml文件上定义的属性
具体的大家可以看我的另外一篇文章,里面有说明怎么通过xml来自定义控件属性:

http://blog.csdn.net/fanxl10/article/details/41863217

今天要说的是自定义控件的onMeasure和onLayout方法的应用,

控件一般需要进行绘制,那么onMeasure方法就是控件绘制的时候进行控件测量的方法,测量每个控件的宽高

测量方法有三种,分别是AT_MOST 一般是wrap_contetn的时候进行的测量; 

EXACITY 一般设定了固定的值,如100dp 或者是match_parent时候测量; 

另外一个是UNSPECIFIED 子View想要多大就多少,这个很少见;

然后我们就可以获取模式和尺寸

int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);  //获取控件宽度尺寸int modeWidth = MeasureSpec.getMode(heightMeasureSpec); //获取控件宽度模式		int sizeHeight = MeasureSpec.getSize(heightMeasureSpec); //获取控件高度尺寸int modeHeight = MeasureSpec.getMode(heightMeasureSpec); //获取控件高度模式
如果是EXACITY的,那么上面就已经获取到了尺寸,我们就可以直接使用,如果AT_MOST,那么我们还需要自己进行计算;

如果里面有子view的话,我们就需要根据子view的宽高设置父控件;

//Wrap_content 这个就需要自己去计算, 如果是EXACITY,上面的方法就可以获取到int width = 0;int height = 0;
}}
//得到内部元素的个数int count = getChildCount();for (int i = 0; i < count; i++) {	View child = getChildAt(i);	//测量子View的宽高	measureChild(child, widthMeasureSpec, heightMeasureSpec);				MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();				int childWidth = child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin;	int childHeight = child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;
	width += childWidth;
	height = childHeight;
}

 获取到宽高之后,我们就根据获取到的模式进行判断,最终把宽高赋值给控件: 

setMeasuredDimension(modeWidth==MeasureSpec.AT_MOST?width+getPaddingLeft()+getPaddingRight():sizeWidth, 				modeHeight==MeasureSpec.AT_MOST?height+getPaddingTop()+getPaddingBottom():sizeHeight);
最后就是在onLayout里面进行布局

你可能感兴趣的文章
详细介绍Oracle sqlplus命令
查看>>
几个基本的 Sql Plus 命令 和 例子
查看>>
PLSQL单行函数和组函数详解
查看>>
Oracle PL/SQL语言初级教程之异常处理
查看>>
Oracle PL/SQL语言初级教程之游标
查看>>
Oracle PL/SQL语言初级教程之操作和控制语言
查看>>
Oracle PL/SQL语言初级教程之过程和函数
查看>>
Oracle PL/SQL语言初级教程之表和视图
查看>>
Oracle PL/SQL语言初级教程之完整性约束
查看>>
PL/SQL学习笔记
查看>>
如何分析SQL语句
查看>>
结构化查询语言(SQL)原理
查看>>
SQL教程之嵌套SELECT语句
查看>>
几个简单的SQL例子
查看>>
日本語の記号の読み方
查看>>
计算机英语编程中一些单词
查看>>
JavaScript 经典例子
查看>>
判断数据的JS代码
查看>>
js按键事件说明
查看>>
AJAX 初次体验!推荐刚学看这个满好的!
查看>>