自定义控件的使用
构造方法的使用:
(1)/**
* 在代码里面创建对象时进行使用此构造方法
* 当不需要使用xml声明或者不需要使用inflate动态加载时候,实现此构造函数即可
* @param context 上下文
*/
public CircleView(Context context) {
super(context);
}
(2)
/**
* 在布局文件中声明view, 创建时由系统自动调用
* 当需要在xml中声明此控件,则需要实现此构造函数。并且在构造函数中把自定义的属性与控件的数据成员连接起来。
* @param context 上下文
* @param attrs 属性
*/
public CircleView(Context context, AttributeSet attrs) {
super(context, attrs);
}
(3)/**
* 接受一个style资源
* @param context 上下文
* @param attrs 属性
* @param defStyleAttr 样式属性
*/
public CircleView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
继承view并重写onDraw()方法的使用常见的一些问题:在绘制控件时候调用,控件具体长什么样子就在此方法中实现
1、wrap_content的问题解决:如果不对wrap_content进行处理时,它的wrap_content属性和match_parent属性相同,没有任何区别。
解决办法:只需要指定wrap_content模式的宽/高,比如可以选择200dp作为默认的宽/高。
2、padding问题的处理办法:在绘制的时候,考虑一下padding即可,考虑四周的空白,代码如下:
final int paddingLeft = getPaddingLeft();
final int paddingRight = getPaddingLeft();
final int paddingTop = getPaddingLeft();
final int paddingBottom = getPaddingLeft();
//得到宽
int width = getWidth()-paddingLeft-paddingRight;
//得到高
int height = getHeight()-paddingTop-paddingBottom;
//得到半径
int radius = Math.min(width, height) / 2;
canvas.drawCircle(paddingLeft+width/2,paddingTop+height/2,radius,mPaint);
3、(1)自定义属性的实现:在values资源文件中创建一个attr.xml,代码如下: