使用Viewpager制作图片阅读器(4)- 文件夹分类(附上源码)
来源:互联网 发布:c 编写windows程序 编辑:程序博客网 时间:2024/05/15 23:52
源码下载地址:http://download.csdn.net/detail/hewence1/7853405
我们现在做的是把所有的图片都放在一个list里面的,当比较多的时候显示加载就使用起来就不方便了。本文在上一节的基础上增加一个功能:
在进入list列表之前把图片的文件夹进行分类,点击对应的文件夹来查看本文件夹里面的内容,而不是查看android设备里面所有的图片。
先看一下效果
先新建一个图片文件夹的对应的实例类:
MyPhotoDir.java
public class MyPhotoDir { private String DirPath; private ArrayList<MyPhoto> mList = new ArrayList<MyPhoto>(); private Drawable mThumb; private String Name; public MyPhotoDir(String dirPath){ DirPath = dirPath; } public String getDirPath() { return DirPath; } public void setDirPath(String dirPath) { DirPath = dirPath; } public ArrayList<MyPhoto> getmList() { return mList; } public void setmList(ArrayList<MyPhoto> mList) { this.mList = mList; } public int getCount() { return mList.size(); } public Drawable getmThumb() { if (null == mThumb){ mThumb = createThumb(400 , 400); } return mThumb; } /** * 生成缩略图 */ private Drawable createThumb(int width , int height) { Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); canvas.drawARGB(0x99, 0xff,0xff, 0x00); final Paint paint = new Paint(); final int padding = width / 10; Bitmap bit0 , bit1 = null , bit2 = null , bit3 = null; if (mList.size() >= 4){ bit0 = ImageLoader.decodeSampledBitmapFromResource(mList.get(0).getPath(), width, height); bit1 = ImageLoader.decodeSampledBitmapFromResource(mList.get(1).getPath(), width, height); bit2 = ImageLoader.decodeSampledBitmapFromResource(mList.get(2).getPath(), width, height); bit3 = ImageLoader.decodeSampledBitmapFromResource(mList.get(3).getPath(), width, height); }else if (mList.size() == 3){ bit0 = ImageLoader.decodeSampledBitmapFromResource(mList.get(0).getPath(), width, height); bit1 = ImageLoader.decodeSampledBitmapFromResource(mList.get(1).getPath(), width, height); bit2 = ImageLoader.decodeSampledBitmapFromResource(mList.get(2).getPath(), width, height); }else if (mList.size() == 2){ bit0 = ImageLoader.decodeSampledBitmapFromResource(mList.get(0).getPath(), width, height); bit1 = ImageLoader.decodeSampledBitmapFromResource(mList.get(1).getPath(), width, height); }else if (mList.size() == 1){ bit0 = ImageLoader.decodeSampledBitmapFromResource(mList.get(0).getPath(), width, height); }else{ return null; } canvas.drawBitmap(bit0, new Rect(0, 0, bit0.getWidth(), bit0.getHeight()), new Rect(padding / 2, padding / 2, width / 2, height / 2), paint); if (null != bit1){ canvas.drawBitmap(bit1, new Rect(0, 0, bit1.getWidth(), bit1.getHeight()), new Rect(width / 2, padding / 2, width - padding / 2, height / 2), paint); } if (null != bit2){ canvas.drawBitmap(bit2, new Rect(0, 0, bit2.getWidth(), bit2.getHeight()), new Rect(padding / 2, height / 2, width / 2, height - padding / 2), paint); } if (null != bit3){ canvas.drawBitmap(bit3, new Rect(0, 0, bit3.getWidth(), bit3.getHeight()), new Rect(width / 2, height / 2, width - padding / 2, height - padding / 2), paint); } return new BitmapDrawable(output); } public void setmThumb(Drawable mThumb) { this.mThumb = mThumb; } public String getName() { if (TextUtils.isEmpty(Name)){ int index = DirPath.lastIndexOf("/"); Name = DirPath.substring(index + 1); } return Name; } public void setName(String name) { Name = name; } public void add(MyPhoto photo) { mList.add(photo); } @Override public boolean equals(Object o) { LogUtils.w("equals Object o"); if (this == o){ LogUtils.w("equals Object this == o return true"); return true; } if (o instanceof MyPhotoDir){ MyPhotoDir dir = (MyPhotoDir)o; String pathDir = dir.getDirPath(); LogUtils.w("equals Object dir.getDirPath() = " + pathDir + "this.getDirPath() = " + this.getDirPath()); if (pathDir != null && pathDir.equals(this.getDirPath())){ LogUtils.w("equals Object path.eques path return true"); return true; } } LogUtils.w("equals Object return false"); return false; }}其中DirPath是photoDir的唯一标识
里面的List就对应的文件夹下面的所有的图片的列表,每个图片的缩略图都是更加这个list的里面的图片来合成的,合成方法是List的前四张(少于4张就有几张合成几张)图片拼起来的。对应函数:createThumb()
** * 生成缩略图 */ private Drawable createThumb(int width , int height) { Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); canvas.drawARGB(0x99, 0xff,0xff, 0x00); final Paint paint = new Paint(); final int padding = width / 10; Bitmap bit0 , bit1 = null , bit2 = null , bit3 = null; if (mList.size() >= 4){ bit0 = ImageLoader.decodeSampledBitmapFromResource(mList.get(0).getPath(), width, height); bit1 = ImageLoader.decodeSampledBitmapFromResource(mList.get(1).getPath(), width, height); bit2 = ImageLoader.decodeSampledBitmapFromResource(mList.get(2).getPath(), width, height); bit3 = ImageLoader.decodeSampledBitmapFromResource(mList.get(3).getPath(), width, height); }else if (mList.size() == 3){ bit0 = ImageLoader.decodeSampledBitmapFromResource(mList.get(0).getPath(), width, height); bit1 = ImageLoader.decodeSampledBitmapFromResource(mList.get(1).getPath(), width, height); bit2 = ImageLoader.decodeSampledBitmapFromResource(mList.get(2).getPath(), width, height); }else if (mList.size() == 2){ bit0 = ImageLoader.decodeSampledBitmapFromResource(mList.get(0).getPath(), width, height); bit1 = ImageLoader.decodeSampledBitmapFromResource(mList.get(1).getPath(), width, height); }else if (mList.size() == 1){ bit0 = ImageLoader.decodeSampledBitmapFromResource(mList.get(0).getPath(), width, height); }else{ return null; } canvas.drawBitmap(bit0, new Rect(0, 0, bit0.getWidth(), bit0.getHeight()), new Rect(padding / 2, padding / 2, width / 2, height / 2), paint); if (null != bit1){ canvas.drawBitmap(bit1, new Rect(0, 0, bit1.getWidth(), bit1.getHeight()), new Rect(width / 2, padding / 2, width - padding / 2, height / 2), paint); } if (null != bit2){ canvas.drawBitmap(bit2, new Rect(0, 0, bit2.getWidth(), bit2.getHeight()), new Rect(padding / 2, height / 2, width / 2, height - padding / 2), paint); } if (null != bit3){ canvas.drawBitmap(bit3, new Rect(0, 0, bit3.getWidth(), bit3.getHeight()), new Rect(width / 2, height / 2, width - padding / 2, height - padding / 2), paint); } return new BitmapDrawable(output); }大家可以使用自己的合成方法!
那么在获取数据的时候就要把前面的方法进行修改:
思路如下:
1.在得到文件的全名之后,在得到图片的文件夹的路劲,
2.把MyPhoto尝试加入到列表(DataConfig.mPhotoDirList)分类中
3.在加入列表之前先检查myPhoto对应的文件夹是否已经在DataConfig.mPhotoDirList,
如果存在的话,就把myPhoto加入到对应的PhotoDir的list中
如果不存在的话,就根据MyPhoto的文件夹路径new 一个PhotoDir,把PhotoDir加入到DataConfig.mPhotoDirLis,再把MymyPhoto加入到对应的PhotoDir的list中
private void joinItemToDir(MyPhoto photo) { String stringDir = photo.getPathDir(); MyPhotoDir mPhotoDir = null; if (!TextUtils.isEmpty(stringDir)){ if (null == (mPhotoDir = findPhotoDir(stringDir)) ){ // 不存在这个目录 mPhotoDir = new MyPhotoDir(stringDir); DataConfig.mPhotoDirList.add(mPhotoDir); } mPhotoDir.add(photo); } } /** * @return 是否存在这个图片目录 * 不存在的话就返回null */ private MyPhotoDir findPhotoDir(String pathDir) { for (MyPhotoDir dir : DataConfig.mPhotoDirList){ if (dir.getDirPath().equals(pathDir)){ return dir; } } return null; }
得到数据之后就就跟Adapter联系起来,显示UI
布局文件:
<pre name="code" class="java"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/photo10" > <GridView android:id="@+id/mGridView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:horizontalSpacing="20dp" android:numColumns="3" android:verticalSpacing="20dp" > </GridView> </RelativeLayout>
设置
Adapter mAdapter = new MyPhoteDirAdapter(DataConfig.mPhotoDirList, MainActivity.this); mGridView.setAdapter(mAdapter);
MyPhoteDirAdapter.java<pre name="code" class="java"> Context mContext = null; ArrayList<MyPhotoDir> mList = null; public MyPhoteDirAdapter(ArrayList<MyPhotoDir> list , Context context){ mList = list; mContext = context; } @Override public int getCount() { return mList.size(); } @Override public Object getItem(int arg0) { return mList.get(arg0); } @Override public long getItemId(int arg0) { return arg0; } ViewHolder mHolder = null; @Override public View getView(int position, View view, ViewGroup parent) { ViewHolder mHolder = null; if (null == view){ view = LayoutInflater.from(mContext).inflate(R.layout.layout_photodir, null); mHolder = new ViewHolder(); mHolder.mImage = (ImageView)view.findViewById(R.id.photo_thumb); mHolder.mText = (TextView)view.findViewById(R.id.photo_name); view.setTag(mHolder); }else{ mHolder = (ViewHolder)view.getTag(); } mHolder.mImage.setImageDrawable(mList.get(position).getmThumb()); mHolder.mText.setText(mList.get(position).getName()); return view; } public class ViewHolder{ public ImageView mImage = null; public TextView mText = null; }
对应布局文件:
<pre name="code" class="html"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:id="@+id/photo_thumb" android:layout_width="match_parent" android:layout_height="wrap_content" android:scaleType="fitXY"/> <TextView android:id="@+id/photo_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="25dp" android:textColor="#ffffffff" android:layout_centerHorizontal="true" android:layout_below="@id/photo_thumb"/></RelativeLayout>
再加上点击进入对应的文件夹就大功告成了:
mGridView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) { LogUtils.i("onItemClick position = " + position); Intent it = new Intent(MainActivity.this , MyListActivity.class); mCurPosition = position; it.putExtra("index", position); startActivityForResult(it, REQUEST_MY_LIST); } });
点击时把点击的第几个文件传进去
it.putExtra("index", position);
在MyListActivity接收
Intent it = getIntent(); if (null != it){ index = it.getIntExtra("index", index); }
主要代码都贴出来了,主要的地方是生成文件的缩略图,跟文件夹的分类
0 0
- 使用Viewpager制作图片阅读器(4)- 文件夹分类(附上源码)
- 使用Viewpager制作图片阅读器(5)- 增加获取网络图片(附上源码)
- 使用Viewpager制作图片阅读器(3)-读取本地图片
- 使用Viewpager制作图片阅读器(1)-简单实现
- 使用Viewpager制作图片阅读器(2)-优化
- ViewPager制作循环滚动图片
- 使用 FlexPaper、SWFTools制作PDF阅读器
- 原生js实现图片的3d效果,附上源码
- ClipDrawable的使用(附上电池充电效果的Demo)
- Zabbix使用微信发送告警(附上Python代码)
- 如何制作朋友圈搞笑证件图片(附源码实例)
- 使用ViewPager实现图片轮播效果(绝对好使)
- Linux常用命令(远程拷贝、登录、源码阅读器)
- PDF阅读器系列之--MuPDF源码分析过程(一)
- PDF阅读器系列之--MuPDF源码分析过程(二)
- PDF阅读器系列之--MuPDF源码分析过程(一)
- PDF阅读器系列之--MuPDF源码分析过程(二)
- 源码阅读器
- const在函数前与函数后的区别
- Android图像处理之Bitmap类
- Autodesk Vault数据管理平台的介绍
- tag uiimaageview
- Django form模块使用心得
- 使用Viewpager制作图片阅读器(4)- 文件夹分类(附上源码)
- 《数据结构》实验二:线性表的实验
- 【学习OpenCV】——Mat类详解
- DataSourceFactory
- poj3061—1
- poj1852 Ants
- Android 中获取未安装APK的 图标 || icon
- VM选择内核
- Android之获取WebView所加载网址网站的源码