探索Android应用开发(六)
学习目标:
- 载入统计图表
学习目的:
- 掌握网络读取图片
- 掌握图片常见操作
学习收获:
应用中使用图片,可以提供应用的友好性,增强用户的体验好感。读取文件系统上的图片,需要首先生成图片。但是,在统计报表时,都是要根据数据生成新图片。 Android是否提供类似JFreechart的支持,现在还不可而知。不过,解决这个问题,我们可以通过将图片在网络服务器上生成以后,下载到手机上。
通过对SDK的了解,采用下面代码显示图片:
ImageView view = new ImageView(context); Uri imageUri = Uri.parse("http://www.somesite.com/test.png"); view.setImageURI(imageUri); |
但是这段代码是无法执行的,因为执行时出现诸如以下问题:
04-11 15:28:13.492: INFO/System.out(387): resolveUri failed on bad bitmap uri: chart.apis.google.com/chart?cht=p3&chd=t:60,40&chs=250×100&chl=Hello|World
追查源代码,在ImageView中,发现其调用了Drawable.createFromPath(mUri.toString());然后又在其中调用了BitmapFactory.decodeFile(pathName);最后调用stream = new FileInputStream(pathName);至此真相大白了,这个方法只支持从文件系统上读取,不支持网络读取。这不能让我对这个方法名产生了疑惑,是我没有理解清楚URI?URL就是URI。
一番研究以后,确定通过下面的代码解决这个问题:
public static Bitmap downloadBitmap(URL bitmapUrl) throws IOException { HttpURLConnection conn; InputStream is = null; BufferedInputStream bis = null; Bitmap bm; try { conn = (HttpURLConnection) bitmapUrl.openConnection(); conn.connect(); is = conn.getInputStream(); bis = new BufferedInputStream(is); bm = BitmapFactory.decodeStream(bis); } catch (IOException e) { Log.e("BitmapUtil", e.getMessage()); throw e; } finally { try { if (bis != null) { bis.close(); } if (is != null) { is.close(); } } catch (IOException e) { throw e; } } return bm; } |
有了图片以后,有时候还需要对图片进行一番调整,例如改变大小,进行旋转等,以下代码显示了这些操作:
Bitmap bm = BitmapUtil.downloadBitmap(url); Matrix matrix = new Matrix(); matrix.postRotate(90); // 旋转图片 Bitmap newBm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true); // 改变图片大小 Bitmap bigBm = Bitmap.createScaledBitmap(newBm, screenWidth, screenHeight, true); |