自定义View简介
2020-04-29 本文已影响0人
xzmmhello
自定义View简介
自定义View简介
简单理解,就是在系统自带的空间满足不了你的需求的时候,你就会使用自定义View。
- 继承View
public class TextView extends View
- 创建三个构造方法,这三个构造方法会在不同的情况下被调用
//在new的时候会被调用
public TextView(Context context) {
this(context,null);
}
//在布局layout中使用
public TextView(Context context, @Nullable AttributeSet attrs) {
this(context,null,0);
}
//在布局layout中使用,但是需要有style
public TextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
- onMeasure方法,该方法主要用来自定义View的测量
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//widthMeasureSpec:包含两个信息,共32位,mode(前2位),size(后30位)
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//布局的宽高都是用这个方法来制定
//指定控件的宽高,需要测量
//获取宽高的模式
int widthMode = MeasureSpec.getMode(widthMeasureSpec); //获取前2位
int widthSize = MeasureSpec.getSize(widthMeasureSpec); //获取后30位
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
if (widthMode == MeasureSpec.AT_MOST){
//MeasureSpec.AT_MOST 在布局中指定了warp_content
}else if (widthMode == MeasureSpec.EXACTLY){
//MeasureSpec.EXACTLY 在布局中指定了确定的值(100dp),match_content或fill_parent
}else if (widthMode == MeasureSpec.UNSPECIFIED){
//尽可能大,很少用到 ,ListView
//ListView测量的时候只有一个item
//ScrollView在测量布局的时候会用UNSPECIFIED
}
}
widthMeasureSpec:包含两个信息,共32位,mode(前2位),size(后30位)
可以通过MeasureSpec.getMode(widthMeasureSpec)
来获取前2位,MeasureSpec.getSize(widthMeasureSpec)
获取后30位
mode主要有三种分别是AT_MOST,EXACTLY,UNSPECIFIED。
AT_MOST 在布局中指定了warp_content
EXACTLY 在布局中指定了确定的值100dp
,match_content
或fill_parent
UNSPECIFIED 尽可能大,很少用到。ScrollView在测量布局的时候会用UNSPECIFIED。可以自行百度ScrollView
+ListView
显示不全问题。
- onDraw方法,主要用来绘制
- onTouchEvent 处理跟用户交互,手指触摸
说到自定义View里面就有会自定义属性,下面来说下自定义属性如何创建和获取。
- 首先在
res
下的value
文件夹中新建attrs.xml
文件,当然你可以叫其他的名字。(一般都这么叫)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="TextView">
<!--
name 属性名称
format 格式:
string 文字
color 颜色
dimension 宽高 字体大小
integer 数字
reference资源(drawable)
-->
<attr name="text" format="string"/>
<attr name="textColor" format="color"/>
<attr name="textSize" format="dimension"/>
<attr name="maxLength" format="integer"/>
<attr name="background" format="reference|color"/>
<!-- 枚举 -->
<attr name="inputType" >
<enum name="number" value="1"/>
<enum name="text" value="2"/>
</attr>
</declare-styleable>
</resources>
declare-styleable
标签中的name
就是自定义View的类名。
attr
标签中的name
代表属性名称。
format
代表格式,又分以下几种。string
:文字 、color
:颜色、dimension
:宽高 字体大小、integer
:数字、reference
:资源(drawable)
- 获取自定义属性,在需要有
style
的构造方法里。
TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.TextView);
mText = typedArray.getString(R.styleable.TextView_text);
mTextSize = typedArray.getDimensionPixelSize(R.styleable.TextView_textSize,mTextSize);
//还有很多
//回收
typedArray.recycle();
⚠️切记一定要回收!typedArray.recycle()
- 在布局文件中可以通过
app:textSize="12dp"
来使用。
<com.example.view.TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:textSize="12dp"
app:background="@color/colorPrimary"
/>
别忘了导入xmlns:app="http://schemas.android.com/apk/res-auto"