项目源码:http://files.cnblogs.com/files/tgyf/app.rar

  最近在自学Android,尝试实现一般手机上都存在的图片浏览器,从缩略图开始。

  直接上图,这是google手机自带Photos图片浏览器。

  通过查阅资料了解到,在实现缩略图之前需要做的工作有:

    1、查找手机中所有图片,包括截图、拍照、通过USB从电脑中黏贴过来等方式存储在若干个文件夹的,

       将图片完整路径存储在字符串数组中;

    2、对于某一幅图片,不管是缩略也好,全屏显示也好,需要在一种组件进行显示(只是图片的大小不一样);

    3、寻找一种组件,可以利用来存放各个缩略图,完成网格般的效果;

  对于第一点,说白了就是文件搜索与选择功能,在电脑和手机中都适用。

  因为这里只用到图片文件,那只需要将常规的几种图像格式过滤出来即可(jpg,jpeg,tif,tiff,png,gif,bmp)。

  关键代码如下:

 ArrayList<String> fullPathImg = new ArrayList<String>();
 String pathRoot = Environment.getExternalStorageDirectory().getPath()+"/";
File root = new File(pathRoot);
getAllFiles(root);
 private void getAllFiles(File root){
File files[] = root.listFiles();
if(files != null){
for (File f : files){
if(f.isDirectory()){
getAllFiles(f);
}else{
String strf = f.toString();
String str = strf.substring(strf.length() - 4, strf.length());
if(str.equals(".bmp")||str.equals(".jpg")||str.equals(".jpeg")||str.equals(".png")||str.equals(".gif")||str.equals(".tif")||str.equals(".tiff")){
boolean bool = fullPathImg.add(strf);
}
}
}
}
}

  上面三段代码的作用分别为:定义一个String类型的ArrayList变量fullPathImg,用来存储图片路径;获取手机SD卡路径;搜索图片文件实现函数,是一个递归过程。

  对于第二点,在Android中可以显示图片的组件太多了,如ImageView、ImageButton,连Button、Toast等有时候都可以来凑下热闹。

  这里采用ImageView,给其赋于图片也有很多种方式:

    1、setImageBitmap(BitmapFactory.decodeFile(imagePath));  imagePath为String类型,指图片完整名称;

    2、setImageResource(R.mipmap.ic_launcher);  通过资源来赋值,需要事先导入工程中,或者调用Android自带资源;

    3、setImageDrawable(getResources().getDrawable(R.mipmap.ic_launcher));  和第二种很相近,通过Drawable来赋值,只是多了若干步骤;

  由于本应用是要通过文件名来读取图片资源,故采用的是第一种。

  要完成第三点,由于是初学,采用的是较好实现的GridView组件。但是需要实现一个继承自BaseAdapter的类ImageAdapter,代码如下:

 public class ImageAdapter extends BaseAdapter {

         private Context context;

         int countImg;

         public ImageAdapter(Context context){
this.context = context;
this.countImg = fullPathImg.size();
} @Override
public int getCount(){
return countImg;
} public Object getItem(int position){
return position;
} public long getItemId(int position)
{
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent)
{
windowWidth = getWindowManager().getDefaultDisplay().getWidth();
int pad = 4;
if(convertView == null){
imageView = new ImageView(context);
}
else{
imageView = (ImageView)convertView;
}
imageView.setLayoutParams(new GridView.LayoutParams((windowWidth - pad * 12) / 4, (windowWidth - pad * 12) / 4));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setImageBitmap(BitmapFactory.decodeFile(fullPathImg.get(position)));
return imageView;
}
}

  ImageAdapter类主要实现五个方法,分别为构造、获取总数、获取元素位置、获取元素ID、获取视图,最为关键的是最后一个getView()。

  需要注意两点:

    1、不用手动一个个去将所有图片资源和组件GridView关联起来,通过下面的语句制定路径变量和位置信息即可,

    imageView.setImageBitmap(BitmapFactory.decodeFile(fullPathImg.get(position)));   imageView为ImageView类的变量;

    2、对imageView的大小进行设置时,以手机屏幕的分辨率作为参考,获取方式如下,

    int windowWidth = getWindowManager().getDefaultDisplay().getWidth();   获取宽度,高度类似;

  ImageAdapter实现了,下面给出GridView定义的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" > <GridView
android:id="@+id/gridView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:listSelector="@android:color/transparent"
android:cacheColorHint="@android:color/transparent"
android:horizontalSpacing="4dp"
android:verticalSpacing="4dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:stretchMode="columnWidth"
android:gravity="center"
android:fadeScrollbars="true"
android:fastScrollEnabled="true"
android:numColumns="4" >
</GridView> </LinearLayout>

  对其进行设置的属性包括大小、透明度、自身与父类及内容之间的空隙、缩略图列数、居中、滑动条,挺简单就不一一解释了。

  另外,要想从手机SD卡中读写文件,需要在AndroidManifest.xml中加入相应的权限:

 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

  一切准备好后,在主程序文件MainActivity中进行加载即可,下面给出关键代码:

 setContentView(R.layout.activity_main);
