最近刚接触自定义View的时候,看到Canvas有一个构造函数需要传入一个Bitmap,不解。于是有了这篇文章!

我们先看Canvas的定义:

The Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into the bitmap), a drawing primitive (e.g. Rect, Path, text, Bitmap), and a paint (to describe the colors and styles for the drawing).

译:想要画一些东西,你需要4个基本的组件:一个Bitmap来保存像素,一个Canvas用于承载绘制调用(比如drawLine等方法),一个绘制源(比如:Rect,Path,text,Bitmap),一个Paint(即画笔,用于描述绘制的颜色和样式)。

这句话说明Bitmap是用来保存像素的,即保存我们画的东西。

先看看它的构造函数:

①public Canvas ()

Construct an empty raster canvas. Use setBitmap() to specify a bitmap to draw into. The initial target density is DENSITY_NONE; this will typically be replaced when a target bitmap is set for the canvas.

译:这里说是构造一个空的画布,之后可以使用setBitmap来指定一个bitmap用来画东西(说明我们画的操作都是画到指定的bitmap上去的,这里很重要)。初始密度是DENSITY_NONE,这个通常会在为画布设置bitmap时被替换。

②public Canvas (Bitmap bitmap)

Construct a canvas with the specified bitmap to draw into. The bitmap must be mutable.The initial target density of the canvas is the same as the given bitmap's density.

译:构造一个带有给定bitmap的画布,画东西到bitmap里面去,这个bitmap必须是可变的。画布的初始密度和给定的bitmap的密度一致。

Bitmap是什么?

简单来说,Bitmap是位图文件,它将图像定义为由点(像素)组成,每个点可以由多种色彩表示。

Canvas和Bitmap什么关系?

从上面可以看出,我们画的东西都是存放在指定的Bitmap上的。canvas只是起到一个中介的作用,它承载了画的方法(比如drawLine,drawCircle等)。这样就好理解了。

下面用一个Demo来更清晰地认识它:

xml布局文件

<?xml version="1.0" encoding="utf-8"?>    

很简单,红色背景,里面有一个ImageView,等下用来显示图片。

MainActivity.class

    private ImageView mImageView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mImageView = findViewById(R.id.iv_tes);        //android不允许直接修改res里面的图片,所以要用copy方法        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher).copy(Bitmap.Config.ARGB_8888,true);        Canvas mCanvas = new Canvas(bitmap);        mCanvas.drawARGB(255,0,255,0);        mImageView.setImageBitmap(bitmap);    }

这里从资源文件中获取bitmap,因为android不允许直接修改res里面的文件,所以这里获取后要用copy方法复制一个,这样就不会修改res里面的文件,图片如下:

获取到bitmap后,用该bitmap作为参数构造一个Canvas,然后调用canvas的drawARGB方法,给整张图片涂上绿色(一片草原),然后显示该bitmap到ImageView。

结果如下:

可以看到,我们的android机器人图片确实被涂成了绿色。并且canvas的大小和图片的大小是一直的。

那么有人会问:不要bitmap行不行?

可以,没有bitmap,单单一个Canvas一样可以调用它的drawARGB等方法,不会报错,但是,你无法保存,既然无法保存,那画来做什么?

这里可以得出结论:

Canvas构造函数需要传入一个Bitmap,该bitmap是我们对canvas进行操作的载体,比如调用canvas的drawLine方法画一条线,将会把线画到bitmap里去。Canvas直接对该Bitmap对象进行修改,Bitmap保存我们的操作。 

 

喜欢点个赞!是对我最大的支持!

更多相关文章

  1. Android调用摄像头和相册
  2. Android使double保留两位小数的多方法 java保留两位小数
  3. android ndk 给结构体赋值的方法
  4. 关于android开发中的@Override
  5. 如何使用好android的可访问性服务(Accessibility Services)
  6. 从dumpsys自定义服务来认识Android(安卓)binder
  7. Android通过webview调起微信和支付宝app进行支付
  8. Android开发------------杂记
  9. android_apps_frameworks_通话处理流程

随机推荐

  1. 老大,咱们前端要不要招个妹子?
  2. 我的入职体验,高手如云,美女也如云!
  3. GUI实战|Python做一个文档图片提取软件
  4. 用Python爬取b站弹幕,看大家还会接受《爱
  5. 动态加密?看我如何见招拆招爬取某点评全站
  6. 收藏这些API,获取网易云音乐数据超轻松
  7. Fabric 源码学习:如何实现批量管理远程服
  8. 只要两步,用Python将地址标记在地图上!
  9. Ansible 之 通过yum模块安装软件
  10. 如何面对人生中的逆境?