zoukankan      html  css  js  c++  java
  • 对于Canvas和Bitmap的一点认识

    在Android关于Canvas的API描写叙述中,一開始就例如以下描写叙述:

    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来接收draw的调用(draw的结果是将像素给画到前面所讲的Bitmap中),
    一个源,即是你想画的东西(比方矩形,路径。文本,抑或还有一个位图),最后就是一个画笔(描写叙述想画的颜色和风格等)

    无意中看到这描写叙述,我对Canvas和Bitmap的理解突然间有种原来就是这么简单的感觉。

    Bitmap
    首先想像一下。我们在屏幕上看到的图像。都是由一个一个的像素组成的,那么这些像素是从哪来的?由上面这句话,我们就知道答案了,这些像素就是存放在
    Bitmap中的,由此。我们能够觉得Bitmap就是用来直接展示在窗体上的一个显示对象,它是一个终于的产品。
    我们知道,通过BitmapFactory。我们能够从资源(Resource),InputStream和文件里创建出一个Bitmap,并将其交给控件使用。

        public static Bitmap readBitmapFromResource(Context context, int resId) {
            BitmapFactory.Options op = new BitmapFactory.Options();
            op.inPreferredConfig = Bitmap.Config.ARGB_8888;
            op.inDither = false;
            op.inScaled = false;
    
            InputStream is = context.getResources().openRawResource(resId);
            return BitmapFactory.decodeStream(is, null, op);
        }

    Canvas
    那么怎么理解Canvas呢?

        Bitmap bitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);        
        Canvas canvas = new Canvas(bitmap);

    上面是创建Canvas的一段代码,由这。我们知道,要创建Canvas,必须先创建一个Bitmap对象,并将其作为參数传给Canvas。


    那么,我们能够仅仅创建Canvas,然后不给其传递Bitmap对象吗?
    不能够!
    为什么?
    Canvas 本意是画布的意思,可是在Android中。它就仅仅是一个媒介,能够通过Canvas来调用drawRect,drawCircle等等,可是实际上画的这些东西终于展现的时候,
    都是像素。可是仅仅有Bitmap才干保存像素,而Canvas并不行,所以在创建Canvas的时候,就必须传递一个Bitmap,用来承载画的内容。
    能够这么理解。如今在我们面前有一张空白的纸(Bitmap),可是我们不能将画笔直接点到上面,我们必须先在这张纸上面放一块画布(Canvas),然后我们在这张画布上
    開始点点点…最后。我们就能够看到,我们全部的形为都通过画布作用到纸上了。这时候。那张空白的纸已经是一张画了,而我们掀掉画布,就能够直接将这张画给别人看了。
    而此时。Canvas已经没有作用了,它的作用仅仅在于承接我们的画笔操作,然后将所相应位置的像素存储到相应的Bitmap中。

        canvas.drawPath(mPath, mHighlightPaint);
        return bitmap;

    不知道,这么说,大家能够理解Canvas和Bitmap的关系不?
    简单地说,我们要进行画画的操作,我们须要通过Canvas来实现。可是每个Canvas都必须有相相应的Bitmap来承载内容,我们在Canvas上所作的操作终于都是会写到Bitmap中的。
    而终于展现给用户看的内容,也是通过Bitmap来展现的。
    上面还讲到两个东西,一个drawing primitive,一个paint。就比較好理解了。就不在这里多说了。

    Drawable
    而我们常常还会遇到一个Drawable的类,那这个东西又是什么呢,跟Bitmap又有什么关系呢?

    A Drawable is a general abstraction for “something that can be drawn.”
    Drawable就是能够被画到画布上的对象。

    所以,Bitmap是一种Drawable,于是有了BitmapDrawable。颜色是一种Drawable,所以有了ColorDrawable. 形状是一种Drawable。所以有了ShapeDrawable。
    个人觉得。它就是一个相似接口之类的东西,而本质上它也是一个抽象类,继承了Drawable,就表明这东东是可绘制的。

  • 相关阅读:
    EXTJS 4.2 资料 控件之checkboxgroup的用法(静态数据)
    EXTJS 4.2 资料 控件之Window窗体相关属性的用法
    EXTJS 4.2 资料 控件之textfield文本框加事件的用法
    Entity Framework 学习笔记(一)之数据模型 数据库
    EXTJS 4.2 资料 控件之checkboxgroup的用法(动态数据)
    EXTJS 4.2 资料 控件之Grid 列鼠标悬停提示
    Entity Framework 学习笔记(二)之数据模型 Model 使用过程
    EXTJS 4.2 资料 控件之radiogroup 的用法
    EXTJS API
    vue移动端弹框组件,vue-layer-mobile
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7374701.html
Copyright © 2011-2022 走看看