gridView = (GridView)findViewById(R.id.gridView);
adapter = new ImageAdapter(this);
gridView.setAdapter(adapter);

  运行后的效果还不错,工程名为ImageScan。

  当然,对于一款真正的图片浏览器来说,这只是其中最基础的功能,即第一步,需要实现还有很多,

  如单击某一幅图片立刻放大显示,随后可以左右或上下滑动;对放大浏览的图片可以任意缩放、编辑等。

  有兴趣的朋友可以一起学习交流,有错误或不足的还望大神们指点一二。

Android图片浏览器之缩略图的更多相关文章

  1. Android图片浏览器之图片删除

    前一篇介绍了怎么从手机中读取图片文件,放入组件GridView实现网格效果的缩略图显示. 今天研究了对GridView中的子项(各张小图片)进行删除的操作,参考已有软件,长按图片跳出删除确认框. Gr ...

  2. Android 高级UI设计笔记14:Gallery(画廊控件)之 3D图片浏览

    1. 利用Gallery组件实现 3D图片浏览器的功能,如下: 2. 下面是详细的实现过程如下: (1)这里我是测试性代码,我的图片是自己添加到res/drawable/目录下的,如下: 但是开发中不 ...

  3. 【转】android如何浏览并选择图片 音频 视频

    转自:http://www.cnblogs.com/top5/archive/2012/03/06/2381986.html   这几天 在学习并开发android系统的图片浏览 音频 视频 的浏览 ...

  4. 分享:android图片浏览器—类微信朋友圈相片浏览【android代码下载】

    今天给大家分享个android图片/相册浏览器,类似微信朋友圈相片浏览,可以左右滑动,可以双击放大,捏拉放大 效果如下:<ignore_js_op> device-2013-09-04-1 ...

  5. 一款基于 Android 开发的离线版的 MM 图片浏览 App

    一款离线版的 MM 图片浏览 App,有点类似掌上百度的图片专栏应用.图片采用瀑布流展示方式,点击图片集,支持左右手势滑动切换图片:支持放大缩小功能. 实现功能:1)图片完全离线,不耗个人 GPRS ...

  6. 一步一步打造自己的Android图片浏览器(原创)

    今天我们试着来制作一个自己的Android图片浏览器. 图片浏览器应该具有什么功能呢?鉴于不同的人不同的理解,这里提出一个基本的需求: 搜索手机内的所有图片,展示于一个列表中: 列表中展示的是图片的缩 ...

  7. Android图片缓存之Glide进阶

    前言: 前面学习了Glide的简单使用(Android图片缓存之初识Glide),今天来学习一下Glide稍微复杂一点的使用. 图片缓存相关博客地址: Android图片缓存之Bitmap详解 And ...

  8. Android图片缓存之初识Glide

    前言: 前面总结学习了图片的使用以及Lru算法,今天来学习一下比较优秀的图片缓存开源框架.技术本身就要不断的更迭,从最初的自己使用SoftReference实现自己的图片缓存,到后来做电商项目自己的实 ...

  9. android图片处理方法

    Java代码 //压缩图片大小 public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ...

随机推荐

  1. oracle缓存池使用解析

    oracle有三种类型的缓存池,分别是default,keep和recycle.默认情况下只会使用default缓存池,另外两种需要额外配置. keep缓存池相当于是一直很热的default缓存池,缓 ...

  2. cocos2d-x之多个移动的小球

    MoveBalls.hpp: #ifndef MoveBalls_hpp #define MoveBalls_hpp #include <stdio.h> #include "c ...

  3. html的<head><title><meta>

    head <head>用来标记HTML的头部,里面通常需要包括标题,基础信息,源信息等,定义在HTML头部的内容往往不会在网页上直接显示 title <title>的内容设置在 ...

  4. poj 2942 Knights of the Round Table 圆桌骑士(双连通分量模板题)

    Knights of the Round Table Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 9169   Accep ...

  5. [测试] 试用Hadoop 2.2中的HDFS NFS

    Hadoop 2.2中正式启用了hdfs nfs功能,使得hdfs的通用性迈进了一大步.在公司让小朋友搭建了一下,然后我自己进行了一点简单的试验,有一点收获,记录在此. 理论 使用hdfs nfs功能 ...

  6. {dockerUI}在服务器上直接安装shipyard/shipyard

    $ git clone https://github.com/shipyard/shipyard.git $ cd shipyard/   $ sudo pip install -r requirem ...

  7. Rotate Array

    Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array  ...

  8. Reducejoin sample

    示例文件同sample join analysis 之前的示例是使用map端的join.这次使用reduce端的join. 根据源的类别写不同的mapper,处理不同的文件,输出的key都是stude ...

  9. Snowflake weakness and type2 fact table

    DimProduct DimSubcategory Dimcategory productpk subcategorypk categorypk sku subcategoryName categor ...

  10. 我所理解的 惠普云 (HP Cloud)

    HP (惠普)于2014年5月27日宣布了它的新的云产品线 HP Helion,并宣布在接下来的两年时间内向该产品线投资10亿美金.应该说这是一笔很大的投入,充分显示了HP 在云这个领域的决心.本文试 ...