一切的开始:onDraw()

自定义绘制的上手非常容易:提前创建好Paint对象,重写onDraw(),把绘制代码写在onDraw()里面,就是自定义绘制最基本的实现。大概就像这样:

Paint paint = new Paint();

@Override
protected void onDraw(Canvas canvas) {  
    super.onDraw(canvas);

    // 绘制一个圆
    canvas.drawCircle(300, 300, 200, paint);
}

就这么简单。所以关于onDraw()其实没什么好说的,一个很普通的方法重写,唯一需要注意的是别漏写了super.onDraw()

Canvas.drawXXX() 和 Paint 基础

drawXXX()系列方法和Paint的基础掌握了,就能够应付简单的绘制需求。它们主要包括:

  1. Canvas类下的所有draw-打头的方法,例如drawCircle() drawBitmap()

  2. Paint类的几个最常用的方法。具体是:

    • Paint.setStyle(Style style)设置绘制模式

    • Paint.setColor(int color)设置颜色

    • Paint.setStrokeWidth(float width)设置线条宽度

    • Paint.setTextSize(float textSize)设置文字大小

    • Paint.setAntiAlias(boolean aa)设置抗锯齿开关

Canvas.drawXXX()
简单规则图形
Canvas.drawColor(@ColorInt int color) 颜色填充

类似的方法还有 drawRGB(int r, int g, int b) 和 drawARGB(int a, int r, int g, int b) ,它们和 drawColor(color) 只是使用方式不同,作用都是一样的

drawCircle(float centerX, float centerY, float radius, Paint paint) 画圆

插播一: Paint.setColor(int color)

插播二: Paint.setStyle(Paint.Style style)

paint.setStyle(Paint.Style.STROKE); // Style 修改为画线模式  
canvas.drawCircle(300, 300, 200, paint);

Style 具体来说有三种: FILL, STROKE 和 FILL_AND_STROKE 。FILL 是填充模式,STROKE 是画线模式(即勾边模式),FILL_AND_STROKE 是两种模式一并使用:既画线又填充。它的默认值是 FILL,填充模式。

插播三: Paint.setStrokeWidth(float width)

paint.setStyle(Paint.Style.STROKE);  
paint.setStrokeWidth(20); // 线条宽度为 20 像素  
canvas.drawCircle(300, 300, 200, paint);

插播四: 抗锯齿

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
drawRect(float left, float top, float right, float bottom, Paint paint) 画矩形
drawPoint(float x, float y, Paint paint) 画点

x 和 y 是点的坐标。点的大小可以通过 paint.setStrokeWidth(width) 来设置;点的形状可以通过 paint.setStrokeCap(cap) 来设置:ROUND 画出来是圆形的点,SQUARE 或 BUTT 画出来是方形的点

drawPoints(float[] pts, int offset, int count, Paint paint) / drawPoints(float[] pts, Paint paint) 画点(批量)
drawOval(float left, float top, float right, float bottom, Paint paint) 画椭圆
drawLine(float startX, float startY, float stopX, float stopY, Paint paint) 画线
drawLines(float[] pts, int offset, int count, Paint paint) / drawLines(float[] pts, Paint paint) 画线(批量)
drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint) 画圆角矩形
drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, Paint paint) 绘制弧形或扇形
自定义图形
drawPath(Path path, Paint paint) 画自定义图形

drawPath(path) 这个方法是通过描述路径的方式来绘制图形的,它的 path 参数就是用来描述图形路径的对象。path 的类型是 Path ,使用方法大概像下面这样:

public class LoveView extends View {

    public LoveView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
    Paint paint = new Paint();
    Path path = new Path();
    private void initLoveViewPath(){
        path.addArc(200,200,400,400,-225,225);
        path.arcTo(400,200,600,400,-180,225,false);
        path.lineTo(400,600);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        paint.setAntiAlias(true);
        initLoveViewPath();
        paint.setColor(getResources().getColor(android.R.color.holo_red_dark));
        canvas.drawPath(path,paint);
    }
}
Path有两类方法,一类是直接描述路径的,另一类是辅助的设置或计算。
Path 方法第一类:直接描述路径

这一类方法还可以细分为两组:添加子图形和画线(直线或曲线)

第一组: addXxx() ——添加子图形

addCircle(float x, float y, float radius, Direction dir) 添加圆

第二组:xxxTo()——画线(直线或曲线)

lineTo(float x, float y) / rLineTo(float x, float y) 画直线

arcTo(RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo) / arcTo(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean forceMoveTo) / arcTo(RectF oval, float startAngle, float sweepAngle) 画弧形

Path 方法第二类:辅助的设置或计算

Path.setFillType(Path.FillType ft) 设置填充方式

FillType的取值有四个:

  • EVEN_ODD
  • WINDING(默认值)
  • INVERSE_EVEN_ODD
  • INVERSE_WINDING

其他

drawBitmap(Bitmap bitmap, float left, float top, Paint paint) 画 Bitmap
drawText(String text, float x, float y, Paint paint) 绘制文字
插播五: Paint.setTextSize(float textSize)

通过 Paint.setTextSize(textSize),可以设置文字的大小

results matching ""

    No results matching ""