zoukankan      html  css  js  c++  java
  • Android之简单了解Bitmap显示图片及缓存图片

     昨天我们学了如何连接网络,今天我们就学习一下如何从把网上图片显示到项目中

    今天主要用到的是Bitmap 类

      Bitmap是Android系统中的图像处理的最重要类之一。用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件

      具体作用属性参考官方API: https://msdn.microsoft.com/zh-cn/library/system.drawing.bitmap(v=vs.110).aspx

    不多说,看案例吧

     做一个图片显示器:

    activity_main.xml

     1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     android:orientation="vertical"
     6     tools:context="com.example.imagelook.MainActivity" >
     7 
     8     <EditText
     9         android:id="@+id/et_path"
    10         android:layout_width="match_parent"
    11         android:layout_height="wrap_content"
    12         android:hint="@string/editText" >
    13     </EditText>
    14 
    15     <Button
    16         android:id="@+id/button1"
    17         android:layout_width="wrap_content"
    18         android:layout_height="wrap_content"
    19         android:onClick="click"
    20         android:text="@string/btn" />
    21 
    22     <ImageView
    23         android:id="@+id/iv"
    24         android:layout_width="wrap_content"
    25         android:layout_height="wrap_content"/>
    26 
    27 </LinearLayout>

    mainAcitivity.java

    package com.example.imagelook;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Base64;
    import android.view.View;
    import android.widget.EditText;
    import android.widget.ImageView;
    
    
    public class MainActivity extends Activity {
        
        private EditText et_path;
        private ImageView iv;
        
        private Handler handler = new Handler(){
            //处理消息
            public void handleMessage(Message msg) {
                
                Bitmap bitmap = (Bitmap) msg.obj;
                iv.setImageBitmap(bitmap);
            };
        };
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            //1、找控件
            et_path = (EditText) findViewById(R.id.et_path);
            iv = (ImageView) findViewById(R.id.iv);
            
        }
        
        //2、点击按钮进行查看指定路径的源码
        public void click(View v) throws IOException {
            
            new Thread(){
                public void run(){
                    try {
                        //2.1、获取访问图片的路径
                        String path = et_path.getText().toString().trim();
                        
                        File file = new File(getCacheDir(),Base64.encodeToString(path.getBytes(), Base64.DEFAULT));//test.png
                        if( file.exists() && file.length()>0 ) {
                            //使用缓存的图片
                            System.out.println("使用缓存图片");
                            Bitmap cacheBitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
                            //把cacheBitmap显示到iv上
                            Message msg = Message.obtain();
                            msg.obj = cacheBitmap ;
                            handler.sendMessage(msg);
                            
                        }else{
                            //第一次访问 联网缓存图片
                            System.out.println("第一次访问连接网络");
                                
                            
                            //2.2 创建URL对象
                            URL url = new URL(path);
                            
                            //2.3 获取httpURLConnection
                            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                            
                            //2.4 设置请求方式
                            conn.setRequestMethod("GET");
                            
                            //2.5设置超时时间
                            conn.setConnectTimeout(5000);
                            
                            //2.6获取服务器状态码
                            int code = conn.getResponseCode();
                            if (code == 200){
                                //2.7 获取图片数据 不管是什么数据(text 图片)都是以流行式返回
                                InputStream in = conn.getInputStream();
                                
                                //2.7缓存图片 谷歌提供一个缓存目录
                                FileOutputStream fos =  new FileOutputStream(file);
                                int len = -1 ;
                                byte[] buffer = new byte[1024];//1kb
                                while((len = in.read(buffer)) != -1){
                                    fos.write(buffer,0,len);
                                }
                                fos.close();
                                in.close();
                                
                                //2.8 通过位图工厂获取bitmap
                                //Bitmap bitmap = BitmapFactory.decodeStream(in);
                                Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());//读取缓存
                                
                                //2.9 把bitmap 显示到iv上
                                Message msg = Message.obtain();//消息池有消息池拿数据,没有new一个
                                msg.obj = bitmap ;
                                handler.sendMessage(msg);//发消息
                                
                            }
                    
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                };
            }.start();
            
        }
    
    }

    配置好就可以运行看下效果了

     

    下面说一下,案例的小细节吧!

      因为图片如果每次加载,每次都要从网上读取数据流,显示到手机上面,这样很容易浪费客户流量,所以第一访问时可以下载图片,以后访问直接访问内存里的就好了。

      1、判断客户是否是第一次访问

      2、多线程访问网络

      

      

      第一次访问,创建cache文件夹并保存文件

       

    打印日志

     

     再次访问,从文件中取出

     我们可以在手机中清除缓存

    例如海马玩模拟器:设置—>应用—>照片查看器—>清除缓存

      

      如果我们不给图片起名字,像这样 

      

      下面是生成的文件名

     

       所以我们手机经常会莫名其妙的出现一些我们看不懂得文件,

      其实只是做了这一个小小的动作,让用户不敢随便删除我们的文件

  • 相关阅读:
    atitit...触发器机制 ltrigger mechanism sumup .的总结O8f
    atitit. 集合groupby 的实现(2)---自定义linq查询--java .net php
    atitit. groupby linq的实现(1)-----linq框架选型 java .net php
    atitit.j2ee 1.5 1.6 的不同跟 Servlet 3.0新特性总结
    Atitit. 常用街机系统and 模拟器总结 snk neo geo cps mame sfc smc
    atitit. access token是什么??微信平台公众号开发access_token and Web session保持状态机制
    atitit.二进制数据无损转字符串网络传输
    atitit.压缩算法 ZLib ,gzip ,zip 最佳实践 java .net php
    Atitit.现实生活中最好使用的排序方法-----ati排序法总结
    atitit.修复xp 操作系统--重装系统--保留原来文件不丢失
  • 原文地址:https://www.cnblogs.com/lgk1002/p/6147043.html
Copyright © 2011-2022 走看看