android自定义控件基础

本文总结了创建Android自定义控件的步骤,包括在attrs.xml中声明属性,继承View并重写构造函数、onMeasure、onDraw方法,以及如何在布局文件中使用和设置接口。详细解释了构造函数、onMeasure方法中测量模式的含义,以及onDraw方法中绘制文本和图片的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看了 这篇博客后,自己对自定义控件做的一些总结。 http://blog.youkuaiyun.com/carrey1989/article/details/11757409

关于自定义控件的创建,主要分为以下几个步骤:

1. 在value文件夹下,创建attrs.xml文件,在其中声明 自定义控件的名字以及各种属性。

 <declare-styleable name="控件名称">

<attr name="属性名" format="属性类型"/>

2. 创建自定义控件的类文件,通常是继承View。重写其中的几个方法

A.在构造函数中,通过TypeArray获取控件的所有属性,进行画笔paint以及其他一些属性初始化,获取完毕后需要进行recycle。

在设置字体属性的时候,涉及单位转换,可以使用:TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 25,getResources().getDisplayMetrics()),返回的就是25sp对应的px数值了。如:

  1.  titleTextSize = a.getDimensionPixelSize(  
  2.                 attr, (int) TypedValue.applyDimension(  
  3.                         TypedValue.COMPLEX_UNIT_SP, 25, getResources().getDisplayMetrics()));//默认标题字体大小25sp  

B.重写onMeasrue方法,这个方法的作用主要是用于计算出自定义控件的宽和高。

一般都要先获取控件在布局文件layout中自己设置的模式及宽高。(这是我自己的理解)

通过int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);

模式有3中,EXACTLY(具体的android:layout_width="200dp"),

    UP_MOST(具体的android:layout_width="wrap_content"),

    UNSPECIFIED(具体的不太懂 ,想多大 就多大),

其中的一些方法:

FontMetrics,用于获取字体属性panit.getFontMetrics

TextUtils.ellipsize,用于获取Text中的文本信息。String msg = TextUtils.ellipsize(subTitleText, textPaint, right - left, TextUtils.TruncateAt.END).toString();

C.重写onDraw方法,进行自定义控件的绘制。

其中的一些方法:

canvas.drawText(msg, x, bottom - fm.descent, paint);绘制文本。

canvas.drawBitmap(imageBitmap, null, rect, paint);绘制图片。

D.设置一些接口,可以通过接口对自定义的属性进行修改。

3.在布局文件中使用自定义控件,在开头进行声明。

xmlns:自己定个名字="http://schemas.android.com/apk/res/app的包名" as中好像要将最后的/换成-


4.关于自定义控件的3个构造方法

在代码里new的话一般用一个参数的,

写在xml里的 调用2个参数的 attr里边传过来的是 xml里边对应的height width等参数,包括自己定义的参数,如果在xml里边写入自定义控件的话 必须要重写2个参数的构造函数

 public MyView(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        paint = new Paint();  
          
        TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.MyView);      
        int textColor = a.getColor(R.styleable.MyView_myColor, 003344);  
        float textSize = a.getDimension(R.styleable.MyView_myTextSize, 33);  
        paint.setTextSize(textSize);  
        paint.setColor(textColor);  
        a.recycle();  
    }  


第3个参数不熟,传style的吧貌似


如果在Code中实例化一个View会调用第一个构造函数,如果在xml中定义会调用第二个构造函数,而第三个函数系统是不调用的,要由View(我们自定义的或系统预定义的View,如此处的CustomTextView和Button)显式调用,比如在这里我们在第二个构造函数中调用了第三个构造函数,并将R.attr.CustomizeStyle传给了第三个参数。

  第三个参数的意义就如同它的名字所说的,是默认的Style,只是这里没有说清楚,这里的默认的Style是指它在当前Application或Activity所用的Theme中的默认Style,以系统中的Button为例说明。




自己总结的一些,不知道对不对,有问题欢迎指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值