用Android Smart Image View做的一个网络图片浏览的Demo

还是两种方式都写出来,也看看有多smart

1.传统方式从网络上获取图片并显示

首先新建Android Project顺便也在Manifest把网络权限加了

activity_main.xml布局如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <EditText
        android:id="@+id/editText1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="http://image1.mop.com/images/project13/2010-07-09/12786407144078965.jpg" >

        <requestFocus
            android:layout_width="wrap_content"
            android:layout_height="match_parent" />
    </EditText>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/bt1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:onClick="click"
            android:text="浏览" />

        <Button
            android:id="@+id/bt2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:onClick="click"
            android:text="浏览(Smart)" />
    </LinearLayout>

    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher"
        android:visibility="gone" />
    <!-- 这里设置visibility为gone,默认不可见 -->

</LinearLayout>

因为不能在主线程访问网络,所以要从网络上下载图片需要写一个子线程,图片下载完成要通知主线程更新UI又要用到Handler

package com.example.imgviewer;

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.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {

	private EditText et1;
	private ImageView iv;
	private Handler mhandler;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		et1 = (EditText) findViewById(R.id.editText1);
		iv = (ImageView) findViewById(R.id.iv);
		
		mhandler = new Handler(){
			/**
			 * 这里收到消息然后转成Bitmap对象就可以设置到imageView上
			 * 最后设置imageView可见
			 */
			@Override
			public void handleMessage(Message msg) {
				if (msg.what == 0) {
					Bitmap bm = (Bitmap) msg.obj;
					iv.setImageBitmap(bm);
					// 设置可见才能显示出图片
					iv.setVisibility(View.VISIBLE);
				} else {
					Toast.makeText(iv.getContext(), "下载失败!", Toast.LENGTH_SHORT).show();
				}
			}
		};
	}

	public void click(View view){
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					URL url = new URL(et1.getText().toString());
					HttpURLConnection connection = (HttpURLConnection)url.openConnection();
					connection.setRequestMethod("GET");
					connection.setDoInput(true);
					connection.connect();
					InputStream is = connection.getInputStream();
					// 前面都是标准的写法获取输入流
					// 输入流解码成bitmap对象,然后通过handler发送出去
					Bitmap bm = BitmapFactory.decodeStream(is);
					Message msg = mhandler.obtainMessage(0, bm);
					mhandler.sendMessage(msg);
				} catch (Exception e) {
					e.printStackTrace();
					mhandler.sendMessage(mhandler.obtainMessage(-1));
				}
			}
		}).start();
		
	}
	
}

代码主要集中在Handler和Thread那里

下面是点击浏览的效果图


好,第一种方式就写完了


2.用Smart Image View实现

Smart Image View是一个开源项目,首先我们要去Smart Image View下载最新的代码

下载完成后解压,把src目录复制到现在的工程里面


然后项目结构就是这样了



然后在界面布局下面在添加一个SmartImageView,默认也设置为隐藏

<com.loopj.android.image.SmartImageView
        android:id="@+id/si"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone" />

最后的代码是这样的

package com.example.imgviewer;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import com.loopj.android.image.SmartImageView;

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.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {

	private EditText et1;
	private ImageView iv;
	private Handler mhandler;
	private SmartImageView siv;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		et1 = (EditText) findViewById(R.id.editText1);
		iv = (ImageView) findViewById(R.id.iv);
		siv = (SmartImageView) findViewById(R.id.si);
		
		mhandler = new Handler(){
			/**
			 * 这里收到消息然后转成Bitmap对象就可以设置到imageView上
			 */
			@Override
			public void handleMessage(Message msg) {
				if (msg.what == 0) {
					Bitmap bm = (Bitmap) msg.obj;
					iv.setImageBitmap(bm);
				} else {
					Toast.makeText(iv.getContext(), "下载失败!", Toast.LENGTH_SHORT).show();
				}
			}
		};
	}

	public void click(View view){
		
		switch (view.getId()) {
		case R.id.bt1:
			// 设置可见才能显示出图片
			siv.setVisibility(View.GONE);
			iv.setVisibility(View.VISIBLE);
			iv.setImageResource(R.drawable.ic_launcher);
			new Thread(new Runnable() {
				@Override
				public void run() {
					try {
						URL url = new URL(et1.getText().toString());
						HttpURLConnection connection = (HttpURLConnection)url.openConnection();
						connection.setRequestMethod("GET");
						connection.setDoInput(true);
						connection.connect();
						InputStream is = connection.getInputStream();
						// 前面都是标准的写法获取输入流
						// 输入流解码成bitmap对象,然后通过handler发送出去
						Bitmap bm = BitmapFactory.decodeStream(is);
						Message msg = mhandler.obtainMessage(0, bm);
						mhandler.sendMessage(msg);
					} catch (Exception e) {
						e.printStackTrace();
						mhandler.sendMessage(mhandler.obtainMessage(-1));
					}
				}
			}).start();
			break;
		case R.id.bt2:
			// 设置可见才能显示出图片
			iv.setVisibility(View.GONE);
			siv.setVisibility(View.VISIBLE);
			siv.setImageUrl(et1.getText().toString(),R.drawable.ic_launcher);
			break;
		}
	}
	
}

点击浏览就是传统方式,浏览(Smart)就是SmartImage多View

分别点击几次后发现无论是第一次下载速度还是切换速度都是Smart占优

更重要的还是Smart Image View 仅用一行代码

siv.setImageUrl(et1.getText().toString(),R.drawable.ic_launcher);

就实现了之前的Thread+Handler几十行代码的功能,还带有缓存机制,是智能多了

SmartImageView 是继承至 ImageView ,所以兼容性应该不是什么问题,而且本身也是作为ImageView的替代品做出来的

SmartImageView is a drop-in replacement for Android’s standard ImageView which additionally allows images to be loaded from URLs or the user’s contact address book. Images are cached to memory and to disk for super fast loading.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值