美文网首页
自定义View简介

自定义View简介

作者: xzmmhello | 来源:发表于2020-04-29 10:03 被阅读0次

    自定义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"

    相关文章

      网友评论

          本文标题:自定义View简介

          本文链接:https://www.haomeiwen.com/subject/tetgwhtx.html