Android自定义控件(一)--View的测量
来源:互联网 发布:opencv 求解基本矩阵 编辑:程序博客网 时间:2024/06/06 08:35
最近也是开始学习自定义控件了,也是一边看一边学一边写,记录下学习过程!!!
先从View的测量开始咯~~
当我们开始绘制一个View的时候,我们要先思考一下,系统绘制是如何绘制出这些View的,我们都知道,我们画图形,就必须知道图形的位置和宽高大小,那么同样,系统在绘制View前也需要对View进行测量,即告诉系统需要绘制多大的View,这就涉及到我们现在要用的一个方法onMeasure()
Android系统提供了一个类---MeasureSpec,通过它来测量View,测量的模式有三种:
EXACTLY:精确模式 当我们将宽度和高度设置成了match_parent或者给定了具体的数值之后,系统使用的是精确模式
AT_MOST:最大值模式 当我们将宽高设置了wrap_content时,控件大小随着子控件或内容的大小变化而变化
UNSPECIFIED:不指定其大小测量模式,View想多大就多大,通常情况下在自定义View时才会使用
View类默认的onMeasure()只支持EXACTLY模式,所以如果在自定义控件的时候不重写onMeasure()方法,系统就只能用EXACTLY模式,这时,控件就只能响应设置的具体宽高值或者match_parent属性,要想使用warp_content,就必须重写onMeasure()来指定warp_content时的大小
有了MeasureSpec这个类,我们就可以获取到View的测量值和测量模式,进而控制View显示的大小
下面简单的实例来演示进行View的测量
首先要重写onMeasure()方法进入super.onMeasure()方法中可以看到系统最终回调用setMeasuredDimension()方法将最后的测量值设置进去从而完成测量工作,所以我们可以将onMeasure()方法写成:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(measureWidth(widthMeasureSpec),measureHeight(heightMeasureSpec));
}
在measureWidth(widthMeasureSpec)中或者是在测量高度的方法中,测量View的 高和宽
首先:从MeasureSpec对象中获取具体的测量模式和大小:
int mode = MeasureSpec.getMode(heightMeasureSpec);
int size = MeasureSpec.getSize(heightMeasureSpec);
然后通过判断测量模式给出不同的测量值,当mode为EXACTLY时使用制定的size即可,当为其他两种模式的时候需要给它一个默认值,如果指定warp_content属性时,则需要取出我们指定的大小与size中最小的一个来作为测量值:
if(mode == MeasureSpec.EXACTLY){
height = size;
}else{
height = 400;
if(mode == MeasureSpec.AT_MOST){
height = Math.min(height,size);
}
}
这时我们就可以得到高度值了,宽度值是一样的,下面是自定义View的完成代码:
/**
* 类别:
* <p/>
* 作者: 10526_addcn_Lunasea
* <p/>
* 时间: 2016/5/12
* <p/>
* 描述:
*/
public class TouchView extends View {
public TouchView(Context context) {
super(context);
}
public TouchView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public TouchView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(measureWidth(widthMeasureSpec),measureHeight(heightMeasureSpec));
}
private int measureHeight(int heightMeasureSpec) {
int height = 0;
int mode = MeasureSpec.getMode(heightMeasureSpec);
int size = MeasureSpec.getSize(heightMeasureSpec);
if(mode == MeasureSpec.EXACTLY){
height = size;
}else{
height = 400;
if(mode == MeasureSpec.AT_MOST){
height = Math.min(height,size);
}
}
return height;
}
private int measureWidth(int widthMeasureSpec) {
int widith = 0;
int mode = MeasureSpec.getMode(widthMeasureSpec);
int size = MeasureSpec.getSize(widthMeasureSpec);
if(mode == MeasureSpec.EXACTLY){
widith = size;
}else{
widith = 200;
if(mode == MeasureSpec.AT_MOST){
widith = Math.min(widith,size);
}
}
return widith;
}
}
在xml中使用:
<com.lunasea.viewpagertest.view.TouchView
android:layout_height="wrap_content"
android:background="#f00"
android:layout_width="wrap_content"
/>
我们可以尝试变换高和宽的属性值来感受下具体的不同,好了,这一节就这么多,主要就是View的测量
有什么不对的地方希望指正@@
- Android自定义控件(一)--View的测量
- Android自定义View(一) View的测量
- Android自定义控件——View的测量模式
- Android自定义View(三、深入解析控件测量onMeasure)
- Android自定义View(三、深入解析控件测量onMeasure)
- Android自定义View(三、深入解析控件测量onMeasure)
- 自定义控件(一):View的测量及绘制流程、原理简介
- View背后不为人知的勾当(一)--自定义控件和测量过程
- android 自定义View之View的测量(onMeasure()方法)
- android 自定义View之View的测量(onMeasure()方法)
- Android自定义View 之 View的测量
- Android 自定义View基础-View的测量
- 3.2.Android控件架构与自定义控件详解之View的测量
- 自定义View的测量
- Android 自定义View 测量控件大小onMeasure中MeasureSpec作用
- Android学习笔记(一) View、ViewGroup的测量绘制
- Android自定义控件系列一:如何测量控件尺寸
- (转)Android自定义View(三、深入解析控件测量onMeasure)
- 管理APP内存
- Arrylist的用法
- python里面的dict和set
- asp上传组件Persits.Jpeg.1 错误 '800a0004'
- 在Fragment中如何调用指定Activity的方法
- Android自定义控件(一)--View的测量
- 安装、配置好hive后,在启动过程中报的错及解决方法
- [转]React 入门实例教程
- 一种效果
- url变化的时候,modal框没有消失
- 安卓系统权限申请列表
- Webview标题问题
- MYSQL必知必会读书笔记 第二十二章 使用视图
- android 常用util方法