探索Android应用开发(六)

android

android

学习目标:

  1. 载入统计图表

学习目的:

  1. 掌握网络读取图片
  2. 掌握图片常见操作

学习收获:

应用中使用图片,可以提供应用的友好性,增强用户的体验好感。读取文件系统上的图片,需要首先生成图片。但是,在统计报表时,都是要根据数据生成新图片。 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);

Leave a comment

Your comment