Ultra-detallada! ! lona método común Daquan

Para dibujar algún efecto especial, entonces, no puede ser separado y lona Pintura  

Pinceles es que la lona lienzo

En este artículo se trata principalmente de Lona se utiliza principalmente en el interior onDraw

Primero inicializamos pinta

public class MyView2 extends View {

    private Paint mPaint;

    public MyView2(Context context) {
        super(context);
    }

    public MyView2(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        mPaint = new Paint();
    }

    public MyView2(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

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

        mPaint.setColor(Color.rgb(0x91, 0xbe, 0xf0));
        mPaint.setStrokeWidth(10);
        mPaint.setStyle(Paint.Style.STROKE);

Paint hecho algunas operaciones sencillas bajo un resumen específico de inicialización sencilla

--- Leimu azul color de la pluma de la pluma anchura 5 estilo de trazo ---- cepillo


Bueno, vamos a empezar a pintar él!

punto de dibujo     

El primero dos parámetros representativos de las coordenadas XY es un cepillo parámetro

Multi-pintura miedo de ver unos cuantos

//绘制一个点    第一个参数代表点的X  第二个Y
        canvas.drawPoint(100, 200, mPaint);
        canvas.drawPoint(300, 400, mPaint);
        canvas.drawPoint(500, 600, mPaint);

resultados de operación son los siguientes:
          

Hay otras maneras de pasar punteadas (diferentes parámetros)

El primer parámetro se pasa en serie de punto flotante representa un punto cada dos efectos no creen que puede ser fijado hacia fuera

 float[] points = {100, 200, 300, 400, 500, 600, 700, 800, 900, 1000};
//        绘制多个点   第一个参数 点的集合(两个数一个点)
        canvas.drawPoints(points, mPaint);

Por debajo de este hay una pluralidad de puntos seleccionados representa -------- dos números para recordar que este es un punto

El segundo parámetro es el número del primer número del tercer parámetro es el número de seleccionado varios

float[] points = {100, 200, 300, 400, 500, 600, 700, 800, 900, 1000};
        canvas.drawPoints(points, 2, 6, mPaint);
El código anterior con el contenido real (300,400) (500,600) (700,800) de los tres puntos
resultados de operación son los siguientes:


(Otro dibujo tendrá unas sobrecargas similares cuando ellos no repetir aquí)

Trazar la línea

Dos en una línea de modo que los cuatro primeros parámetros son las coordenadas XY XY y el segundo punto de la primera punto  
 //两点成一线  前两个参数是第一个点的XY坐标
        canvas.drawLine(100,200,300,400,mPaint);
El método también puede pasar una matriz de punto flotante y los puntos trazados no son consistentes con repetida (empezando ha sólo pereza)
Resultados Como se muestra:



Dibujar un rectángulo

Los primeros cuatro parámetros son las coordenadas XY del rectángulo izquierda y derecha esquinas de dos puntos (comprensión personal, y la comprensión de que tales comparativo entender ~~)

Por lo tanto ------ anchura de la altura del rectángulo del rectángulo 200 300-100 = 200 400-200 =
Es un cuadrado

canvas.drawRect(100, 200, 300, 400, mPaint);

resultados de operación son los siguientes:

Hay un método de dibujar un rectángulo:

Mediante la creación de un nuevo aferente regional para dibujar un rectángulo en este rango el mismo efecto

Rect rect = new Rect(100,200,300,400);
        canvas.drawRect(rect,mPaint);

Dibujar rectángulo redondeado

Delante de un parámetro se pasa Rect gama y las diferencias RectF como RectF más precisa? El hormigón no es clara
El tercer parámetro es representativo de una segunda curvatura mayor redondeado el valor Parque

 RectF rectF = new RectF(100,200,300,400);
        canvas.drawRoundRect(rectF,50,50,mPaint);
resultados de operación son los siguientes:


Dibujar un círculo

La escuela secundaria (o escuela) que sabemos tienen que dibujar un círculo de centro y el radio
Por lo tanto ----- dos primeros parámetros son las coordenadas del centro del radio del tercer parámetro
下面代码表示  圆心为(300,300)  半径为200 的正圆
        canvas.drawCircle(300,300,200,mPaint);

运行效果如下:

绘制椭圆

初中或者小学我们就知道圆是根据矩形的内切圆决定的
正方形内切圆就是正圆   长方形的内切圆就是椭圆
为了方便起见  我们同时画一个矩形和椭圆
canvas.drawRect(100, 200, 500, 400, mPaint);
        canvas.drawOval(new RectF(100,200,500,400), mPaint);
运行效果如下:

绘制圆弧

圆弧实际上就是圆或者椭圆的一部分
为了方便直接画椭圆的圆弧吧
为了直观   矩形 椭圆  然后换一下画笔颜色画弧

第一个参数是椭圆的范围   第二第三个参数是圆弧的起始角度和最终角度
起始角度:0   就是X轴正方向的就是0
角度 : 是顺时针  
所以运行出来的圆弧是右下角(第四象限的圆弧)
下一个参数是boolean类型  true就代表圆弧起点终点和圆心相连
false就是不相连

canvas.drawRect(100, 200, 500, 400, mPaint);
        canvas.drawOval(new RectF(100, 200, 500, 400), mPaint);
        mPaint.setColor(Color.RED);
        //前四个参数是矩形的范围
        //然后两个 是起始角度和最后角度    起始是X轴正方向   旋转角度是顺时针
        //下一个参数是  圆弧起点和终点是否和中心相连
        canvas.drawArc(new RectF(100, 200, 500, 400), 0, 90, true, mPaint);

运行效果如下:



绘制多边形(Path)

三角形:

Path moveTo 是起点坐标
lineTo方法是画线
close是最后和起点连接
所以画三角形  ----  确定起点 ----  画两条边  ------ close

Path path = new Path();
        path.moveTo(100,100);
        path.lineTo(100,500);
        path.lineTo(700,500);
        path.close();
        canvas.drawPath(path , mPaint);

运行效果如下:



其实Path 里面还有很多方法的  
都很好理解  举个例子  .addCircle()方法   就是在路径上添加圆形
下面代码就是在三角形上加上多个圆形

前三个参数不多说  圆心坐标和半径
最后一个参数下面说(下面说的话更容易理解)

Path path = new Path();
        path.moveTo(100,100);
        path.lineTo(100,500);
        path.lineTo(700,500);
        path.close();
//        canvas.drawPath(path , mPaint);
        path.addCircle(100,100,30,Path.Direction.CW);
        path.addCircle(100,200,30,Path.Direction.CW);
        path.addCircle(100,300,30,Path.Direction.CW);
        path.addCircle(100,400,30,Path.Direction.CW);
        path.addCircle(100,500,30,Path.Direction.CW);
        canvas.drawPath(path , mPaint);

运行效果如下:



在Path上绘制文字  

先分别画四个圆   然后在上面绘制文字
drawTextOnPath() 方法 顾名思义  在Path上绘制文字
前两个参数分别是 绘制的文字 和 path  
第三个参数    与路径起始点的水平偏移距离
第四个参数    与路径中心的垂直偏移量
第一次看是不是一脸懵逼  哈哈哈 

第三个参数其实就是距离起始点的距离   圆形的话起始点也是终点 , 如果与起始点距离过大 则后面内容会压缩
第四个是距离Path的 垂直距离   圆形的话就是距离园的那个线的距离   可以使负值

上面说了这里讲 Path.Direction.CW  和  CCW
其实CW就是顺时针   CWW是逆时针   仔细看下面的图片就会发现  
我设置CCW
下面文字“测设文本1 测试文本2.....”
是按逆时针分布的

String text = "测试文本1,测试文本2,测试文本3,测试文本";
        Path path = new Path();
        Path path1 = new Path();
        Path path2 = new Path();
        Path path3 = new Path();

        path.addCircle(200, 200, 150, Path.Direction.CCW);
        path1.addCircle(550, 200, 150, Path.Direction.CCW);
        path2.addCircle(200, 700, 150, Path.Direction.CCW);
        path3.addCircle(550, 700, 150, Path.Direction.CCW);

        canvas.drawPath(path, mPaint);
        canvas.drawPath(path1, mPaint);
        canvas.drawPath(path2, mPaint);
        canvas.drawPath(path3, mPaint);

        //设置字体
        mPaint.setTextSize(50);
        canvas.drawTextOnPath(text, path, 0, 0, mPaint);
        //第三个参数是与路径起始点的水平偏移距离
        //起始点是X轴正方向,逆时针
        //起始点也是终点  如果该数值过大则在终点压缩
        canvas.drawTextOnPath(text, path1, 100, 0, mPaint);
        //第四个参数是垂直偏移量
        //就是距离圆心距离   可以为负数
        canvas.drawTextOnPath(text, path2, 0, 100, mPaint);

运行效果如下:


绘制文字

上面要是仔细看了  其实绘制文字简单的很

第一个参数是文本   然后是范围  最后是画笔

 mPaint.setTextSize(50);
        canvas.drawText("测试本本", 150, 150, mPaint);

运行效果如下:


Path更多用法

path不只可以用来画多边形

下面直接贴这个代码
public class MyView4 extends View {

    private Paint mPaint ;
    private Path path ;


    public MyView4(Context context) {
        super(context, null);
    }

    public MyView4(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs, 0);
        mPaint = new Paint();
        path = new Path();
    }

    public MyView4(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

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

        mPaint.setColor(Color.RED);
        mPaint.setStrokeWidth(5);
        mPaint.setTextSize(60);
        mPaint.setStyle(Paint.Style.STROKE);

        canvas.drawPath(path, mPaint);


    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                path.moveTo(event.getX(), event.getY());
                break;
            case MotionEvent.ACTION_MOVE:
                path.lineTo(event.getX(), event.getY());
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                break;
        }
        return true;
    }
}


里面代码很简单  随便看都知道在做什么

xml代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                tools:context="com.example.administrator.test.MainActivity">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitXY"
        android:src="@mipmap/mmm"
        />


    <com.example.administrator.test.MyView4
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>


</RelativeLayout>



运行效果如下


知道图片里面是谁的  加发私信给我  咱们互相交流一下   嘿嘿嘿~~~~~~~~

------------------------------------分割线--------------------------------------------------------------

注意


具体实行的时候  有时画 圆角矩形 或者画 椭圆的时候直接输入float类型的那个会报错

传入RectF  的对象就不会报错了 
 
具体原因不清楚  ,  当初这里郁闷很久   这里写一下  防止和我一样的新手  遇到相同的的问题










发布了124 篇原创文章 · 获赞 141 · 访问量 16万+

Supongo que te gusta

Origin blog.csdn.net/weixin_36838630/article/details/73957807
Recomendado
Clasificación