1.3.1 位图与图形互转

Android的图形管理使用图形工具Drawable类,位图管理使用位图工具Bitmap类。其中,Drawable用于在界面上展示图片,Bitmap用于加工图像数据,鉴于图像加工完最终还得显示出来,故而位图归根到底仍是图形的一个分类。

位图图形BitmapDrawable正是二者之间的桥梁,图形对象与位图对象互转都需要它。其中,Bitmap转Drawable的代码如下所示:

     // 把位图对象转换为图形对象
     Drawable drawable = new BitmapDrawable(getResources(), bitmap);

Drawable转Bitmap的代码如下所示:

     // 把图形对象转换为位图对象
     Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap();

图形对象转成位图对象有个前提,就是该图形原本便是位图格式,否则会转换失败。

位图对象为什么要转成图形对象呢?(ImageView已经存在setImageBitmap方法,根本不用转成图形对象后再调用setImageDrawable方法)这是因为有很多控件只支持设置图形,不支持设置位图,包括但不限于下列场合:

(1)视图基类View,调用setBackground方法设置背景图形。

(2)文本视图TextView,调用setCompoundDrawables方法设置上下左右四方向的图标。

(3)复合按钮CompoundButton,调用setButtonDrawable方法设置左侧的勾选图标。

此外,位图对象转成图形对象之后能够调用Drawable的各个方法。例如,Drawable类有个setAlpha方法,可以设置图形的灰度值。其值为255时表示不透明,此时图形正常显示;其值为0时表示全透明,此时图形完全消失;其值为127时为半透明,此时图形若隐若现。下面是位图转图形后再调用setAlpha方法的示例代码:

(完整代码见picture\src\main\java\com\example\picture\DrawableConvertActivity.java)

     // 根据指定位图创建图形对象
     Drawable drawable = new BitmapDrawable(getResources(), mOriginBitmap);
     drawable.setAlpha((int) (255*ratio));               // 设置图形的灰度值
     iv_picture.setImageDrawable(drawable);              // 设置图像视图的图形对象

运行并测试该App,可观察到图形灰度效果如图1-20和图1-21所示。图1-20为不透明时的画面,图1-21为半透明时的画面。

图1-20 不透明时的画面

图1-21 半透明时的画面