一般Android画图常用的是Canvas类,

图像是要画在Canvas的bitmap上的,而显式图像要用ImageView,三者构造关系如下

代码如下

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
        imageView = (ImageView) findViewById(R.id.imageView);
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        bitmap = Bitmap.createBitmap(imageView.getWidth(), imageView.getHeight(),
                Bitmap.Config.ARGB_8888);
        canvas = new Canvas(bitmap);
        imageView.setImageBitmap(bitmap);
}

为什么要在onWindowFocusChanged里面初始bitmap呢,因为想要使得bitmap跟imageView的长宽相符,需要依赖imageView.getWidth和getHeight,而如果在初始化函数中里获取的话,由于imageView还没建立完全,这两个值是0。

下面要介绍一个Paint类,这个类是定义了画笔的样式以及颜色, 如下代码所示

Paint paint = new Paint();
paint.setColor(Color.rgb(13, 117, 6));        
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth((float) 10.0);
paint.setAntiAlias(true);
paint.setAlpha(245);

最后要用到Canvas的drawPath和drawLine来画图。

drawPath可以画出多边形的图,通过连接N个线段的起始点,需要用到Path类

drawLine可以通过起始点,画出一条直线

二者分别用法如下

private void useDrawPath(Path pathToDraw, Float startX, Float startY, Float endX, Float endY) {
        imageView.setImageBitmap(bitmap);
        pathToDraw.moveTo(Float.valueOf(startX), Float.valueOf(startY));
        pathToDraw.lineTo(Float.valueOf(endX), Float.valueOf(endY));
        canvas.drawPath(pathToDraw, pain);
    }
private void useDrawLine(Float startX, Float startY, Float endX, Float endY) {
        canvas.drawLine(startX, startY, endX, endY, pain);
    }

当然还有其他的N种形状的图,比如

  • drawRect(RectF rect, Paint paint) //绘制区域,参数一为RectF一个区域
  • drawPath(Path path, Paint paint) //绘制一个路径,参数一为Path路径对象
  • drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) //贴图,参数一就是我们常规的Bitmap对象,参数二是源区域(这里是bitmap),参数三是目标区域(应该在canvas的位置和大小),参数四是Paint画刷对象,因为用到了缩放和拉伸的可能,当原始Rect不等于目标Rect时性能将会有大幅损失。
  • drawLine(float startX, float startY, float stopX, float stopY, Paintpaint) //画线,参数一起始点的x轴位置,参数二起始点的y轴位置,参数三终点的x轴水平位置,参数四y轴垂直位置,最后一个参数为Paint 画刷对象。
  • drawPoint(float x, float y, Paint paint) //画点,参数一水平x轴,参数二垂直y轴,第三个参数为Paint对象。
  • drawText(String text, float x, floaty, Paint paint) //渲染文本,Canvas类除了上面的还可以描绘文字,参数一是String类型的文本,参数二x轴,参数三y轴,参数四是Paint对象。
  • drawOval(RectF oval, Paint paint)//画椭圆,参数一是扫描区域,参数二为paint对象;
  • drawCircle(float cx, float cy, float radius,Paint paint)// 绘制圆,参数一是中心点的x轴,参数二是中心点的y轴,参数三是半径,参数四是paint对象;
  • drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)//画弧,参数一是RectF对象,一个矩形区域椭圆形的界限用于定义在形状、大小、电弧,参数二是起始角(度)在电弧的开始, 参数三扫描角(度)开始顺时针测量的,参数四是如果这是真的话,包括椭圆中心的电弧,并关闭它,如果它是假这将是一个弧线,参数五是Paint对象;