美文网首页
自定义view之自定义属性

自定义view之自定义属性

作者: 煤炭黄帽 | 来源:发表于2022-08-09 15:59 被阅读0次

一、基本使用流程

  1. 自定义 CustomAttrsView 类;

  2. 编写values/attrs.xml,在其中编写styleable和item等标签元素;

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="CustomAttrsView">
            <attr name="name" format="string|reference"></attr>
            <attr name="text" format="string|reference"></attr>
            <attr name="android:textSize"></attr>
            <attr name="skinColor" format="color|reference"></attr>
            <attr name="isMVP" format="boolean"></attr>
            <attr name="kobeheight" format="float|reference"></attr>
            <attr name="weight" format="float|reference"></attr>
            <attr name="radius" format="dimension|reference"></attr>
            <attr name="maxPoints" format="integer|reference"></attr>
            <attr name="freeThrowPercent" format="fraction"></attr>
            <attr name="team" format="enum">
                <enum name="lakers" value="0"/>
                <enum name="Sixers" value="1"/>
                <enum name="nets" value="2"/>
                <enum name="rockets" value="3"/>
            </attr>
            <attr name="point" format="flags">
                <flag name="shoot" value="0"/>
                <flag name="freethrow" value="1"/>
                <flag name="dunk" value="2"/>
            </attr>
        </declare-styleable>
    </resources>
    
  3. xml中引入自定义view,并使用自定义的属性

    xmlns:tj="http://schemas.android.com/apk/res-auto" 
    
    <com.yellowhat.study.customview.CustomAttrsView
            tj:name="kobe"
            tj:skinColor="#000000"
            tj:isMVP="true"
            tj:kobeheight="203"
            tj:weight="198"
            tj:radius="@dimen/dp_10"
            tj:maxPoints="81"
            tj:freeThrowPercent="8.24%"
            tj:team="lakers"
            tj:text="55"
            android:textSize="20sp"
            tj:point="dunk|shoot|freethrow"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
  4. 在CustomAttrsView中通过TypeArray获取各个属性;

    class CustomAttrsView @JvmOverloads constructor(
        context: Context,
        attributeSet: AttributeSet? = null,
        defStyleAttr: Int = 0
    ) : AppCompatTextView(context, attributeSet, defStyleAttr) {
        init {
            val typeArray = context.obtainStyledAttributes(attributeSet, R.styleable.CustomAttrsView)
            val name = typeArray.getString(R.styleable.CustomAttrsView_name)
            val skinColor = typeArray.getColor(R.styleable.CustomAttrsView_skinColor, Color.RED)
            val isMvp = typeArray.getBoolean(R.styleable.CustomAttrsView_isMVP, true)
            val height = typeArray.getFloat(R.styleable.CustomAttrsView_kobeheight, 195.2f)
            val weight = typeArray.getFloat(R.styleable.CustomAttrsView_weight, 100.0f)
            val circleRadius = typeArray.getDimension(R.styleable.CustomAttrsView_radius, 20.0f)
            val maxPoints = typeArray.getInt(R.styleable.CustomAttrsView_maxPoints, 25)
            val freethowPercent =
                typeArray.getFraction(R.styleable.CustomAttrsView_freeThrowPercent, 1, 1, 50f)
            val team = typeArray.getInt(R.styleable.CustomAttrsView_team, 1)
            val point = typeArray.getInt(R.styleable.CustomAttrsView_point, 1)
            val text = typeArray.getString(R.styleable.CustomAttrsView_text)
            val textSize = typeArray.getDimension(R.styleable.CustomAttrsView_android_textSize,22f)
            Log.e(
                "tj24",
                "name = ${name}\n skinColor = ${skinColor}\n isMvp = ${isMvp}\n height = ${height}\n weight = ${weight}\n circleRadius = ${circleRadius}\n maxPoints = ${maxPoints}\n freethowPercent = ${freethowPercent}\n team = ${team}\n point = ${point}\n text = ${text}\n" +
                        " textSize = ${textSize}"
            )
            typeArray.recycle()
        }
    }
    

    log输出如下:

    08-09 14:51:14.694 27403-27403/com.yellowhat.study E/tj24: name = kobe
         skinColor = -16777216
         isMvp = true
         height = 203.0
         weight = 198.0
         circleRadius = 10.0
         maxPoints = 81
         freethowPercent = 0.082399964
         team = 0
         point = 3
         text = 55
         textSize = 20.0
    

二、属性值的类型format

名称 描述 备注
reference 参考某一资源ID
color 颜色值
boolean 布尔
dimension 尺寸
float 浮点
integer 整形
string 字符串
fraction 百分比
enum 枚举 值为int
flag 位或运算 值为int

三、注意事项:

  • styleable 的 name 建议和自定义view 类名保持一致,不然xml中代码不会自动提示!
  • xml中使用自定义属性注意命名空间,如上面 text属性有tj:text 和android:text之分;
  • attr name 可以直接使用系统已定义的属性,但不能有format,如上面 textSize 属性;
  • enum和 flag 的属性,value只能为int。 enum只可选一个,flag可以位运算多个。
  • format可混合使用,如 format="float|reference"

相关文章

  • Android自定义View总结

    Android自定义View总结 [toc] 步骤 自定义View的属性 在View的构造方法获取我们自定义的属性...

  • Android自定义View步骤

    自定义View 的步骤 自定义View属性 在View的构造方法中获得自定义的属性 重写onMesure 重写on...

  • 自定义View的简单流程

    自定义View的步骤 1、自定义属性 1)分析自定义的View中需要哪些的自定义属性,在res/values/at...

  • 安卓自定义 View 启航

    先总结下自定义 View 的步骤: 自定义 View 的属性 在 View 的构造方法中获得我们自定义的属性 [重...

  • 自定义View

    自定义view的属性 在view的构造方法中获得我们自定义的属性 重写onMeasure 重写onDraw 自定义...

  • Android相关知识点博客记录

    自定义属性 Android自定义View(二、深入解析自定义属性) Android中XML的命名空间、自定义属性 ...

  • Android三级联动wheel代码分析(二)

    自定义View的步骤:1、自定义View的属性2、在View的构造方法中获得我们自定义的属性[3、重写onMesu...

  • 自定义View入门

    一、自定义View的基本步骤概括 自定义View的属性 在View子类的构造方法中获取自定义的属性 重写 onMe...

  • 自定义ViewGroup的简单流程

    自定义ViewGroup的步骤 1、自定义属性 参考UI控件:自定义View 2、onMeasure() View...

  • 哥哥手把手教你安卓自定义view,来了老弟

    先总结下自定义View的步骤:1、自定义View的属性2、在View的构造方法中获得我们自定义的属性[3、重写on...

网友评论

      本文标题:自定义view之自定义属性

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