您的位置:首页 > 移动开发 > Android开发

Android 从 Android 本地图库选择多个图片

2014-09-04 11:30 197 查看
原文地址

本文说明如何从Android本地图库选择多个图片。作者考虑很多解决方案。

演示从Android本地图库选择多个图片,有两个方法可以实现从图库中选择多个图片:

用Intent获取多个图片自定义图库从本地获取和加载图片

下载Demo

下载Demo后将QDReader图片目录复制到sd卡上

环境

Windows2008R264位
EclipseADTV22.6.2,Android4.4.2(API19)
SAMSUNGGT-8618,AndroidOS4.1.2

用Intent获取多个图片

通过使用下面代码,尝试与选择单张图片相同的解决方案来实现:

Intentintent=newIntent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"SelectPicture"),PICK_IMAGE);


.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

我以为这样可以,但不能选择多张图片。经过查看资料,作者意识到可以使用SEND_MULTIPLEintent(发送多意向),但是没有找到实现选择多个图片的方法。

自定义图库

因为我们不知道如何实现发送多个意向(Intent)的解决方案,所以可以用自定义图库的解决办法,来实现获取图片,并加载到​GridView。我的一个朋友VikasKanani已经探索和分享了这一解决方案。我试图实现相同的解决方案,但发现它的一些问题:

如果图片数量很大,比如2000~5000,加载就会相当慢
如果加载更多图片,可能会崩溃

为了解决以上问题,我用异步加载图片,这样每个图片都是异步获得的。





图1项目结构





图2演示从Android本地图库选择多个图片(左:选择前;右:选择后)

解决方案实现如下所示。

定义图片每个网格的布局——row_multiphoto_item.xml。

<?xmlversion="1.0"encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/imageView1"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/ic_launcher"/>
<CheckBox
android:id="@+id/checkBox1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@+id/imageView1"
android:layout_centerVertical="true"/>
</RelativeLayout>

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

定义图片GridView的布局——ac_image_grid.xml。

<?xmlversion="1.0"encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<GridView
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@+id/button1"
android:columnWidth="100dip"
android:gravity="center"
android:horizontalSpacing="4dip"
android:numColumns="auto_fit"
android:stretchMode="columnWidth"
android:verticalSpacing="2dip"/>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:onClick="btnChoosePhotosClick"
android:text="SelectPhotos"/>
</RelativeLayout>

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

定义UILApplication类,声明应用程序级别的配置设置。

