自定义View简介

自定义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文件,当然你可以叫其他的名字。(一般都这么叫)


    

        
        
        
        
        
        


        
        
            
            
        
    

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"来使用。

别忘了导入xmlns:app="http://schemas.android.com/apk/res-auto"

你可能感兴趣的:(自定义View简介)