GridView 异步加载SD卡图片
来源:互联网 发布:阿里云服务器导入sql 编辑:程序博客网 时间:2024/05/16 10:01
用GridView实现异步加载SD卡图片,图片无错位。
初学安卓,遇到了很多问题,在网上得到了很多帮助,谢谢各位好心人。把代码发下来与大家分享,有啥问题欢迎讨论~
import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.app.ProgressDialog;import android.content.Intent;import android.os.Bundle;import android.os.Environment;import android.util.DisplayMetrics;import android.util.Log;import android.view.Menu;import android.widget.GridView;public class MainActivity extends Activity {private String mRootPath = Environment.getExternalStorageDirectory().getPath()+"/"+"dcim"+"/"; private Intent mIntent;private ProgressDialog m_ProgressDialog = null; final int MENU_ONE = Menu.FIRST; final int MENU_TWO = Menu.FIRST + 1; public static List<String> lstFilePath = null; /** 清除LST */public static void unloadLstFilePath() { if (lstFilePath != null) { lstFilePath.clear(); lstFilePath = null; } } private void getValues() { if (lstFilePath == null) { Log.v("***InLstFilePath***", "OK"); lstFilePath = new ArrayList<String>(); lstFilePath.clear(); new FileTool().ListFiles(mRootPath, lstFilePath); String addPath = this.getFilesDir().getPath(); new FileTool().ListFiles(addPath, lstFilePath); } else { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } ; } runOnUiThread(returnRes); } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mIntent = this.getIntent(); Runnable viewOrders = new Runnable() { public void run() { getValues(); } }; Thread thread = new Thread(null, viewOrders, "MagentoBackground"); thread.start(); m_ProgressDialog = ProgressDialog.show( MainActivity.this, "请稍后", "数据读取中...", true); } private Runnable returnRes = new Runnable() { public void run() { DisplayMetrics metric = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metric); int columnWidth = metric.widthPixels/4; // 屏幕宽度(像素) GridView gridview = (GridView) findViewById(R.id.gv_photolist); GridViewAdapter iadapter = new GridViewAdapter(MainActivity.this, lstFilePath); gridview.setAdapter(iadapter); gridview.setColumnWidth(columnWidth); m_ProgressDialog.dismiss(); } };}
import java.util.List;import com.yjx.yibu.AsyncImageLoader3.ImageCallback;import android.content.Context;import android.graphics.Bitmap;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;public class GridViewAdapter extends BaseAdapter {private LayoutInflater layoutInflater;private List<String> imgUrls;private AsyncImageLoader3 imageLoader = new AsyncImageLoader3();public GridViewAdapter(Context context, List<String> imgUrls) {layoutInflater = LayoutInflater.from(context);this.imgUrls = imgUrls;}@Overridepublic int getCount() {return imgUrls.size();}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {final ViewHolder viewHolder;String path = imgUrls.get(position);if(convertView==null) {viewHolder = new ViewHolder();convertView = layoutInflater.inflate(R.layout.photolist_item, null);viewHolder.ivImage = (ImageView)convertView.findViewById(R.id.iv_photoicon_photolist_item);viewHolder.ivImage.setScaleType(ImageView.ScaleType.CENTER);convertView.setTag(viewHolder); }else {viewHolder = (ViewHolder)convertView.getTag();} Bitmap cachedImage = imageLoader.loadBitmap(path,viewHolder.ivImage, new ImageCallback() { public void imageLoaded(Bitmap imageBitmap,ImageView image,String imageUrl) { viewHolder.ivImage.setImageBitmap(imageBitmap);}}); if(cachedImage!= null) { viewHolder.ivImage.setImageBitmap(cachedImage); }else if(cachedImage == null) {viewHolder.ivImage.setImageResource(R.drawable.icon); }return convertView;}class ViewHolder {/*** 图片*/public ImageView ivImage;/*** 图片信息*///public TextView tvInfo;}}
import java.lang.ref.SoftReference;import java.util.HashMap;import java.util.Map;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import android.graphics.Bitmap;import android.os.Handler;import android.widget.ImageView;public class AsyncImageLoader3 {// 为了加快速度,在内存中开启缓存(主要应用于重复图片较多时,或者同一个图片要多次被访问,比如在ListView时来回滚动)public Map<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>();private ExecutorService executorService = Executors.newFixedThreadPool(5); // 固定五个线程来执行任务private final Handler handler = new Handler();/*** * @param imageUrl* 图像url地址* @param callback* 回调接口* @return 返回内存中缓存的图像,第一次加载返回null*/public Bitmap loadBitmap(final String imageUrl, final ImageView image,final ImageCallback callback) {// 如果缓存过就从缓存中取出数据if (imageCache.containsKey(imageUrl)) {SoftReference<Bitmap> softReference = imageCache.get(imageUrl);if (softReference.get() != null) {return softReference.get();}}// 缓存中没有图像,则从SDcard取出数据,并将取出的数据缓存到内存中executorService.submit(new Runnable() {public void run() {try {final Bitmap bitmap = loadImageFromSD(imageUrl); imageCache.put(imageUrl, new SoftReference<Bitmap>(bitmap));handler.post(new Runnable() {public void run() {callback.imageLoaded(bitmap, image,imageUrl);}});} catch (Exception e) {throw new RuntimeException(e);}}});return null;}// 从SDcard取数据方法protected Bitmap loadImageFromSD(String path) {try {// 测试时,模拟网络延时,实际时这行代码不能有//SystemClock.sleep(2000);Bitmap bm = new BitmapTool().charge(path);return bm;} catch (Exception e) {throw new RuntimeException(e);}}// 对外界开放的回调接口public interface ImageCallback {// 注意 此方法是用来设置目标对象的图像资源public void imageLoaded(Bitmap imageDrawable, ImageView image, String imageUrl);}}
import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Matrix;public class BitmapTool {public BitmapTool() {}/** 图片适配大小 */ public Bitmap change(String path) { Bitmap bm = null; BitmapFactory.Options optsa = new BitmapFactory.Options(); optsa.inSampleSize = 10; bm = BitmapFactory.decodeFile(path, optsa); if(bm != null) { } else { return null; } /**不同尺寸图片的缩放比例*/ if((bm.getHeight() ) <=150 || (bm.getWidth()) <=100 ) { optsa.inSampleSize = 1; bm = BitmapFactory.decodeFile(path, optsa); } else if( (bm.getHeight() )<=300 || (bm.getWidth()) <= 200){ optsa.inSampleSize =10; bm = BitmapFactory.decodeFile(path, optsa);} else if( ( (bm.getHeight() )<=450 ) ||( (bm.getWidth()) <= 300)){ optsa.inSampleSize =20; bm = BitmapFactory.decodeFile(path, optsa); } else if( ((bm.getHeight() )<=600 ) ||( (bm.getWidth()) <= 400)){ optsa.inSampleSize =30; bm = BitmapFactory.decodeFile(path, optsa); } else if( ( (bm.getHeight() )<=750 ) ||( (bm.getWidth()) <= 500)) { optsa.inSampleSize = 40; bm = BitmapFactory.decodeFile(path, optsa); } else if( ((bm.getHeight() )<=900 ) ||( (bm.getWidth()) <= 600)) { optsa.inSampleSize = 50; bm = BitmapFactory.decodeFile(path, optsa); } else { optsa.inSampleSize = 60; bm = BitmapFactory.decodeFile(path, optsa); } return bm; } /** 图片适配大小 ,同时缩放比例*/ public Bitmap charge(String path) { Bitmap bm = this.change(path); int sWidth = bm.getWidth(); int sHeigth = bm.getHeight(); if(bm != null) { bm = this.zoomImage(bm, sWidth,sHeigth); } return bm; } /*** * 图片的缩放方法 * * @param bgimage * :源图片资源 * @param newWidth * :缩放后宽度 * @param newHeight * :缩放后高度 * @return */ public Bitmap zoomImage(Bitmap bgimage, int newWidth, int newHeight) { // 获取这个图片的宽和高 int width = bgimage.getWidth(); int height = bgimage.getHeight(); // 创建操作图片用的matrix对象 Matrix matrix = new Matrix(); // 计算缩放率,新尺寸除原始尺寸 float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; // 缩放图片动作 matrix.postScale(scaleWidth, scaleHeight); Bitmap bitmap = Bitmap.createBitmap(bgimage, 0, 0, width, height, matrix, true); return bitmap; }}
import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.util.List;import android.os.Environment;import android.util.Log;public class FileTool { /** 图片内存最小值 5K */ private final static int PIC_FILE_SIZE_MIN = 5; /** 图片内存最大值 300K */ private final static int PIC_FILE_SIZE_MAX = 6000; /** * 遍历目录,得到所有图片文件路径集群 * @param path * @return */ public void ListFiles(String path, List<String> lstPaths){ File file = new File(path); if(file == null) return; if(file.isDirectory() ) { String curpath = Environment.getExternalStorageDirectory().getPath()+"/"+"dcim"+"/"+".thumbnails"; if(path.equals(curpath)) return; } File[] fs = file.listFiles(); if(fs==null) return; for(File f : fs){ if(f==null) continue; String fName = f.getName(); String htx = fName.substring(fName.lastIndexOf(".") + 1, fName.length()).toLowerCase(); //得到扩展名 if(htx.equals("png") || htx.equals("jpg") || htx.equals("gif") || htx.equals("bmp")) { if(fileSizeValidity(f.getPath())) { lstPaths.add(f.getPath()); Log.v("***PIC_FILE***", fName); } } else { } path = f.getAbsolutePath(); if(f.isDirectory() == true) { ListFiles(path, lstPaths); //当f为文件夹的时候,进入文件夹中 } } } /** * 判断文件大小有效性 * 如果文件内存在5K-300K之间则有效,否则返回FALSE * @param path * @return */ private boolean fileSizeValidity(String path) { File f = new File(path); if(f.exists()) { int cur = 0; FileInputStream fis = null; try { fis = new FileInputStream(f); cur = fis.available()/1000; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } //图片内存在5K-300K之间,表示有效 if(cur>=PIC_FILE_SIZE_MIN && cur<=PIC_FILE_SIZE_MAX) return true; } return false; }}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/fillable_area" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal" android:orientation="vertical" ><GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gv_photolist" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="10dp" android:verticalSpacing="10dp" android:horizontalSpacing="10dp" android:numColumns="auto_fit" android:columnWidth="100dp" android:stretchMode="columnWidth" android:gravity="center" ></GridView></LinearLayout>
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="wrap_content" android:paddingBottom="4dip" android:layout_width="fill_parent"> <ImageView android:layout_height="100px" android:layout_width="150px" android:layout_centerHorizontal="true"android:id="@+id/iv_photoicon_photolist_item"/> </RelativeLayout>
- GridView 异步加载SD卡图片
- Android GridView 异步加载图片
- Android GridView 异步加载图片
- Android GridView 异步加载图片
- Android GridView 异步加载图片
- Android GridView 异步加载图片
- Android GridView 异步加载图片
- android gridview 异步加载图片
- Android异步加载图片,并缓存到SD卡
- Android 异步加载图片-LruCache和SD卡或手机缓存-三级缓存原理加载图片
- ListView与GridView异步加载图片
- webService异步加载GridView中图片
- GridView异步加载本地图片缩略图
- webService异步加载GridView中图片
- ListView,GridView高效异步加载图片
- Android ListView和GridView异步加载图片
- 安卓GridView异步加载网络图片
- ListView与GridView异步加载图片
- DB2报错: SQLSTATE=57016
- Throw nails hdu多校联赛10 1004 水题
- 重写Dialog,让Dialog成为类似于数字键盘
- 网易有道算法题
- μt产生红种的临时解决方法
- GridView 异步加载SD卡图片
- 碱性电池与碳性电池区别
- spring 异常
- phpwind 8.7 用户注册UID控制
- 算法导论-13-3-AVL树
- RAC4——架构和变化
- Discuz X2 数据库连接文件和参数介绍
- 数据连接池+图解
- JAVA NIO总结(四)—网络和异步IO