自定义按钮
实现自定义按钮有多种方式:
- 使用图片
- shape配置
- 自定义绘图
使用图片方式
- 添加2张图片,点击和未点击效果
- 编写selector.xml文件
- 设置background
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false" android:drawable="@drawable/a"/>
<item android:state_pressed="true" android:drawable="@drawable/b"/>
</selector>
缺点:大量图片会使得apk变大,进而导致安装,下载缓慢问题。
app设计原则之一
apk打包需尽量小,能不用资源,尽量不用资源。
shape方式
- res下新建drawable文件夹,该文件夹专门用来存放图片无关的.xml文件,例如selector、shape等类型的xml文件。
- 编写selector.xml文件,在item节点下编写shape
- 设置background
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false"><shape>
<solid android:color="#ff0000" />
</shape></item>
<item android:state_pressed="true"><shape>
<solid android:color="#0000ff" />
</shape></item>
</selector>
缺点:配置不够灵活。
绘制
要使得控件具有一般控件属性,需继承View类,该类是安卓所有控件的父类。
public class MyButton extends View {
// 画笔
private Paint paint;
public MyButton(Context context) {
super(context);
// TODO Auto-generated constructor stub
init();
}
//思考:若没有该构造函数,将会引发什么问题?
public MyButton(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
init();
}
//完成初始化参数的工作,初始化画笔
private void init(){
paint = new Paint();
//消除锯齿
paint.setAntiAlias(true);
}
//绘制控件主要方法
@Override
protected void onDraw(Canvas canvas) {
// canvas理解为画布
super.onDraw(canvas);
}
//定义控件大小
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// widthMeasureSpec和heightMeasureSpec不仅包括大小信息,还包括设置模式,可通过MeasureSpec的静态方法获取
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
//实现事件监听
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
return super.onTouchEvent(event);
}
}
自定义控件设计原则
控件尽量不留边界,由外部layout文件控制。
自定义属性
- res/values文件夹下新建attr.xml文件
-
新增属性
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyButtonAttr"> <attr name="text" format="string"></attr> </declare-styleable> </resources>
-
控件初始化时获取自定义属性值
if(null!=attr){ TypedArray typedArray = getContext().obtainStyledAttributes(attr, R.styleable.MyButtonAttr); text = typedArray.getString(R.styleable.MyButtonAttr_text); // 注意回收 typedArray.recycle(); }
-
布局文件中添加命名空间
xmlns:myview="http://schemas.android.com/apk/res-auto"
- 写入具体属性值
<com.example.uitest.MyButton android:id="@+id/mybutton" android:layout_width="100dp" android:layout_height="100dp" myview:text = "测试" />
自定义控件步骤
- 继承view,重写onDraw(Canvas canvas)方法,画出控件形状
- 重写view.onKeyDown或onTouchEvent方法,以便能够得到用户的输入,做出相应动作。
- 根据控件特性,为控件的特殊功能提供关键事件的监听器接口
- 让自定义控件能够支持android layout配置文件进行配置(编写attrs.xml),并能够读取配置文件的控件属性值。