最近碰到一个关于自定义TextView的问题,
要求我们对控件的背景和文字进行随机改变,大概思考了32秒,创建了一个类果断继承Textview,把画笔和构造方法都写完后,开始写onDraw()方法,
要求是对背景和文字都有颜色随机变化的要求,所以先绘制了一个矩形
paint.setColor(Color.RED);
canvas.drawRect(getMeasuredWidth()/2-50,getMeasuredHeight()/2-50,getMeasuredWidth()/2+50,getMeasuredHeight()/2+50,paint);
绘制矩形时,参数分为是float x float y, float x, float y ,画笔
前两个参数我们可以看成是矩形的左上角点的坐标,第三和第四个参数我们可以看成时矩形右下角的坐标
这样一来我们的矩形画完了,接下来就需要给矩形描边(这种变态的要求)
为了和矩形背景色区分开,我们重新定义一下画笔
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.GREEN);
paint.setStrokeWidth(2);
canvas.drawRect(getMeasuredWidth()/2-50,getMeasuredHeight()/2-50,getMeasuredWidth()/2+50,getMeasuredHeight()/2+50,paint);
这样一来,矩形的边就出来了,最后就是要在矩形上写文字,
canvas.drawText(s,getMeasuredWidth()/2-50,getMeasuredHeight()/2+20,paint);
第一个参数就是我们要写的内容,这里写的是随机的一个四位数
String.valueOf((int) (Math.random() * 8999 + 1000))
还可以设置字体的大小
paint.setSize(20);
文字的位置根据需求自己进行调整
到这里上图的效果我们已经实现了,接下来操作点击事件进行颜色变化
自定义控件点击,我们用onTouchEvent()
@Override
public boolean onTouchEvent(MotionEvent event) {
//判断当前的点击事件
if(event.getAction() == MotionEvent.ACTION_UP){
if(flag){
flag = false;
}else {
flag = true;
}
//开始重绘
invalidate();
}
return true;
}
这里为了偷懒只监听了手指抬起的监听,还可以进行ACTION_DOWN ACTION_MOVE的监听
我们为了可以监听当前的状态,我用了boolean来记录,当flag=true时,这时的颜色都是默认的,当flag值改变时颜色也发生变化
代码都写在onDraw()中