ImageView对象image用来显示图片。
2. 找到要显示的文件的字符串数组存在Images字符串数组中
3. 获取输入流
4. 回收图片(为啥要回收图片可以百度一下)
5. 将输入流解码为bitmap,再将图片显示
具体代码如下(简单的图片浏览器,代码来自《疯狂的Android讲义》):
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));
}
});
}
}