publicclassUILApplicationextendsApplication{
@Override
publicvoidonCreate(){
super.onCreate();
//Thisconfigurationtuningiscustom.Youcantuneeveryoption,you
//maytunesomeofthem,
//oryoucancreatedefaultconfigurationby
//ImageLoaderConfiguration.createDefault(this);
//method.
ImageLoaderConfigurationconfig=newImageLoaderConfiguration.Builder(
getApplicationContext())
.threadPoolSize(3)
.threadPriority(Thread.NORM_PRIORITY-2)
.memoryCacheSize(1500000)
//1.5Mb
.denyCacheImageMultipleSizesInMemory()
.discCacheFileNameGenerator(newMd5FileNameGenerator())
.enableLogging()//Notnecessaryincommon
.build();
//InitializeImageLoaderwithconfiguration.
ImageLoader.getInstance().init(config);
}
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

定义BaseActivity类,创建一个单件实例的ImageLoader类。

publicabstractclassBaseActivityextendsActivity{
protectedImageLoaderimageLoader=ImageLoader.getInstance();
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

现在可以定义一个主activity类——MainActivity,编写代码从本地图库获得图片。该类还定义了一个GridView的ImageAdapter类。

publicclassMainActivityextendsBaseActivity{
privateArrayList<String>imageUrls;
privateDisplayImageOptionsoptions;
privateImageAdapterimageAdapter;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.ac_image_grid);
initData();
initGallery();
}
privatevoidinitData(){
this.imageUrls=newArrayList<String>();
finalString[]columns={MediaStore.Images.Media.DATA,
MediaStore.Images.Media._ID};
finalStringorderBy=MediaStore.Images.Media.DATE_TAKEN;
Cursorimagecursor=this
.getApplicationContext()
.getContentResolver()
.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,columns,
null,null,orderBy+"DESC");
for(inti=0;i<imagecursor.getCount();i++){
imagecursor.moveToPosition(i);
intdataColumnIndex=imagecursor
.getColumnIndex(MediaStore.Images.Media.DATA);
imageUrls.add(imagecursor.getString(dataColumnIndex));
Log.i("imageUrl",imageUrls.get(i));
}
}
privatevoidinitGallery(){
options=newDisplayImageOptions.Builder()
.showStubImage(R.drawable.stub_image)
.showImageForEmptyUri(R.drawable.image_for_empty_url)
.cacheInMemory().cacheOnDisc().build();
imageAdapter=newImageAdapter(this,imageUrls);
GridViewgridView=(GridView)findViewById(R.id.gridview);
gridView.setAdapter(imageAdapter);
//gridView.setOnItemClickListener(newOnItemClickListener(){
//@Override
//publicvoidonItemClick(AdapterView<?>parent,Viewview,
//intposition,longid){
//startImageGalleryActivity(position);
//}
//});
}
@Override
protectedvoidonStop(){
imageLoader.stop();
super.onStop();
}
publicvoidbtnChoosePhotosClick(Viewv){
ArrayList<String>selectedItems=imageAdapter.getCheckedItems();
Toast.makeText(MainActivity.this,
"Totalphotosselected:"+selectedItems.size(),
Toast.LENGTH_SHORT).show();
Log.d(MainActivity.class.getSimpleName(),"SelectedItems:"
+selectedItems.toString());
}
/**
*DescriptionGridViewAdapter
*/
publicclassImageAdapterextendsBaseAdapter{
ArrayList<String>mList;
LayoutInflatermInflater;
ContextmContext;
SparseBooleanArraymSparseBooleanArray;
publicImageAdapter(Contextcontext,ArrayList<String>imageList){
//TODOAuto-generatedconstructorstub
mContext=context;
mInflater=LayoutInflater.from(mContext);
mSparseBooleanArray=newSparseBooleanArray();
mList=newArrayList<String>();
this.mList=imageList;
}
publicArrayList<String>getCheckedItems(){
ArrayList<String>mTempArry=newArrayList<String>();
for(inti=0;i<mList.size();i++){
if(mSparseBooleanArray.get(i)){
mTempArry.add(mList.get(i));
}
}
returnmTempArry;
}
@Override
publicintgetCount(){
returnimageUrls.size();
}
@Override
publicObjectgetItem(intposition){
returnnull;
}
@Override
publiclonggetItemId(intposition){
returnposition;
}
@Override
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
if(convertView==null){
convertView=mInflater.inflate(R.layout.row_multiphoto_item,
null);
}
CheckBoxmCheckBox=(CheckBox)convertView
.findViewById(R.id.checkBox1);
finalImageViewimageView=(ImageView)convertView
.findViewById(R.id.imageView1);
imageLoader.displayImage("file://"+imageUrls.get(position),
imageView,options,newSimpleImageLoadingListener(){
@Override
publicvoidonLoadingComplete(BitmaploadedImage){
Animationanim=AnimationUtils.loadAnimation(
MainActivity.this,R.anim.fade_in);
imageView.setAnimation(anim);
anim.start();
}
});
mCheckBox.setTag(position);
mCheckBox.setChecked(mSparseBooleanArray.get(position));
mCheckBox.setOnCheckedChangeListener(mCheckedChangeListener);
returnconvertView;
}
OnCheckedChangeListenermCheckedChangeListener=newOnCheckedChangeListener(){
@Override
publicvoidonCheckedChanged(CompoundButtonbuttonView,
booleanisChecked){
//TODOAuto-generatedmethodstub
mSparseBooleanArray.put((Integer)buttonView.getTag(),
isChecked);
}
};
}
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}


注意:

本文使用了图片加载库universal-image-loader包,在libs目录中。

下载Demo后,将QDReader图片目录复制到sd卡上。


下载Demo
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐
章节导航