1.自定义View简介
自定义View可以认为继承自View,系统没有的效果(ImageView,TextView,Button), extends View , extends ViewGroup
自定义一个系统的TextView,自定义View入门(今天,明天)
2.onMeasure()
// 获取宽高的模式
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
// 获取前两位
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
// 获取宽高的值
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
// 获取后面30位
int heightSize = MeasureSpec.getSize(heightMeasureSpec);MeasureSpec.AT_MOST : 在布局中指定了wrap_content MeasureSpec.EXACTLY : 在不居中指定了确切的值 100dp match_parent fill_parent MeasureSpec.UNSPECIFIED : 尽可能的大,很少能用到,ListView , ScrollView 在测量子布局的时候会用UNSPECIFIED widthMeasureSpec widthMeasureSpec : 会包含两个信息是一个32位的值,第一个信息是模式:2位 值:30位
3.onDraw()
/** * 用于绘制
* @param canvas
* */
* @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 画文本
canvas.drawText();
// 画弧
canvas.drawArc();
// 画圆
canvas.drawCircle(); }
4.onTouch() 分析源码
/** * 处理跟用户交互的,手指触摸等等
* @param event 事件分发事件拦截
* * @return */
* @Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
// 手指按下
Log.e("TAG","手指按下");
break;
case MotionEvent.ACTION_MOVE:
// 手指移动
Log.e("TAG","手指移动");
break;
case MotionEvent.ACTION_UP:
// 手指抬起
Log.e("TAG","手指抬起");
break; }
return super.onTouchEvent(event); }
5.自定义属性
自定义属性就是用来配置的,android:text=“Darren” 是系统的一个自定义属性
5.1 在res下的values下面新建attrs.xml
<resources>
<!--name 自定义View的名字 TextView-->
<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"/>
<enum name="password" value="3"/>
</attr>
</declare-styleable>
</resources>
5.2在布局中使用
声明命名空间,然后在自己的自定义View中使用
xmlns:app="http://schemas.android.com/apk/res-auto"
<com.darren.view_day01.TextView
app:text="Darren"
app:textColor="@color/colorAccent"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
5.3 在自定义View中获取属性
// 获取自定义属性
TypedArray array = context.obtainStyledAttributes(attrs,R.styleable.TextView); mText = array.getString(R.styleable.TextView_text);
mTextColor = array.getColor(R.styleable.TextView_textColor,mTextColor); // 15 15px 15sp
mTextSize = array.getDimensionPixelSize(R.styleable.TextView_textSize,mTextSize);
// 回收
array.recycle();