自定义View--(3)自定义属性的应用

注意点

1. 支持特殊属性

  • 支持wrap_content
    如果不在onMeasure()中对wrap_content作特殊处理,那么wrap_content属性将失效。
    具体原因请看文章:为什么你的自定义View wrap_content不起作用?
  • 支持padding & margin
    如果不支持,那么padding和margin(ViewGroup情况)的属性将失效。
  1. 对于继承View的控件,padding是在draw()中处理;
  2. 对于继承ViewGroup的控件,padding和margin会直接影响measure和layout过程。

2 多线程应直接使用post方式

View的内部本身提供了post系列的方法,完全可以替代Handler的作用,使用起来更加方便、直接。

3. 避免内存泄露

主要针对View中含有线程或动画的情况:当View退出或不可见时,记得及时停止该View包含的线程和动画,否则会造成内存泄露问题。
启动或停止线程/ 动画的方式:

  1. 启动线程/ 动画:使用view.onAttachedToWindow(),因为该方法调用的时机是当包含View的Activity启动的时刻
  2. 停止线程/ 动画:使用view.onDetachedFromWindow(),因为该方法调用的时机是当包含View的Activity退出或当前View被remove的时刻

4. 处理好滑动冲突

当View带有滑动嵌套情况时,必须要处理好滑动冲突,否则会严重影响View的显示效果。

自定义View

1. View自定义属性

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--自定义属性集合:CircleView-->
    <!--在该集合下,设置不同的自定义属性-->
    <declare-styleable name="CircleView">
        <!--在attr标签下设置需要的自定义属性-->
        <!--此处定义了一个设置图形的颜色:circle_color属性,格式是color,代表颜色-->
        <!--格式有很多种,如资源id(reference)等等-->
        <attr name="circle_color" format="color"/>

    </declare-styleable>
</resources>

2. 解析自定义属性

public CircleView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);

    // 加载自定义属性集合CircleView
    TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.CircleView);

    // 解析集合中的属性circle_color属性
    // 该属性的id为:R.styleable.CircleView_circle_color
    // 将解析的属性传入到画圆的画笔颜色变量当中(本质上是自定义画圆画笔的颜色)
    // 第二个参数是默认设置颜色(即无指定circle_color情况下使用)
    mColor = a.getColor(R.styleable.CircleView_circle_color, Color.RED);

    // 解析后释放资源,容易遗留
    a.recycle();
    ... // 其他处理
}

3. 在xml布局文件中使用

<!--必须添加schemas声明才能使用自定义属性-->

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
  
	<!-- 注意添加自定义View组件的标签名:包名 + 自定义View类名-->
	<!--设置自定义颜色 app:circle_color-->
    <scut.carson_ho.diy_view.CircleView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#000000"
        android:padding="30dp"
        app:circle_color="#FF4081"
         />
</RelativeLayout>

参考:
手把手教你写一个完整的自定义View

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值