Android 绘图基础

基本图形绘制

说到画图,在Android中有两个非常重要的东西,PaintCanvasPaint就是画笔,Canvas就是画布。

那怎么绘制一个自定义View呢?我就明人不说暗话了,看代码吧~

package com.example.chengyingying.androiddemo;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;

public class DemoView extends View {


    private Paint myPaint;


    public DemoView(Context context) {
        this(context,null);
    }

    public DemoView(Context context, @Nullable AttributeSet attrs) {
        this(context,attrs,0);
    }

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

    private void init() {

        myPaint = new Paint();
        myPaint.setColor(Color.RED);//设置画笔颜色
        myPaint.setStyle(Paint.Style.STROKE);//设置画笔填充样式
        myPaint.setStrokeWidth(50);//设置画笔宽度
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawCircle(100,100,100,myPaint);

    }
}

复制代码

代码很简单,首先创建一个类,然后让这个类去继承View。就表示当前这个类是一个自定义View。如果我们想写个像LinearLayout,RelativeLayout这样的容器,那我们应该继承ViewGroup,如果我们想要在系统自带控件的基础上再自己定义或者添加点儿东西的话,那就继承系统原有的控件即可。比如我想弄的圆形的ImageView,那我们就继承ImageView。如果我想做一个花型的按钮,那我就继承Button就行。其次我们就是重写onDraw(canvas),在这个函数里面有个参数,canvas,这个就是当前的画布,我们要画东西就在这上面画。在这里我给画笔设置了几个属性:

        myPaint = new Paint();
        myPaint.setColor(Color.RED);//设置画笔颜色
        myPaint.setStyle(Paint.Style.STROKE);//设置画笔填充样式
        myPaint.setStrokeWidth(50);//设置画笔宽度
        
复制代码

然后调用了canvas.drawCircle(100,100,100,myPaint);画了一个圆。 然后我们直接在布局文件里以全名的方式引入他即可,例如:

<com.example.chengyingying.androiddemo.DemoView
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
复制代码

记住,必须是全名。当然我们也可以通过代码使用。直接创建自定义控件的实例即可。记住,如果要在xml中使用自定义控件,这个构造方法一定要添加。

public DemoView(Context context, @Nullable AttributeSet attrs) {
        this(context,attrs,0);
    }
复制代码

然后我们看下效果:

小结

要想创建一个自定义控件,就三步即可:

  • 新建自定义类继承View
  • 创建画笔,并初始化
  • 重写onDraw(canvas)方法

画笔的基本设置

现在看下我们刚才用到的画笔的几个属性

  1. setColor()

    该函数用于设置画笔颜色,不说那些颜色相关的东西了,就说下,可以有那几只方式设置颜色,简单粗暴。

  • setColor(0xFFFFFF)
  • setColor(Color.Red)
  • setColor(Color.rgb(255,255,255))
  • setColor(Color.parseColor("#FF0000"))
  • setColor(getResources().getColor(R.color.white))
  1. setStyle() 该函数用于设置填充样式,对于文字和几何图形有效。style有三种取值方式.
  • Paint.Style.FILL 仅填充内部
  • Paint.Style.FILL_AND_STROKE 填充内部和描边
  • Paint.Style.STROKE 仅描边
  1. setStrokeWidth()

    用于设置描边宽度值,单位是px。仅当画笔的Style样式是Style.FILL_AND_STROKE时有效。

Cavans使用基础

