您的位置:首页 > 移动开发 > Android开发

android自定义控件基础

2015-12-29 11:09 671 查看
看了 这篇博客后,自己对自定义控件做的一些总结。 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数值了。如:

titleTextSize = a.getDimensionPixelSize(

attr, (int) TypedValue.applyDimension(

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为例说明。

自己总结的一些,不知道对不对,有问题欢迎指出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: