zoukankan      html  css  js  c++  java
  • 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显示手机中的图片

    (如需转载学习,请标明出处)
  • 相关阅读:
    【BZOJ2741】L-分块+可持久化trie
    【BZOJ4241】历史研究-回滚莫队
    【BZOJ4137】火星商店问题(FJOI2015)-线段树分治+可持久化trie
    【HDU4117】GRE Words-AC自动机+线段树优化DP
    noi.ac系列NOIP2018模拟赛参赛实录
    【BZOJ1835】基站选址(ZJOI2010)-DP+线段树优化
    【BZOJ4912】天才黑客(SDOI2017)-最短路+虚树+线段树优化建图
    【HDU4897】Little Devil I-树链剖分
    【UOJ#282】长度测量鸡-数学证明
    10.12
  • 原文地址:https://www.cnblogs.com/1138720556Gary/p/9058310.html
Copyright © 2011-2022 走看看