Android绘图主要涉及到android.graphics.* 包里面一些类:
- Canvas
- Bitmap及其相关的类
- Xfermode及其子类
- Paint及其相关类和内部类
- Shader及其子类
- Rect,Color,Point,Path等基础类
实现:
shape可以绘制矩形环形以及椭圆,所以只需要用椭圆即可,在使用的时候将控件比如imageview或textview的高宽设置成一样就是正圆,solid表示远的填充色,stroke则代表远的边框线,所以两者结合可以实现带边缘的圆,当然也可以直接加上size控制高宽,下面的代码实现效果是一个带白边的红圆。
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval"
android:useLevel="false">
<solidandroid:color="@color/red"/>
<stroke
android:width="1dp"
android:color="@color/white"/>
<sizeandroid:width="20dp"
android:height="20dp"/>
</shape>
UI控件不满足我们的需求的时候,就需要自定义View。自定义view的一个重点就是实现就是去重写他的绘制过程,也就是View.onDraw(Canvas canvas)方法,它里面就是绘制图形的过程了,比如说一个Button,绘制按钮和按钮上的文字都是在它自己的onDraw方法中完成的。如果你想给ImageView加个蒙版,可以继承ImageView并且重写他的onDraw方法,调用完父类的onDraw之后,再自己Canvas来画一个黑色的半透明矩形,这样就可以对现有的控件进行加工了。
Canvas是画布,你绘制东西的时候就是绘到了这个画布上,给用户显示的东西也是这个画布上的东西。通常来说,当你调用到onDraw方法的时候对应的View已经确定了他的宽度和高度(关于View的measure和layout过程以后再详述)。那么在Canvas上,你画的范围就只有View对应的大小了。我们用代码来描述下:
1 | protected void onDraw(Canvas canvas) { |
2 | super .onDraw(canvas); |
3 | int verticalCenter = getHeight() / 2 ; |
4 | int horizontalCenter = getWidth() / 2 ; |
5 | int circleRadius = 200 ; |
6 | Paint paint = new Paint(); |
7 | paint.setAntiAlias( false ); |
8 | paint.setColor(Color.RED); |
9 | canvas.drawCircle( horizontalCenter, verticalCenter- 250 , circleRadius, paint); |
10 |
11 | paint.setAntiAlias( true ); |
12 | paint.setStyle(Paint.Style.STROKE); |
13 | paint.setStrokeWidth( 20 ); |
14 | canvas.drawCircle( horizontalCenter, verticalCenter+ 250 , circleRadius, paint); |
15 | } |
这个View的大小可以通过getHeight()和getWidth()来获得。我们准备画两个圆圈,半径都是200。我们主要用到的方法是drawCircle()方法,参数的意义分别是圆心的x,y坐标,半径和所使用的画笔Paint。
Paint是画笔,Canvas是画布,画笔控制了所画东西的颜色大小字体等等。在画第一个圆的时候,我们通过Paint.setAntiAlias方法设置抗锯齿属性为false,并设置颜色为红色。
在画第二个圆的时候,我们打开了抗锯齿。将Paint的风格设为STROKE,也就是只画边框。然后设置边框宽度为20.
你可以将上面的代码运行一下(Demo的github地址:https://github.com/fookwood/AndroidGraphicsDemo)
所画出来的东西是符合我们预期的。上面的圆是实心,下面的是空心,而且上面的圆边缘会有锯齿感,而下面的没有。在用Canvas绘制一些矢量图形的时候,比如矩形,圆形,文字的时候我们通常会通过Paint打开抗锯齿。