首先来看一下咱酷炫的效果图吧!由于是在模拟器上运行,鼠标拖动操作的,所以写的字较丑,见谅见谅哈!
这个签名板涉及到以下几个知识点:
一、自定义view的制作
二、将布局存成图像并保存
我们来简单说说自定义view:
首先我们要明白,为什么要自定义View?
主要是Android系统内置的View无法实现我们的需求,我们需要针对我们的业务需求定制我们想要的View。自定义View我们大部分时候只需重写两个函数:onMeasure()、onDraw()。onMeasure负责对当前View的尺寸进行测量,onDraw负责把当前这个View绘制出来。当然了,你还得写至少写2个构造函数:
//这个方法的调用环境,例如在activity中,在onCreate()方法里,setContentView(new MyView(this));
//这样直接new自定义的View的时候调用
public MyView(Context context) {
super(context);
}
//这个方法的调用环境,是在布局文件 XXX.xml 中我们用到这个View时调用,也可以看下面的案例
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
onMeasure()这个方法也是自定义View需要重写的,
View类的默认处理不满足我们的要求的话,我们就得重写onMeasure函数。我们可以给自己的View定义一个在width和height在wrap_content下一个默认值,如果width为300dp,height为250dp。就应该像以下这么写:
private int getSize(int sizedp,int measureSpec){
int finalsize = 0;
int mode=MeasureSpec.getMode(measureSpec);//提取测量模式
int size = MeasureSpec.getSize(measureSpec);//提取尺寸
switch (mode){
case MeasureSpec.AT_MOST://表示子布局限制在一个最大值内,一般为WARP_CONTENT
finalsize=sizedp*density;
break;
case MeasureSpec.EXACTLY://一般是设置了明确的值或者是MATCH_PARENT
finalsize=size;
break;
case MeasureSpec.UNSPECIFIED://没有指定大小,就设为默认大小,表示子布局想要多大就多大,很少使用
finalsize=sizedp*density;//此处的density我后面会讲到
break;
}
return finalsize;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(getSize(300,widthMeasureSpec),getSize(250,heightMeasureSpec));
}
画图的话要重写View中的onDraw方法:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mycanvas