Android_使用Gallery浏览手机上SD卡中图片

知是行的主意,行是知的功夫。这篇文章主要讲述Android_使用Gallery浏览手机上SD卡中图片相关的知识,希望能为你提供帮助。
 
 
 
运行截图:

Android_使用Gallery浏览手机上SD卡中图片

文章图片

 
 
(发现后面两张照片是自己自拍,大写的尴尬对图片进行涂鸦了!!!)
 
程序结构:
Android_使用Gallery浏览手机上SD卡中图片

文章图片

 
Android_使用Gallery浏览手机上SD卡中图片

文章图片
Android_使用Gallery浏览手机上SD卡中图片

文章图片
< ?xml version="1.0" encoding="utf-8"?> < manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.asus.gary03_6"> < uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> < application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> < activity android:name=".MainActivity"> < intent-filter> < action android:name="android.intent.action.MAIN" /> < category android:name="android.intent.category.LAUNCHER" /> < /intent-filter> < /activity> < /application> < /manifest>

AndroidManifest 
Android_使用Gallery浏览手机上SD卡中图片

文章图片
Android_使用Gallery浏览手机上SD卡中图片

文章图片
< ?xml version="1.0" encoding="utf-8"?> < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.asus.gary03_6.MainActivity"> < Gallery android:id="@+id/mygallery" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:gravity="center_vertical"/> < /LinearLayout>

activity_main 
Android_使用Gallery浏览手机上SD卡中图片

文章图片
Android_使用Gallery浏览手机上SD卡中图片

