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

 

<?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

 

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;
    }
}
MainActivity

 

<?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,对应的布局文件作为列表项的组件。

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显示手机中的图片

posted @ 2018-05-18 22:44  Cynical丶Gary  阅读(324)  评论(0编辑  收藏  举报