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>
<?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>
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 MainActivity extends 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; } }
<?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>
一、获取手机存储卡权限
<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,对应的布局文件作为列表项的组件。
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 无法解析时候的解决办法:传送门
(如需转载学习,请标明出处)