android自定义控件基础

看了 这篇博客后,自己对自定义控件做的一些总结。 http://blog.csdn.net/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为例说明。




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

发布了21 篇原创文章 · 获赞 1 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章