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

    (如需转载学习,请标明出处)
  • 相关阅读:
    Ubuntu 14.04 卸载通过源码安装的库
    Ubuntu 14.04 indigo 相关依赖
    Ubuntu 14.04 indigo 安装 cartographer 1.0.0
    Ubuntu 14.04 改变文件或者文件夹的拥有者
    安装cartographer遇到Unrecognized syntax identifier "proto3". This parser only recognizes "proto2"问题
    Unrecognized syntax identifier "proto3". This parser only recognizes "proto2". ”问题解决方法
    查看所有用户组,用户名
    1卸载ROS
    Ubuntu14.04 软件安装卸载
    Ubuntu14.04系统显示器不自动休眠修改
  • 原文地址:https://www.cnblogs.com/1138720556Gary/p/9058310.html
Copyright © 2011-2022 走看看