Android图片浏览器之缩略图

时间:2022-09-17 20:16:18

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

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

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图片浏览器之缩略图

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

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

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

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. iOS常见三方总结&lpar;更新中&rpar;

    常用的三方积累 MJExtention SSZipArchive 用于解压与压缩文件 地址:https://github.com/ZipArchive/ZipArchive ps:比较奇葩,githu ...

  2. Laravel &lpar;5&period;5&period;33&rpar; 加载过程---instance方法(二&rpar;

    在bootstrap/app.php /** * 对于其中的instance register singleton 方法到时候单独拎出来说明 * * 1.设置基础路径 * 2.使用instance 方 ...

  3. hihoCoder 树结构判定(并查集)

    思路:树满足两个条件: 1.顶点数等于边数加一 2.所有的顶点在一个联通块 那么直接dfs或者并查集就可以了. AC代码 #include <stdio.h> #include<st ...

  4. Python实现C代码统计工具&lpar;一&rpar;

    目录 Python实现C代码统计工具(一) 声明 一. 问题提出 二. 代码实现 三. 效果验证 四. 后记 Python实现C代码统计工具(一) 标签: Python 代码统计 声明 本文将基于Py ...

  5. &lbrack;knowledge&rsqb;&lbrack;dpdk&rsqb; open data plane

    https://www.opendataplane.org/ https://en.wikipedia.org/wiki/OpenDataPlane odp vs dpdk:  http://dpdk ...

  6. cf 366D D&period; Dima and Trap Graph &lpar;计算所有线段共同覆盖的某段区间&rpar;

    http://codeforces.com/problemset/problem/366/D 题意:给出n个点,m条边,a,b,ll,rr分别代表点a,点b相连,点a和点b的区间范围(ll,rr),然 ...

  7. HandyJSON第三方库的日常使用与错误记录

    一.错误提示 1.更新Xcode10.2,Swift5.0出现错误提示 Undefined symbols for architecture x86_64: "_swift_getField ...

  8. nodejs版本升级

    网上都说   npm install –g n 可是一直不行,换做 npm install -g cnpm --registry=https://registry.npm.taobao.org ok

  9. 「小程序JAVA实战」 小程序wxss样式文件的使用(七)

    转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-07/ 细说下微信小程序的wxss样式文件.源码:https://github.com/liming ...

  10. 用户&OpenCurlyDoubleQuote;&ast;&ast;&ast;&ast;&ast;”不具有所需的权限。请验证授予了足够的权限并且解决了 Windows 用户帐户控制&lpar;UAC&rpar;限制问题。

    错误: 用户“ts\***”不具有所需的权限.请验证授予了足够的权限并且解决了 Windows 用户帐户控制(UAC)限制问题. 解决: 当从客户端用IE连接http://xxx.xxx.xxx.xx ...