Android显示assets目录下的图片

ImageView对象image用来显示图片。
String[] Images  用来装assets目录下所有文件及目录名。
为什么要用来装文件名?
是因为 要显示图片,就要获取一个bitmap对象(位图),然后用image.setImageBitmap(bitmap)方法将图片显示。
那如何获取bitmap对象呢?

因为我们需要从assets目录获取图片,当然就应该将assets目录下的图片转化为bitmap对象。
计算机如何知道我们要获取assets目录的文件又将其装换成bitmap对象呢?

这时我们想到了输入流InputStream,读文件当然要用输入流!
如何获取这个InputStream对象?Android提供了AssetsManager类,我的理解就是assets目录的资源管理器

它提供了两个重要的方法:

final String[]     list(String path)
                   返回指定路径下的所以文件及目录名。

final InputStream  open(String fileName)
                   使用 ACCESS_STREAMING模式打开assets下的指定文件。

这样就很明了了。
先用getAssets()方法,返回应用程序包的一个AssetsManager的一个实例assets。
再用assets.list(path)返回文件名的字符串数组,用Images装起来。path为""时,返回所有文件名。
再用assets.open(Images[currentImg])返回ImputStream对象input,这个对象可以对assets目录进行读操作。

回到刚才的问题,如何获取bitmap对象?
我们需要将输入流解码为位图。
BitmapFactory类提供了静态方法decodeStream(input)专门将输入流解码为位图。这样就大功告成了。

是不是很懵?现在来理清下思路。

1.
String[] Images=null;
	AssetManager assets=null;
	int currentImg=0;
	ImageView image;

2. 找到要显示的文件的字符串数组存在Images字符串数组中
 image=(ImageView)findViewById(R.id.image);
        try{
        	assets=getAssets();         /*获取assets目录*/
        	Images=assets.list("");     /*返回给定路径中所有资源的字符串数组*/
        	
        }catch(IOException e){
        	e.printStackTrace();
        }

3. 获取输入流
InputStream input=null;
        		try{
        			input=assets.open(Images[currentImg++]);
        		}catch(IOException e){
        			e.printStackTrace();
        		}

4. 回收图片(为啥要回收图片可以百度一下)
BitmapDrawable bitmapDrawable=(BitmapDrawable)image.getDrawable();   //将image包装
        		
        		if(bitmapDrawable!=null&&!bitmapDrawable.getBitmap().isRecycled()){
        			bitmapDrawable.getBitmap().recycle();
        		}

5. 将输入流解码为bitmap,再将图片显示
image.setImageBitmap(BitmapFactory.decodeStream(input));

具体代码如下(简单的图片浏览器,代码来自《疯狂的Android讲义》):
package com.example.pictureviewer;

import java.io.IOException;
import java.io.InputStream;

import android.app.Activity;
import android.content.res.AssetManager;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;


public class MainActivity extends Activity {

	String[] Images=null;
	AssetManager assets=null;
	int currentImg=0;
	ImageView image;
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        image=(ImageView)findViewById(R.id.image);
        try{
        	assets=getAssets();         /*获取assets目录*/
        	Images=assets.list("");     /*返回给定路径中所有资源的字符串数组*/
        	
        }catch(IOException e){
        	e.printStackTrace();
        }
        
        final Button next=(Button)findViewById(R.id.next);
        
        next.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				if(currentImg>=Images.length){
        			currentImg=0;
        		}
        		
        		while(!Images[currentImg].endsWith(".png")){   //避开不是图片的文件
        			currentImg++;
        			if(currentImg>=Images.length){
            			currentImg=0;
            		}
        		}
        		//读文件操作
        		
        		InputStream input=null;
        		try{
        			input=assets.open(Images[currentImg++]);
        		}catch(IOException e){
        			e.printStackTrace();
        		}
        		
        		BitmapDrawable bitmapDrawable=(BitmapDrawable)image.getDrawable();   //将image包装
        		
        		if(bitmapDrawable!=null&&!bitmapDrawable.getBitmap().isRecycled()){
        			bitmapDrawable.getBitmap().recycle();
        		}
        		
        		image.setImageBitmap(BitmapFactory.decodeStream(input));
        	}
		}); 
    } 
    
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值