本文大部分直接或间接引用 Mr梵谷 博客中的博文,在此声明并鸣谢
有时候Android传统的页面布局不足以满足我们的需求,常常需要自己定义view,通常继承View,然后重写构造方法以及onDraw等函数,再具体实现自己定义的复杂view。我们知道在给控件赋属性时,通常使用的是android系统自带的属性,比如 android:layout_height="wrap_content",除此之外,我们亦可以自己定义属性,这样在使用的时候我们就可以使用形如 myapp:myTextSize="20sp"的方式了
1》在项目文件res/value下面创建一个attr.xml文件,该文件中包含若干个attr集合,例如:
这里MyView是包名,attr是属性名,format是对应的参数
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <declare-styleable name="MyView">
- <attr name="myTextSize" format="dimension"/>
- <attr name="myColor" format="color"/>
- </declare-styleable>
- </resources>
2》在使用到该自定义view的布局文件中键入如下:
- xmlns:myapp=“......................../res-auto”(AS中最后这样加)
- 而xmlns:tools="http://schemas.android.com/tools"这一行不可以有,否则会出错
这样一来,在我们自己定义的view的属性中,就可以使用自己在attr中定义的属性啦
3》编写一个Java的类来编辑自己定义的View,例如可以在button中加个图形:
public class MyButton extends Button{
private Drawable drawable;
private float drawableWidth,drawableHeight,buttonHeight;
public MyButton(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a=context.obtainStyledAttributes(attrs, R.styleable.my);
// get XML文件里设置的图片
drawable=a.getDrawable(R.styleable.my_drawable);
// get 图片的size
drawableWidth=drawable.getIntrinsicWidth();
drawableHeight=drawable.getIntrinsicHeight();
}
@Override
protected void onMeasure(int widthMeasureSpec,int heightMeassureSpec) {
super.onMeasure(widthMeasureSpec,heightMeassureSpec);
buttonHeight= MeasureSpec.getSize(heightMeassureSpec);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawable.setBounds(10,10,(int)((buttonHeight-20)/drawableHeight*drawableWidth+10),
(int)((buttonHeight-10)));
drawable.draw(canvas);
}
}
调用结束后务必调用recycle()方法,否则这次的设定会对下次的使用造成影响
效果示例: