目录
1、自定义View---onMeasure
2、 自定义View-----onTouchEvent
3、自定义View----onDraw
4、自定义View-----自定义属性
1、自定义View---onMeasure
//获取控件宽高的模式
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
MeasureSpec.AT_MOST-----wrap_content
MeasureSpec.EXACTLY------确切的值,在布局中指定了确切的值,(100dp、match_parent)
MeasureSpec.UNSPECIFIED---尽可能的大,未指定模式,当前组件,可以随便用空间,不受限制(ListView,ScrollView)
widthMeasureSpec、heightMeasureSpec----32位的值(int是32位),前2位是模式,后30位是尺寸
-------------MeasureSpec.makeMeasureSpec-------------
// https://gitee.com/jinnian28_admin/AndroidStudy/blob/master/app/src/main/java/com/jin/study/view/CustomListView.java
最高两位是00的时候表示"未指定模式"。即MeasureSpec.UNSPECIFIED
最高两位是01的时候表示"'精确模式"。即MeasureSpec.EXACTLY
最高两位是10的时候表示"最大模式"。即MeasureSpec.AT_MOST
//这个是由我们给出的尺寸大小和模式生成一个包含这两个信息的int变量:size是30位数的尺寸,mode定义heightMode打的模式
public static int makeMeasureSpec(int size, int mode)
//这个是得到这个变量中表示的模式信息。
public static int getMode(int measureSpec)
//这个是得到这个变量中表示的尺寸大小的值。
public static int getSize(int measureSpec)
//把这个变量里面的模式和大小组成字符串返回来,方便打日志
public static String toString(int measureSpec)
2、 自定义View-----onTouchEvent
return super.onTouchEvent(event);--交给父类处理
return false;----只调用ACTION_DOWN,ACTION_UP方法,不响应ACTION_MOVE等方法
return true;
----false只响应按下事件,滑动事件不进行响应与监听(view处理);true则全部响应与监听(自己处理)。
具体查看ViewGroup的dispatchTouchEvent的2794行“ while (target != null) ”
3、自定义View----onDraw
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//绘制文本
canvas.drawText();
//绘制弧
canvas.drawArc();
//绘制圆
canvas.drawCircle();
}
4、自定义View-----自定义属性
declare-styleable--固定
//
//
// 枚举属性只需指定 name,然后用 enum 标签 指定所有可能属性的 name和value(注:value只能为int型)
第一个与第二个构造函数需要使用this
使用方法
private String mText;
private int mTextSize = 15;
private int mTextColor = Color.BLACK;
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.CustomTextView[自定义的style名称]);
mText = array.getString(R.styleable.CustomTextView_customText);
mTextColor = array.getColor(R.styleable.CustomTextView_customTextColor,mTextColor);
mTextSize = array.getDimensionPixelSize(R.styleable.CustomTextView_customTextSize,mTextSize);
//回收
array.recycle();
return super.onTouchEvent(event);--交给父类处理
return false;----只调用ACTION_DOWN,ACTION_UP方法,不响应ACTION_MOVE等方法
return true;
----false只响应按下事件,滑动事件不进行响应与监听(view处理);true则全部响应与监听(自己处理)。
具体查看ViewGroup的dispatchTouchEvent的2794行“ while (target != null) ”
3、自定义View----onDraw
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//绘制文本
canvas.drawText();
//绘制弧
canvas.drawArc();
//绘制圆
canvas.drawCircle();
}
4、自定义View-----自定义属性
declare-styleable--固定
//
//
// 枚举属性只需指定 name,然后用 enum 标签 指定所有可能属性的 name和value(注:value只能为int型)
第一个与第二个构造函数需要使用this
使用方法
private String mText;
private int mTextSize = 15;
private int mTextColor = Color.BLACK;
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.CustomTextView[自定义的style名称]);
mText = array.getString(R.styleable.CustomTextView_customText);
mTextColor = array.getColor(R.styleable.CustomTextView_customTextColor,mTextColor);
mTextSize = array.getDimensionPixelSize(R.styleable.CustomTextView_customTextSize,mTextSize);
//回收
array.recycle();
declare-styleable--固定// // // 枚举属性只需指定 name,然后用 enum 标签 指定所有可能属性的 name和value(注:value只能为int型) 第一个与第二个构造函数需要使用this 使用方法 private String mText; private int mTextSize = 15; private int mTextColor = Color.BLACK; TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.CustomTextView[自定义的style名称]); mText = array.getString(R.styleable.CustomTextView_customText); mTextColor = array.getColor(R.styleable.CustomTextView_customTextColor,mTextColor); mTextSize = array.getDimensionPixelSize(R.styleable.CustomTextView_customTextSize,mTextSize); //回收 array.recycle();
学习代码-github https://github.com/jinnian-28/AndroidStudyhttps://github.com/jinnian-28/AndroidStudy
giteehttps://gitee.com/jinnian28_admin/AndroidStudyhttps://gitee.com/jinnian28_admin/AndroidStudy (CustomListView 与 CustomTextView)



