1.自定义View
自定义View分为自绘控件,组合控件 ,继承控件
自绘控件:顾名思义,这一类自定义控件注重控件本身的特性,如形状、动画效果等,一般继承View(但也不绝对,看具体需求),重写onDraw()方法完成绘制,具体绘制的过程请参照 (三)自定义View常用的方法(测量、绘制、位置)
组合控件:组合控件的特点是使用原生控件组合成新的控件。
继承控件:继承控件的特点是利用了父控件本身的一些特性,在此基础上添加新的功能。充分利用已有资源,避免了重复的开发。
2.时钟案例
创建一个ClockView(名字任取)类 继承View(需要重写其中的三个构造方法和 onDraw方法);
public class ClockView extends View {
public ClockView(Context context) {
this(context,null);
}
public ClockView(Context context, AttributeSet attrs) {
this(context, attrs,null);
}
public ClockView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
// 调用此方法绘制控件样式
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
}
先绘制外圆
public ClockView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//初始化画笔
initPaint();
}
private Paint circlePaint;//绘制圆的画笔
private void initPaint() {
circlePaint=new Paint();
circlePaint.setColor(Color.GREEN);//设置画笔的颜色
circlePaint.setAntiAlias(true);//消除锯齿
circlePaint.setStyle(Paint.Style.STROKE);
circlePaint.setStrokeWidth(6);//设置线条厚度
}
@Override
protected void onDraw(Canvas canvas) {
int width=400;
int height=400;
int radius=300;
canvas.drawCircle(width,height,radius,circlePaint);
}
绘制刻度(刻度和外圆可以使用同一种画笔来绘制)
for (int i = 1; i < 13; i++) {
canvas.save();//保存当前状态
/**
* 参数:1.旋转角度 2.旋转中心的 X轴坐标 3.旋转中心的Y 轴坐标
*/
canvas.rotate(i*30,width,height);
/**
* 参数:1、2:直线的初始的坐标值 3、4:直线末端的坐标值
*/
canvas.drawLine(width,height-radius,width,height-radius+15,circlePaint);
canvas.restore();//返回初始保存的状态
}
绘制指针圆盘(一个实心圆)
private Paint dotPaint;//绘制圆盘画笔
dotPaint=new Paint();
dotPaint.setColor(Color.RED);
dotPaint.setAntiAlias(true);
canvas.drawCircle(width,height,20,dotPaint);
绘制数字
private Paint numPaint;//绘制数字
numPaint = new Paint();
numPaint.setColor(Color.RED);
numPaint.setAntiAlias(true);
numPaint.setTextSize(35);
canvas.save();
canvas.rotate(i * 30, width, height);
canvas.drawText(i + "", width, height - radius + 50, numPaint);
canvas.restore();
绘制指针(时针,分针,秒针)
private Paint hourPaint;//绘制时针
private Paint minPaint;//绘制分针
private Paint secPaint;//绘制秒针
1
2
3
//时针画笔样式
hourPaint = new Paint();
hourPaint.setColor(Color.BLUE);
hourPaint.setAntiAlias(true);
hourPaint.setStrokeWidth(10);
//分针画笔样式
minPaint = new Paint();
minPaint.setColor(Color.RED);
minPaint.setAntiAlias(true);
minPaint.setStrokeWidth(7);
//秒针画笔样式
secPaint = new Paint();
secPaint.setColor(Color.GREEN);
secPaint.setAntiAlias(true);
secPaint.setStrokeWidth(4);
//首先获取当前时间
Calendar calendar=Calendar.getInstance();
int hour=calendar.get(Calendar.HOUR);
int minute=calendar.get(Calendar.MINUTE);
int second=calendar.get(Calendar.SECOND);
canvas.save();
canvas.rotate(hour*30+minute*30/60,width,height);
canvas.drawLine(width,height+50,width,height-150,hourPaint);
canvas.restore();
canvas.save();
canvas.rotate(minute*6,width,height);
canvas.drawLine(width,height+40,width,height-180,minPaint);
canvas.restore();
canvas.save();
canvas.rotate(second*6,width,height);
canvas.drawLine(width,height+20,width,height-220,secPaint);
canvas.restore();
invalidate();//重复调用onDraw方法,不断地绘制,使时钟呈现走动的效果