文章图片
package com.example.asus.gary03_6; import android.support.v7.app.AppCompatActivity; import java.io.File; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.Gallery; import android.widget.ImageSwitcher; import android.widget.ImageView; import android.widget.Toast; import android.widget.ViewSwitcher; import android.widget.AdapterView.OnItemClickListener; import android.widget.Gallery.LayoutParams; public class MainActivityextends AppCompatActivity implements AdapterView.OnItemSelectedListener, ViewSwitcher.ViewFactory { private List< String> ImageList; private String []list; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageList=getSD(); list = ImageList.toArray(new String[ImageList.size()]); Gallery g = (Gallery) findViewById(R.id.mygallery); g.setAdapter(new ImageAdapter(this,getSD())); g.setOnItemSelectedListener(this); g.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView< ?> parent, View v, int position, long id) { Toast.makeText(MainActivity.this, "点击了一张图片 ", Toast.LENGTH_SHORT).show(); } }); }private List< String> getSD() {List< String> it=new ArrayList< String> (); File f=new File("/sdcard/"); File[] files=f.listFiles(); for(int i=0; i< files.length; i++) { File file=files[i]; if(getImageFile(file.getPath())) it.add(file.getPath()); } return it; }private boolean getImageFile(String fName) { boolean re; String end=fName.substring(fName.lastIndexOf(".")+1, fName.length()).toLowerCase(); if(end.equals("jpg")||end.equals("gif")||end.equals("png") ||end.equals("jpeg")||end.equals("bmp")) { re=true; } else { re=false; } return re; }public class ImageAdapter extends BaseAdapter {int mGalleryItemBackground; private Context mContext; private List< String> lis; public ImageAdapter(Context c,List< String> li) { mContext = c; lis=li; TypedArray a = obtainStyledAttributes(R.styleable.Gallery); mGalleryItemBackground = a.getResourceId( R.styleable.Gallery_android_galleryItemBackground, 0); a.recycle(); }public int getCount() { return lis.size(); }public Object getItem(int position) { return position; }public long getItemId(int position) { return position; }public View getView(int position, View convertView, ViewGroup parent) {ImageView i = new ImageView(mContext); Bitmap bm = BitmapFactory.decodeFile(lis. get(position).toString()); i.setImageBitmap(bm); i.setScaleType(ImageView.ScaleType.FIT_XY); i.setLayoutParams(new Gallery.LayoutParams(400, 400)); i.setBackgroundResource(mGalleryItemBackground); return i; } }public void onItemSelected(AdapterView< ?> parent, View view, int position, long id) { String photoURL=list[position]; Log.i("A",String.valueOf(position)); }public void onNothingSelected(AdapterView< ?> parent) { // TODO Auto-generated method stub}public View makeView() { ImageView i = new ImageView(this); i.setBackgroundColor(0xFF000000); i.setScaleType(ImageView.ScaleType.FIT_CENTER); i.setLayoutParams(new ImageSwitcher.LayoutParams( LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)); return i; } }

MainActivity 
Android_使用Gallery浏览手机上SD卡中图片

文章图片
Android_使用Gallery浏览手机上SD卡中图片

文章图片
< ?xml version="1.0" encoding="utf-8"?> < resources> < declare-styleable name="Gallery"> < attr name="android:galleryItemBackground" /> < /declare-styleable> < declare-styleable name="mygallery"> attributes< /declare-styleable> < /resources>

attrs.xml 
一、获取手机存储卡权限
< uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
 
二、界面布局
放置一个Gallery控件
 
三、实现Gallery控件功能
1、获取SD卡中图片文件
private List< String> getSD() {List< String> it=new ArrayList< String> (); File f=new File("/sdcard/"); File[] files=f.listFiles(); for(int i=0; i< files.length; i++) { File file=files[i]; if(getImageFile(file.getPath())) it.add(file.getPath()); } return it; }

 
2、对图片进行筛选
private boolean getImageFile(String fName) { boolean re; String end=fName.substring(fName.lastIndexOf(".")+1, fName.length()).toLowerCase(); if(end.equals("jpg")||end.equals("gif")||end.equals("png") ||end.equals("jpeg")||end.equals("bmp")) { re=true; } else { re=false; } return re; }

 
定义ImageAdapter类,继承于BaseAdapter类
 
构造方法:SimpleAdapter(Contextcontext,List> data,intresource,String[]from,int[]to)
context:要使用的上下文环境。
data:是一个List> 类型的集合对象,该集合中每个Map对象生成一个列表项。
resource:界面布局文件的ID,对应的布局文件作为列表项的组件。
【Android_使用Gallery浏览手机上SD卡中图片】from:是一个String[]类型的参数,该参数决定提取Map对象中哪些key对应的value来生成列表项。
to:该参数是一个int[]类型的参数,该参数决定填充哪些组件。
 
SimpleAdapter可以显示图片,文字,选择框等多种需求。SimpleAdapter的数据源只能是List< Map< "键","值"> > 形式的数据。
 
public class ImageAdapter extends BaseAdapter {int mGalleryItemBackground; private Context mContext; private List< String> lis; public ImageAdapter(Context c,List< String> li) { mContext = c; lis=li; TypedArray a = obtainStyledAttributes(R.styleable.Gallery); mGalleryItemBackground = a.getResourceId( R.styleable.Gallery_android_galleryItemBackground, 0); a.recycle(); }public int getCount() { return lis.size(); }public Object getItem(int position) { return position; }public long getItemId(int position) { return position; }public View getView(int position, View convertView, ViewGroup parent) {ImageView i = new ImageView(mContext); Bitmap bm = BitmapFactory.decodeFile(lis. get(position).toString()); i.setImageBitmap(bm); i.setScaleType(ImageView.ScaleType.FIT_XY); i.setLayoutParams(new Gallery.LayoutParams(400, 400)); i.setBackgroundResource(mGalleryItemBackground); return i; } }


makeView来显示浏览的图片
public View makeView() { ImageView i = new ImageView(this); i.setBackgroundColor(0xFF000000); //ImageView.ScaleType可以实现对图片的伸缩 i.setScaleType(ImageView.ScaleType.FIT_CENTER); i.setLayoutParams(new ImageSwitcher.LayoutParams( LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)); return i; }

 
 
注意:
在实现public ImageAdapter(Context c,List< String> li)如何放数据图片文件时候
/*ImageAdapter的构造符*/ public ImageAdapter(Context c,List< String> li) { mContext = c; lis=li; /* 使用res/values/attrs.xml中的< declare-styleable> 定义 * 的Gallery属性.*/ TypedArray a = obtainStyledAttributes(R.styleable.Gallery); /*取得Gallery属性的Index id*/ mGalleryItemBackground = a.getResourceId( R.styleable.Gallery_android_galleryItemBackground, 0); /*让对象的styleable属性能够反复使用*/ a.recycle(); }

R.styleable在SDK1.5中已经不再支持,我是把自己工程项目SDK调到1.4解决的
Android中R.styleable 无法解析时候的解决办法:传送门
感谢:Android中Gallery显示手机中的图片
Android_使用Gallery浏览手机上SD卡中图片

    推荐阅读