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为例说明。
自己总结的一些,不知道对不对,有问题欢迎指出。
关于自定义控件的创建,主要分为以下几个步骤:
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为例说明。
自己总结的一些,不知道对不对,有问题欢迎指出。
相关文章推荐
- (转)Android系统自带Activity样式(@android:style/)
- Android禁止横屏竖屏切换
- Android RSA加密解密
- Android开发之ProgressDialog在独立Thread线程中更新进度
- 弹出输入法键盘,标题栏上移消失问题解决
- Android Studio 内存不足
- Android sdk content loader 0%的解决方案
- android开源框架Volley框架简介
- Android自定义Toast
- android的知识和经验分享
- Android之JAVASe基础篇-java基础知识(一)
- Android设计中的.9.png与Android Studio中的设置
- Android ViewConfiguration.getScaledTouchSlop () 用法
- Android日常知识收集与总结之调用系统相机拍照,获得原图
- 详解Android中AsyncTask机制
- Android自定义动画类——实现3D旋转动画
- Android动画的实现原理
- Android自定义动画学习,实现左右摇摆动画
- Android 快速开发--万能的Adapter
- Android异步上传图片到PHP服务器