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

Android自定义View的方法

2017-04-19 22:29 477 查看
本文大部分直接或间接引用 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()方法,否则这次的设定会对下次的使用造成影响
效果示例:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android