自定义View简介

2020-04-29  本文已影响0人  xzmmhello

自定义View简介

自定义View简介

简单理解,就是在系统自带的空间满足不了你的需求的时候,你就会使用自定义View。

  1. 继承View public class TextView extends View
  2. 创建三个构造方法,这三个构造方法会在不同的情况下被调用
//在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);
    }
  1. 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 在布局中指定了确定的值100dpmatch_contentfill_parent
UNSPECIFIED 尽可能大,很少用到。ScrollView在测量布局的时候会用UNSPECIFIED。可以自行百度ScrollView + ListView显示不全问题。

  1. onDraw方法,主要用来绘制
  2. onTouchEvent 处理跟用户交互,手指触摸

说到自定义View里面就有会自定义属性,下面来说下自定义属性如何创建和获取。

  1. 首先在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)

  1. 获取自定义属性,在需要有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()

  1. 在布局文件中可以通过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"

上一篇下一篇

猜你喜欢

热点阅读