zoukankan      html  css  js  c++  java
  • Drawable、Bitmap、Canvas和Paint的关系以及部分使用方法

    很多网友刚刚开始学习Android平台,对于Drawable、Bitmap、Canvas和Paint它们之间的概念不是很清楚,其实它们除了Drawable外早在Sun的J2ME中就已经出现了,但是在Android平台中,Bitmap、Canvas相关的都有所变化。

    首先让我们理解下Android平台中的显示类是View,但是还提供了底层图形类android.graphics,今天所说的这些均为graphics底层图形接口。

    Bitmap - 称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565、RGB888。作为一种逐像素的显示对象执行效率高,但是缺点也很明显存储效率低。我们理解为一种存储对象比较好。

    Drawable - 作为Android平下通用的图形对象,它可以装载常用格式的图像,比如GIF、PNG、JPG,当然也支持BMP,当然还提供一些高级的可视化对象,比如渐变、图形等。

    Canvas - 名为画布,我们可以看作是一种处理过程,使用各种方法来管理Bitmap、GL或者Path路径,同时它可以配合Matrix矩阵类给图像做旋转、缩放等操作,同时Canvas类还提供了裁剪、选取等操作。

    Paint - 我们可以把它看做一个画图工具,比如画笔、画刷。他管理了每个画图工具的字体、颜色、样式。 如果涉及一些Android游戏开发、显示特效可以通过这些底层图形类来高效实现自己的应用。

    1.Drawable -> Bitmap ((BitmapDrawable)res.getDrawable(R.drawable.youricon)).getBitmap();

    2.Bitmap -> Drawable
      Drawable d = new BitmapDrawable(bitmap);

    3.从资源中获取Bitmap

       a.通过decodeResource,这种方式不可取

       因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。

       Resources res=getResources();   

       Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic);  

      b.通过BitmapFactory.decodeStream方法,创建出一个bitmap

       InputStream is = context.getResources().openRawResource(R.drawable.app_sample_code);
       Bitmap bmp = BitmapFactory.decodeStream(is);

    4.Bitmap → byte[]

    private byte[] Bitmap2Bytes(Bitmap bm){   
        ByteArrayOutputStream baos = new ByteArrayOutputStream();     
        bm.compress(Bitmap.CompressFormat.PNG, 100, baos);     
        return baos.toByteArray();   
    }  

    5.byte[] → Bitmap

    private Bitmap Bytes2Bimap(byte[] b){   
                if(b.length!=0){   
                    return BitmapFactory.decodeByteArray(b, 0, b.length);   
                }   
                else {   
                    return null;   
                }   
     }  

    6. Bitmap → Drawable

    public static Drawable bitmap2Drawable(Bitmap bitmap){  
            return new BitmapDrawable(bitmap) ;  
    }  

    7.Drawable → Bitmap

    Drawable 转 bitmap时需要区分drawable是属于哪一类的图标,如果是NinePatchDrawable就不能直接转为BitmapDrawable来取得Bitmap了。

        public static Bitmap drawable2Bitmap(Drawable drawable){  
            if(drawable instanceof BitmapDrawable){  
                return ((BitmapDrawable)drawable).getBitmap() ;  
            }else if(drawable instanceof NinePatchDrawable){  
                Bitmap bitmap = Bitmap  
                        .createBitmap(  
                                drawable.getIntrinsicWidth(),  
                                drawable.getIntrinsicHeight(),  
                                drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888  
                                        : Bitmap.Config.RGB_565);  
                Canvas canvas = new Canvas(bitmap);  
                drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),  
                        drawable.getIntrinsicHeight());  
                drawable.draw(canvas);  
                return bitmap;  
            }else{  
                return null ;  
            }  
        }  

     

     

  • 相关阅读:
    【web前端】面题整理(2)
    【web前端】前段时间的面题整理(1)
    【js】什么是函数节流与函数去抖
    【感想文】对于情绪管理,我的感悟。
    【感想文】现代人的恋爱,已经不再是过去的一生只爱一个人了
    【插件】哔哩哔哩专栏区-文章朗读插件安装
    【js】版本号对比处理方案
    【js】了解前端缓存,收获不止于此!
    【js】关于this指针-理解call、apply、bind
    【读后感】爱的五种能力
  • 原文地址:https://www.cnblogs.com/error404/p/2140203.html
Copyright © 2011-2022 走看看