zoukankan      html  css  js  c++  java
  • android下载图片在手机中展示

    在项目开发中从互联网上下载图片是经常用到的功能,再次总结一下

    1.普通的下载方式

    布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent">
      
        <ImageView android:src="@drawable/icon" 
    	    android:layout_width="wrap_content" 
    	    android:id="@+id/imgPic" 
    	    android:layout_gravity="center|center_vertical" 
    	    android:layout_height="fill_parent">
        </ImageView>
            
    </LinearLayout>

    java文件

    public class DownloadImage extends Activity {
    	private ImageView imgPic;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.download_image);
    		imgPic = (ImageView) findViewById(R.id.imgPic);
    		String url = "http://ww1.sinaimg.cn/bmiddle/6834c769jw1djjf4p3p9rj.jpg";
    		loadRmoteImage(url);
    	}
    
    	/**
    	 * @param imgUrl
    	 *            远程图片文件的URL
    	 *             
    	 *            下载远程图片
    	 */
    	private void loadRmoteImage(String imgUrl) {
    		URL fileURL = null;
    		Bitmap bitmap = null;
    		try {
    			fileURL = new URL(imgUrl);
    		} catch (MalformedURLException err) {
    			err.printStackTrace();
    		}
    		try {
    			HttpURLConnection conn = (HttpURLConnection) fileURL
    					.openConnection();
    			conn.setDoInput(true);
    			conn.connect();
    			InputStream is = conn.getInputStream();
    			int length = (int) conn.getContentLength();
    			if (length != -1) {
    				byte[] imgData = new byte[length];
    				byte[] buffer = new byte[512];
    				int readLen = 0;
    				int destPos = 0;
    				while ((readLen = is.read(buffer)) > 0) {
    					System.arraycopy(buffer, 0, imgData, destPos, readLen);
    					destPos += readLen;
    				}
    				bitmap = BitmapFactory.decodeByteArray(imgData, 0,
    						imgData.length);
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		imgPic.setImageBitmap(bitmap);
    	}

    2.带进度条的下载

    有时候网络差,或者是图片太大,会出现黑屏的情况,用户体验比较差,那么增加一个进度条是提高用户体验的好方法

    /**
     * @author xushilin xsl xushilin@kingtoneinfo.com
     * @version: 创建时间:2011-7-27 下午02:55:56 
     * 说 明: android中下载图片 
     * 修改历史:
     */
    public class DownloadImage extends Activity {
    	private ImageView imgPic;	
    	private ProgressBar progressBar;
    	private int totalSize=0;
    	private int size=0;
    	private Handler mHandler;
    	String url = "http://ww1.sinaimg.cn/bmiddle/6834c769jw1djjf4p3p9rj.jpg";
    	private Bitmap bitmap=null;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.download_image);
    		imgPic = (ImageView) findViewById(R.id.imgPic);
    		
    		progressBar = (ProgressBar) findViewById(R.id.progressBar);
    		progressBar.setProgress(getProgressInt(progressBar.getMax()));
    		mHandler = new Handler() {
    			public void handleMessage(Message msg) {				
    				progressBar.setProgress(getProgressInt(progressBar.getMax()));		
    				if(bitmap!=null){
    					imgPic.setImageBitmap(bitmap);
    				}
    			}
    		};
    		new Thread(){	
    			public void run(){
    				loadRmoteImage(url);
    			}
    		}.start();
    	}
    
    	/**
    	 * @param imgUrl
    	 *            远程图片文件的URL
    	 *             
    	 *            下载远程图片
    	 */
    	private void loadRmoteImage(String imgUrl) {
    		URL fileURL = null;		
    		try {
    			fileURL = new URL(imgUrl);
    		} catch (MalformedURLException err) {
    			err.printStackTrace();
    		}
    		try {
    			HttpURLConnection conn = (HttpURLConnection) fileURL
    					.openConnection();
    			conn.setDoInput(true);
    			conn.connect();
    			InputStream is = conn.getInputStream();
    			int length = (int) conn.getContentLength();
    			totalSize=length;
    			if (length != -1) {
    				byte[] imgData = new byte[length];
    				byte[] buffer = new byte[512];
    				int readLen = 0;
    				int destPos = 0;
    				while ((readLen = is.read(buffer)) > 0) {					
    					System.arraycopy(buffer, 0, imgData, destPos, readLen);
    					destPos += readLen;
    					size=destPos;
    					mHandler.sendEmptyMessage(1);
    					Thread.sleep(100);
    				}
    				bitmap = BitmapFactory.decodeByteArray(imgData, 0,
    						imgData.length);
    				mHandler.sendEmptyMessage(1);
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		} catch (InterruptedException e) {			
    			e.printStackTrace();
    		}
    		
    	}
    	private  int getProgressInt(int max) {
    		int result = (totalSize > 0) ? (int) (size * max * 1.0 / totalSize) : 0;
    		return result;
    	}	
    }

    效果如下:

    下载过程

    image

    下载完成:

    image

  • 相关阅读:
    ios lazying load
    ios 单例模式
    ios 消息推送原理
    C#图片闪烁
    C#使窗体不显示在任务栏
    实时监测鼠标是否按下和鼠标坐标
    winfrom窗体的透明度
    C#获取屏幕的宽度和高度
    HDU 5171 GTY's birthday gift 矩阵快速幂
    HDU 5170 GTY's math problem 水题
  • 原文地址:https://www.cnblogs.com/vaiyanzi/p/2119825.html
Copyright © 2011-2022 走看看