12.1.3 图像的呈现
在Android中,将图像数据呈现在用户面前,最常用的方式是使用图像控件android.widget.ImageView。ImageView提供了大量便捷的接口,可以用来呈现放置在内存、图片文件、资源文件中的图像信息[1]。
ImageView的实现非常简单,仅仅是将图像数据读取到内存中,按照一定的缩放比例展示出来,因此,ImageView无法满足很多场景下图像的呈现需求:
1)大尺寸图像的呈现。ImageView不支持缩放、拖动等交互,因此,无法很好地在有限的屏幕空间上呈现大尺寸的图像;
2)大图片文件的呈现。ImageView呈现存储图片文件时,会按照原始图片大小将图像数据读取到内存中而不会进行压缩,因此,如果图片文件过大,就会内存溢出进而导致应用崩溃;
3)存储在Web上的图像呈现。ImageView不支持通过网络获取图片信息以及呈现该信息;
4)图片特效。ImageView仅支持简单的图片缩放和对齐操作,而不提供其他更丰富的图像特效支持。
综上,ImageView适合简单的小图像呈现(比如图标、用户头像等)。在其他很多场景下,开发者需要自行控制图像的读取或交互。比如,如果需要使用ImageView来展示大图片文件,就不能直接使用ImageView.setImageURI函数设置文件路径,而需要先行对图片文件进行读取和压缩,而后在调用ImageView.setImageBitmap函数时呈现图片文件。
如果需要为图像数据呈现增加一些特效,开发者可以自定义符合需求的图像控件,通过重载View.onDraw函数来控制图像的呈现和展示。比如,如果需要为原始的图像增加水印,可以派生BitmapView类,并重载View.onDraw函数绘制水印信息:
protected void onDraw(Canvas canvas){
//绘制图像内容bitmap
Paint paint=new Paint();
canvas.drawBitmap(bitmap,0.0,0.0,paint);
//绘制水印logo
paint.setAlpha(0x60);
canvas.drawBitmap(logo,0.0,0.0,paint);
}
其中,android.graphics.Canvas对象是大家熟知的画板对象,它提供了很多便捷的接口供开发者使用,用来帮助开发者往屏幕上绘制图像、文字、图形等内容。但由于Canvas对象经过了多层封装,实现效率较低,如果需要更为复杂的图像图形呈现(比如,用来呈现复杂的游戏场景),则需要使用android.widget.SurfaceView控件,或者利用NDK中提供的OpenGL支持来实现。
[1]关于图像控件ImageView的更多介绍,可以参见第7章中的相关内容。