需求:Androd 系统为我们提供了很多默认的控件,如buttonView TextView等等,但我们的需求远远不止这些,此时我们就需要自己来定义一些控件来满足我们的需求
方法:1.创建新的类:首先我们在MainActivity同级目录下创建一个新的类并继承一些我们想要的父类控件——节省了很多时间
2.实现构造方法:我们继承父类后必须实现父类的构造方法(快捷键ALT+Enter)
构造方法有多种重载方法:
(以下以父类为View为例)
(1)public TextView(Context context) {
super(context);
}
只有一个参数的构造方法:用于在代码中创建控件
(2) public TextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
有两个参数 用于在xml文件中创建控件
(3) public TextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
在xml文件中创建 并提供一个默认的样式
注意:关于deStyleAttr的理解:The default style to apply to this view. If 0, no style will be applied (beyond what is included in the theme). This may either be an attribute resource, whose value will be retrieved from the current theme, or an explicit style resource.
应用到View的默认风格(定义在主题中)
3.重写onDraw()方法:
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
参数说明:canvas 画布 用来我们画画的
注意:画布需要和画笔(Paint)一起使用
protected void onDraw(Canvas canvas) {
pieChart(canvas,Color.GREEN,(float)(angle/360.0));
}
private void pieChart(Canvas canvas,int color,float rate){//画一个饼状图
Paint paint=new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(color);
//画扇形
int endAngle= (int) (360*rate);
canvas.drawArc(50,100,250,300,0,endAngle,true,paint);
startAngle+=endAngle;
}
在这里我们写了一个pieChart()方法 用来画一个扇形图
需要的参数:(1)canvas 画布指定在那个画布上画画
(2)color 画笔的颜色
(3 rate 角度大小
4.控制角度增加的时间(为了更好的用户体验):
ValueAnimator va=ValueAnimator.ofInt(0,360);
va.setDuration(1000);
va.setRepeatCount(ValueAnimator.INFINITE);
va.setRepeatMode(ValueAnimator.REVERSE);
//设置监听器 监听值的变化
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
angle= (int) valueAnimator.getAnimatedValue();//获取某一刻的值
invalidate();//此处立刻调用onDraw()方法
}
});
va.start();
5 在xml文件中创建自定义控件:
<com.example.date_oct_26.TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"/>
6实现效果
7.扩展
关于canvas的几个常用方法:
(1)canvas.drawPoint(100, 200, mPaint):绘制点
(2)canvas.drawPoint(100, 200, mPaint):绘制线 注意画笔mpaint要先设置mPaint.setStyle(Paint.Style.STROKE),否者会出错
(3)canvas.drawRect(100, 200, 300, 400, mPaint):绘制矩形 宽度=300-100,高度=400-200
(4)canvas.drawRoundRect(100,200,300,400,50,50,mPaint):绘制圆角矩形
第四,五个参数代表圆角的弧度
(5)canvas.drawCircle(300,300,200,mPaint):画一个圆
(6)canvas.drawOval(100,200,500,400, mPaint:画一个椭圆(在矩形(100,200,500,400)内接一个椭圆)
(7)canvas.drawText("测试本本", 150, 150, mPaint):绘制文字
关于Path的用法:
Path path = new Path();
path.moveTo(100,100);
path.lineTo(100,500);
path.lineTo(700,500);
path.close();
canvas.drawPath(path , mPaint);
*path控制划线的路劲
(1)path.addCircle(100,100,30,Path.Direction.CW); 在路径上画圆
(2)canvas.drawTextOnPath(text, path, 0, 0, mPaint):在path路径上添加文字
//第三个参数是与路径起始点的水平偏移距离
//起始点是X轴正方向,逆时针
//起始点也是终点 如果该数值过大则在终点压缩
思考:如果加上onTouch()方法 是不是可以实现简单的画板呢?