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 半透明时的画面