为什么要自定义View?因为我们在开发中,经常有各种各样的需求,但是原生的控件毕竟只能满足我们常用的需求,所以我们需要根据自身当前的需求来定制我们的View,话不多说,一步一步来吧。
创建一个类,暂且将这个类命名为CustomView,并继承View,此时会提示需要重载它的构造函数,我们可以看到View的构造函数如下(四种):
public CustomView(Context context) {super(context);}
public CustomView(Context context, @Nullable AttributeSet attrs)
{super(context, attrs); }
public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr)
{super(context, attrs, defStyleAttr);}
public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes)
{super(context, attrs, defStyleAttr, defStyleRes);}
第四个构造函数我们先不考虑,是API21添加的
第三个构造函数的第三个参数一般也用不着,暂时不看
第二个构造函数一般在layout文件中使用的时候会调用,关于它的所有属性(包括自定义属性)都会包含在attrs中传递进来。
第一个构造函数一般在直接New一个View的时候调用。
比如说:
以下情况会调用第一种构造函数:
//在Activity中
CustomView customView = new CustomView(this);
以下情况会调用第二种构造函数:
//在layout文件中 - 格式为: 包名.View名
"wrap_content"
android:layout_height"wrap_content"/>
顾名思义,是一个画布,我们可以在画布上绘制我们想要的图形,它可以是一个点、线、矩形、圆形等。
我们先重写父类onDraw方法:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
然后我们先试试使用cancas绘制一个背景:
//绘制红色背景
canvas.drawColor(Color.RED);
Activity完整代码如下:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在Activity中
CustomView customView = new CustomView(this);
setContentView(customView);
}
}
/**
* 1.创建一个画笔
*/
private Paint mPaint;
/**
* 2.初始化画笔
*/
private void initPaint() {
mPaint = new Paint();
//设置画笔颜色
mPaint.setColor(Color.BLACK);
//STROKE //描边
//FILL //填充
//FILL_AND_STROKE //描边加填充
//设置画笔模式
mPaint.setStyle(Paint.Style.FILL);
//设置画笔宽度为30px
mPaint.setStrokeWidth(30f);
}
创建完画笔,就可以使用画笔在画布Canvas上绘制了。
绘制一个点:
//在坐标200(X),200(Y)处绘制一个点
canvas.drawPoint(200, 200, mPaint);
绘制一组点:
//绘制一组点,坐标一一对应
canvas.drawPoints(new float[]{
500, 500,
500, 600,
500, 700
}, mPaint);
//绘制一条直线(两点确定一线)
canvas.drawLine(300, 300, 500, 600, mPaint);
//绘制一组线
canvas.drawLines(new float[]{
100,800,500,800,
100,1000,500,1000
},mPaint);
//第一种:
canvas.drawRect(100, 100, 800, 400, mPaint);
//第二种:
canvas.drawRect(new Rect(100, 100, 800, 400), mPaint);
//第三种:Rect和RectF的区别就是一个是int一个是浮点型
canvas.drawRect(new RectF(100, 100, 800, 400), mPaint);
//第一种:rx 80 ry 70
canvas.drawRoundRect(new RectF(100, 100, 800, 400), 80, 70, mPaint);
//第二种://必须>=API21
canvas.drawRoundRect(100,100,800,400,30,30,mPaint);
//第一种:
canvas.drawOval(new RectF(100, 100, 800, 400), mPaint);
//第二种:
canvas.drawOval(100, 100, 800, 400, mPaint);
//绘制圆形:圆心坐标在500*500,半径是400
canvas.drawCircle(500, 500, 400, mPaint);
//第一种:起始角度为0度,扫过90度的圆弧 false不使用中心点
canvas.drawArc(new RectF(100, 100, 600, 600), 0, 90, false, mPaint);
//第二种:起始角度为0度,扫过90度的圆弧 true使用中心点
canvas.drawArc(new RectF(100, 100, 600, 600), 0, 90, true, mPaint);
效果如下:
上述全部是自定义View的基本用法,但是我相信那些复杂的View也是通过基础来构思的,慢慢来吧。