Android——自定义组件和游戏开发(一)绘图工具类Canvas,Paint,Path。

简介

  Canvas是画布,必须基于View的onDraw使用。

  用View来实现Canvas画布,在LinearLayout里加入View即可

 

  Canvas:画布,用于绘制图形

  构造方法:

    Canvas(Bitmap):

      在Bitmap上绘制图形。

 

  方法:

    void drawRect(float left, float top, float right, float bottom, Paint paint)

      参数:

        left:矩形左边x坐标

        top:矩形顶部y坐标

        right:矩形右边x坐标

        bottom:矩形底部y坐标  

        paint:画笔

      返回值:无

      返回值意义:无

      作用:根据left,top,right,bottom坐标和paint画笔样式设置,绘制矩形。    

 

    void drawOval(float left,float top,float right,float bottom,Paint paint)

      参数:

        left:圆形左边x坐标

        top:圆形顶部y坐标

        right:圆形右边x坐标

        bottom:圆形底部y坐标

        paint:画笔

      返回值:无

      返回值意义:无

      作用:根据left,top,right,bottom坐标和paint画笔样式设置,绘制圆形。

 

    void drawRoundRect(float left , float top , float right , float bottom , float rx , float ry , Paint paint)

      参数:

        left:圆角矩形左边x坐标

        top:圆角矩形顶部y坐标

        right:圆角矩形右边x坐标

        bottom:圆角矩形底部y坐标

        rx:圆角矩形的圆角rx长度

        ry:圆角矩形的圆角ry长度

      返回值:无

      返回值意义:无

      作用:根据left,top,right,bottom坐标和圆角的rx,ry半径和paint画笔。绘制圆角矩形。

 

    void drawBitMap(Bitmap bitmap , Rect srcRect , Rect dstRect ,Paint paint)

      参数

        Bitmap:图片的位图

        srcRect:原图片的剪切矩形

        dstRect:现图片的位置矩形

        paint:画笔,花图片不需要,传null即可

      返回值:无

      返回值意义:无

      作用:根据bitmap绘制图片,注意不需要paint。图片的压缩在matrix里使用

    void drawPath(Path path , Paint paint)

      参数:

        path:路径对象

        paint:画笔

      返回值:无

      返回值意义:无

      作用:用path设定最后一个点和上一个点的坐标进行绘制图形

    

    int saveLayer(RectF bounds, Paint paint, int saveFlags)

      参数:

        bounds:要保存的矩形四边坐标

        paint:画笔

        saveFlags:Canvas.xxxxxFlag

      返回值:int

      返回值意义:第几次保存的数

      作用:

        保存当前矩阵并将其剪辑到私有堆栈上。

         随后对平移、缩放、旋转、倾斜、concat或clipRect、clipPath的调用都将照常运行,但当对restore()进行平衡调用时,这些调用将被忘记,而save()之前存在的设置将被恢复。

 

    save方法用于临时保存画布坐标系统的状态

    restore方法可以用来恢复save之后设置的状态,

    void restoreToCount( int count )

      参数:

        count : 要恢复的矩形参数

      返回值:void

      返回值意义:void

      作用:恢复之前设置的坐标

      (主要是自定义组件的时候使用)

    

类:

  Paint:画笔,设置绘画样式。如颜色,粗细,看据此。

  方法

    void setColor(Color color)

      参数:

        color:颜色对象

      返回值:void

      返回值意义:无

      作用:设置画笔颜色

    

    void setStrokeWidth( int strokeWidth )

      参数:

        strokeWidth:画笔粗细

      返回值:void

      返回值意义:无

      作用:设置画笔粗细

    

    void setAntiAlias(boolean isAntiAlias)

      参数:

        antialias:是否开启抗锯齿

      返回值:void  

      返回值意义:无

      作用:开启抗锯齿

  

    void setStyle(int Style)

      参数:

        style:选值。Paint.Style.Fill,Paint.style.STROKE.

      返回值:无

      返回值意义:无

      作用:选择画笔的风格:填充,描边

  

    

  字体的可选风格

    

  四个整型常量:

  • BOLD:加粗
  • ITALIC:斜体
  • BOLD_ITALIC:粗斜体
  • NORMAL:正常
   paint.setTypeface(Typeface.DEFAULT_BOLD);
    

  

  Path:路径对象,设置第一个点(moveTo(ifloat x , float y))和下一个点(lineTo(float x , flaot y ))

  方法:

    void moveTo(float x , float y)

    参数:

      x:点的x坐标

      y:点的y坐标

    返回值:无

    返回值意义:无

    作用:移动Path到第一个点

    

    void lineTo(float x , float y)

    参数:

      x:点的x坐标

      y:点的y坐标

    返回值:无

    返回值意义:无

    作用:移动Path到下一个点。

 

使用:

  

// 用Canvas ,Paint,Path:制作个人绘画板

public class MyPaint07 extends View {
    private Paint paint;
    private Path path;


    public MyPaint07(Context context) {
        super(context);
        init();
    }

    public MyPaint07(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

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

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

    public void init(){
        paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(Color.parseColor("#00ff00"));
        paint.setStrokeWidth(10);
        path = new Path();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawPath(path,paint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        switch ( event.getAction() ){
            case MotionEvent.ACTION_DOWN:
                Log.i(TAG, "onTouchEvent: do it");
                path.moveTo(event.getX(),event.getY());
                break;
            case MotionEvent.ACTION_MOVE:
                path.lineTo(event.getX(),event.getY());
                break;
        }
        invalidate();
        return true;
    }

    private static final String TAG = "MyPaint07";
}

 

posted @ 2021-11-13 17:01  remix_alone  阅读(167)  评论(0)    收藏  举报