cavans就是块布,你想干啥,就拿画笔在这上面画。现在看下他咋用?

  1. 画布背景设置

    有三种方法可以实现画布背景设置:

  • void drawColor(int color)
  • void drawARGB(int a,int r,int g,int b)
  • void drawRGB(int r,int g,int b)
  1. 画直线
  • void drawLine(float startX,float startY,float stopX,float stopY,Paint paint) startX: 起始点X坐标

    startY: 起始点Y坐标

    stopX: 终点X坐标

    stopY: 终点Y坐标

    注:

    直线的粗细于Paint.setStrokeWidth有直接关系。所以,paint.setStrokeWidth在Style起作用是,用于设置描边宽度;在Style不起作用时,用于设置画笔宽度。

  1. 画点

    void drawPonit(float x,float y,Paint paint)

  • floatx:点的X坐标

  • floaty:点的Y坐标

    点的大小只与paint.setStrokeWidth(width)有关,而与paint.setStyle无关。

  1. 矩形工具类RectF Rect概述

    这两个类都是矩形工具类,根据4个点构造出一个矩形结构。RectF与Rect中的方法,成员变量完全一样,唯一不同的是:RectF是用来保存float类型数值的矩形结构的,而Rect是用来保存int类型数值的矩形结构的。

    RectF:

    构造函数有下面四个:

    RectF(),

    RectF(float left,float top,float right,float bottom),

    RectF(RectF r)

    RectF(Rect r)

    Rect

    构造函数如下:

    Rect()

    Rect(int left,int top,int right,int bottom)

    Rect(Rect r)

  2. 矩形

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

    void drawRect(RectF recf ,Paint paint)

    void drawRect(Rect r,Paint paint)

    参数:

    第一个的写法是直接传入,,四个点,画出矩形

    第二,第三个构造函数是根据传入RectF或者Rect矩形变量来指定所画的矩形。

  3. Canvans变换

    平移(translate)

    canvas中有一个函数translate()用来实现画布平移的,画布的原状是以左上角为原点,向左是X轴正方向,向下是Y轴正方向。

    translate函数其实实现的想当于平移坐标系,即平移坐标系的圆点位置。translate()函数的原型如下:

    void translate(float dx,float dy)

    参数说明:

    float dx:水平方向平移的距离,正数指向正方向(向右)平移的量,负数为向(向左)平移的量

    float dy: 垂直方向平移的距离,正数指向正方向(向下)平移的量,负数为向负方向(向上)平移的量

    旋转(Rotate)

    画布的旋转是默认围绕坐标原点来旋转的,这里容易产生错觉,看起来觉得是图片旋转了,其实我们旋转的是画布,以后在此画布上画的东西显示出来的时候全部看起来都是旋转的。Rotate函数有两个构造函数:

    void rotate(float degress) void rotate(float degress,float px,float py)

    第一个构造函数直接输入旋转的度数,正数是顺时针旋转,负数指逆时针旋转,它的旋转中心点是原点(0,0)

    第二个构造函数除了度数以外,还可以指定旋转的中心点坐标(px,py)

    缩放(scale)

    public void scale(float sx,float sy)

    参数:

    float sx:水平方向伸缩的比例,sx为小数为缩小,sx为整数为放大 float sy:垂直方向伸缩比例,sy为小数为缩小,整数为放大。

  4. 屏幕显示与Canvas的关系

  • 每次调用canvas.drawXXXX系列函数来绘图时,都会产生一个全新的Canvas画布。
  • 如果再DrawXXX前,调用平移,旋转等函数来对Canvas进行操作,那这个操作是不可逆的!每次产生的画布的最新位置都是这些操作后的位置
  • 在Canvas与屏幕合成时,超出屏幕范围的图像是不会显示出来的。
  1. 画布裁剪

    裁剪画布是利用Clip系列函数,通过与Rect、Path、Region取交、并、差等集合运算来获得最新的画布形状。除了调用Save、Restore函数以外,这个操作是不可逆的,一但Canvas画布被裁剪,就不能再被恢复!

    boolean clipPath(Path path)

    boolean clipPath(Path path, Region.Op op)

    boolean clipRect(Rect rect, Region.Op op)

    boolean clipRect(RectF rect, Region.Op op)

    boolean clipRect(int left, int top, int right, int bottom)

    boolean clipRect(float left, float top, float right, float bottom)

    boolean clipRect(RectF rect)

    boolean clipRect(float left, float top, float right, float bottom, Region.Op op)

    boolean clipRect(Rect rect)

    boolean clipRegion(Region region)

    boolean clipRegion(Region region, Region.Op op)

  2. 画布的保存于恢复

    Save():每次调用Save()函数,都会把当前的画布的状态进行保存,然后放入特定的栈中;

    restore():每当调用Restore()函数,就会把栈中最顶层的画布状态取出来,并按照这个状态恢复当前的画布,并在这个画布上做画。

先声明:这篇文章是自己买了本启舰大神的书,然后边看出,边看他博客,摘下来一些东西。自己写这个东西,一是加深自己的理解,二是为了方便自己在坐地铁的时候,学习看,方便。

出处:https://blog.csdn.net/harvic880925/article/details/39080931

最后强烈建议大家买一本启舰大神的《Android自定义控件入门与实战》这本书,写的很好,通俗易懂。
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值