【Android】读取sdcard卡上的全部图片而且显示,读取的过程有进度条显示
尽管以下的app还没有做到快图浏览、ES文件浏览器的水平,遇到大sdcard还是会存在读取过久、内存溢出等问题,可是基本思想是这种。
例如以下图。在sdcard卡上有4张图片,
打开app,则会吧sd卡上的全部图片读取,并显示出来。读取的过程有进度条显示。
制作步骤例如以下:
1、首先,res\values\strings.xml对字符设置例如以下,没有什么特别的。
<? xml version="1.0" encoding="utf-8"?>
<resources> <string name="app_name">读取sdcard下的全部图片</string>
<string name="action_settings">Settings</string>
<string name="imageView_description">大图</string> </resources>
2、之后,改动res\layout\activity_main.xml形成布局,这里採用布局与《【Android】画廊式的图片浏览器,使用HorizontalScrollView代替Gallery。OnClickListener的參数传递》(点击打开链接)是一模一样的,仅仅是这里,HorizontalScrollView旗下的LinearLayout改为用Java代码生成。故对HorizontalScrollView赋予id。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <ImageView
android:id="@+id/imageView1"
android:layout_width="match_parent"
android:layout_height="200dp"
android:contentDescription="@string/imageView_description"
android:paddingTop="10dp" /> <HorizontalScrollView
android:id="@+id/horizontalScrollView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:scrollbars="horizontal" >
</HorizontalScrollView> </LinearLayout>
3、然后。与《【Android】读取sdcard上的图片》(点击打开链接)一样。在AndroidManifest.xml插入<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />与<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
/>要求对sdcard读取与写入的权限。这个文件改动之后例如以下:
<? xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.asyncread"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 要求向SDCard读取数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 要求向SDCard写入数据权限 --> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.asyncread.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>
4、最后,才是整个程序的关键,对MainActivity.java的编写。这里首先插入了两个工具类,一个在《【Java】读取其下全部目录与文件的路径》(点击打开链接)中讲过。用于遍历sdcard上面的文件的,当然,遍历的时候剔除sdcard上Android这个系统目录。不剔除的话会把系统的图标等遍历出来。之后是一个图片缩放类。不正确读取到的图片进行缩放。会在app执行时,出现内存溢出的错误。
程序一開始,在onCreate方法,在app头部生成一个进度条。之后调用异步类AsyncTask对sdcard卡文件的读取。与《【Android】画廊式的图片浏览器,使用HorizontalScrollView代替Gallery,OnClickListener的參数传递》(点击打开链接)中的方法一样,把图片资源一张张载入出来。
仅仅是作用对象从app的图片资源。变成从sdcard读取出来的图片。
package com.example.asyncread; import java.io.File;
import java.util.ArrayList; import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.HorizontalScrollView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory; public class MainActivity extends Activity {
// 安卓组件
private HorizontalScrollView horizontalScrollView1;
private ImageView imageView1;
// 用于存放sdcard卡上的全部图片路径
public static ArrayList<String> dirAllStrArr = new ArrayList<String>(); // 用于遍历sdcard卡上全部文件的类
public static void DirAll(File dirFile) throws Exception {
if (dirFile.exists()) {
File files[] = dirFile.listFiles();
for (File file : files) {
if (file.isDirectory()) {
String fileName = file.getName();
// 除sdcard上Android这个目录以外。
if (!fileName.endsWith("Android")) {
// 假设遇到目录则递归调用。 DirAll(file);
}
} else {
// 假设是图片文件压入数组
String fileName = file.getName();
if (fileName.endsWith(".jpg") || fileName.endsWith(".jpeg")
|| fileName.endsWith(".bmp")
|| fileName.endsWith(".gif")
|| fileName.endsWith(".png")) {
// 假设遇到文件则放入数组
if (dirFile.getPath().endsWith(File.separator)) {
dirAllStrArr
.add(dirFile.getPath() + file.getName());
} else {
dirAllStrArr.add(dirFile.getPath() + File.separator
+ file.getName());
}
}
}
}
}
} // 图片载入的类
public static BitmapFactory.Options getHeapOpts(File file) {
BitmapFactory.Options opts = new BitmapFactory.Options();
// 数字越大读出的图片占用的heap必须越小,不然总是溢出
if (file.length() < 20480) { // 0-20k
opts.inSampleSize = 1;// 这里意为缩放的大小
} else if (file.length() < 51200) { // 20-50k
opts.inSampleSize = 2;
} else if (file.length() < 307200) { // 50-300k
opts.inSampleSize = 4;
} else if (file.length() < 819200) { // 300-800k
opts.inSampleSize = 6;
} else if (file.length() < 1048576) { // 800-1024k
opts.inSampleSize = 8;
} else {
opts.inSampleSize = 10;
}
return opts;
} class MyTask extends AsyncTask<Void, Integer, LinearLayout> {
@Override
// 任务開始前做什么
protected void onPreExecute() {
setProgressBarVisibility(true);// 显示运行进度条
super.onPreExecute();
} @Override
protected LinearLayout doInBackground(Void... arg0) {
// 生成一个水平线性布局
LinearLayout linearLayout1 = new LinearLayout(MainActivity.this);
LayoutParams layoutParams = new LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
linearLayout1.setOrientation(LinearLayout.HORIZONTAL);
linearLayout1.setLayoutParams(layoutParams);// 应用到新生成的线性布局
/* 遍历sdcard旗下的全部目录開始 */
String sdpath = Environment.getExternalStorageDirectory()
.getAbsolutePath();// 获取sdcard的根路径
File dirFile = new File(sdpath);
try {
DirAll(dirFile);
} catch (Exception e) {
e.printStackTrace();
}
/* 遍历sdcard旗下的全部目录结束 */
// 得到sdcard旗下的全部图片路径之后,再对这个数组进行遍历
for (int i = 0; i < dirAllStrArr.size(); i++) {
String filePath = dirAllStrArr.get(i);
File file = new File(filePath);
Bitmap bm = BitmapFactory.decodeFile(filePath,
getHeapOpts(file));
LinearLayout linearLayout2 = new LinearLayout(MainActivity.this);
// 设置新生成线性布局的參数。宽度为100,高度为匹配父组件,也就是水平滚动视图的高度
LayoutParams layoutParams1 = new LayoutParams(100,
ViewGroup.LayoutParams.MATCH_PARENT);
layoutParams1.gravity = Gravity.CENTER_HORIZONTAL;// 设置线性布局内的组件水平居中
linearLayout2.setOrientation(LinearLayout.VERTICAL);// 设置新生成的线性布局android:orientation="vertical"
linearLayout2.setLayoutParams(layoutParams1);// 应用到新生成的线性布局
ImageView imageView2 = new ImageView(MainActivity.this);
imageView2.setId(i + 20000);// 这里因为id不能为字符的缘故,全部对图片的id分别设为20000,20001,20002,...便于以下的图片点击监听器所控制
imageView2.setImageBitmap(bm);// 将数组中的第i张图片放到图片视图
imageView2.setAdjustViewBounds(true);// 自己主动缩放为宽高比
imageView2.setMaxHeight(80);// 图片的高度为80dp
imageView2.setPadding(10, 10, 10, 10);
imageView2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
String filePath = dirAllStrArr.get(view.getId() - 20000);
File file = new File(filePath);
Bitmap bm = BitmapFactory.decodeFile(filePath,
getHeapOpts(file));
imageView1.setImageBitmap(bm);
// 把点击的图片id取出之后,减20000就是要显示的图片在图片数组的位置了。 }
});
// 将图片视图载入到新生成的线性布局之中
linearLayout2.addView(imageView2);
// 新生成一个标签文本
TextView textView = new TextView(MainActivity.this);
textView.setText(filePath);
textView.setTextSize(15);
// 标签文本在水平位置居中
textView.setGravity(Gravity.CENTER);
// 加入到新生成的线性布局之后
linearLayout2.addView(textView);
linearLayout1.addView(linearLayout2);
publishProgress(i);// 调用onProgressUpdate方法
} return linearLayout1;
} @Override
protected void onProgressUpdate(Integer... values) {
setProgress(values[0] * 2500);// 更新进度条
super.onProgressUpdate(values);
} // 任务放完之后
@Override
protected void onPostExecute(LinearLayout result) {
setProgressBarVisibility(false);
horizontalScrollView1.addView(result);// 把doInBackground()终于搞出来的水平线性布局放到横向滚动布局中
super.onPostExecute(result);
} } @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_PROGRESS);// 在头部生成一个进度条,必须在setContentView(R.layout.activity_main);这条语句之前
setContentView(R.layout.activity_main);
// 获取各种组件
horizontalScrollView1 = (HorizontalScrollView) findViewById(R.id.horizontalScrollView1);
imageView1 = (ImageView) findViewById(R.id.imageView1);
new MyTask().execute();// 開始MyTask任务
} }
【Android】读取sdcard卡上的全部图片而且显示,读取的过程有进度条显示的更多相关文章
- Extjs 使用fileupload插件上传文件 带进度条显示
一.首先我们看看官方给出的插件的解释: 一个文件上传表单项具有自定义的样式,并且可以控制按钮的文本和 像文本表单的空文本类似的其他特性. 它使用一个隐藏的文件输入元素,并在用户选择文件后 在form提 ...
- Ajax上传文件进度条显示
要实现进度条的显示,就要知道两个参数,上传的大小和总文件的大小 html5提供了一个上传过程事件,在上传过程中不断触发,然后用已上传的大 小/总大小,计算上传的百分比,然后用这个百分比控制div框的显 ...
- Android Studio常见对话框(普通对话框、单选对话框、多选对话框、进度条对话框、消息对话框、自定义对话框)
Android Studio常见对话框(普通对话框.单选对话框.多选对话框.进度条对话框.消息对话框.自定义对话框) 1.普通对话框 2.单选对话框 3.多选对话框 4.进度条对话框 5.消息对话框 ...
- android中读取SD卡上的数据
通过Context的openFileInput或者openFileOutput打开的文件输入输出流是操作应用程序的数据文件夹里的文件,这样存储的大小比较有限,为了更好的存取应用程序的大文件数据,应用程 ...
- Android 获取SDCard中某个目录下图片
本文介绍Android开发中如何获取SDCard中某目录下的所有图片并显示出来,下面的我们提供的这个函数是通用的,只要提供路径就可以查询出该目录下所有图片的路径信息,并保存到一个List<Str ...
- android 操作SD卡上的文件
(1)说明:操作SD卡上的文件须要增加下面权限 在SD卡上创建和删除文件权限 <uses-permission android:name="android.permission.M ...
- js 文件异步上传 显示进度条 显示上传速度 预览文件
通常文件异步提交有几个关键 1.支持拖拽放入文件.2.限制文件格式.3.预览图片文件.4.上传进度,速度等,上传途中取消上传.5.数据与文件同时上传 现在开始笔记: 需要一个最基础的元素<inp ...
- Android——音乐播放器完善——进度条显示当前播放进度,加可拖动进度条(未待解决完问题)
效果: 问题:可拖动进度条随进度条移动时,会致使音乐卡顿(待解决) xml <?xml version="1.0" encoding="utf-8"?&g ...
- android 开发-自定义多节点进度条显示
看效果图: 里面的线段颜色和节点图标都是可以自定义的. main.xml <RelativeLayout xmlns:android="http://schemas.android.c ...
随机推荐
- android压缩解压zip文件
网上各种方法的收集: 1.上次写了个解压缩功能,但有局限性,比如压缩文件xx.zip 里包括子目录的情况下,执行上次解压缩的功能就不能实现我们想要的效果,于是在网上参考了一下java的解压缩功能.对上 ...
- win7 虚拟机 ios开发环境搭建
http://www.cnblogs.com/xiaoyaoju/archive/2013/05/21/3091171.html
- delphi模态窗体最小化会隐藏的问题
在使用delphi创建模态窗体的时候最小化窗体会导致最小化的窗体不可见,再次点击主窗体才会显示. 在这个模态窗体中增加以下函数 procedure WmSysCommand(var msg: TMes ...
- Tomcat 7最大并发连接数的正确修改方法(转)
几乎所有的中文网页都介绍,要修改Tomcat的默认最大并发连接数,应该进行如下设置(实际上这些步骤是错误的): -------------------------------------------- ...
- hdu1937 Finding Seats
hdu1937 Finding Seats 题意是 求最小的矩形覆盖面积内包含 k 个 空位置 枚举上下边界然后 双端队列 求 最小面积 #include <iostream> #incl ...
- C语言指针和数组知识总结(上)
C语言指针和数组知识总结(上) 一.指针的基础 1.C语言中,变量的值能够通过指针来改变,打印指针的语句符号可以是: %08x 2.指针的本质 指针的本质就是变量,那么既然是变量,那么一定会分配地址 ...
- hdu 4117 GRE Words (ac自动机 线段树 dp)
参考:http://blog.csdn.net/no__stop/article/details/12287843 此题利用了ac自动机fail树的性质,fail指针建立为树,表示父节点是孩子节点的后 ...
- 几种经典的数据排序及其Java实现
选择排序 思想 n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果: ①初始状态:无序区为R[1..n],有序区为空. ②第1趟排序 在无序区R[1..n]中选出关键字最小的记录R[k ...
- 重操JS旧业第十弹:闭包
闭包是js最难理解,也是最蛋疼的一个名词,仿佛只可意会不可言传一样,有人说闭包说白了就是函数嵌套,也有人说闭包就是函数能够访问函数外部的变量,而内部的外部访问不了: 貌似都非常有道理,其实仔细想来只不 ...
- Windows Azure入门教学系列 (六):使用Table Storage
本文是Windows Azure入门教学的第六篇文章. 本文将会介绍如何使用Table Storage.Table Storage提供给我们一个云端的表格结构.我们可以把他想象为XML文件或者是一个轻 ...