android写一个图片选择

可以达到的效果

  1. 第一个图片的位置放照相机,点击打开照相机
  2. 其余的是显示全部存储的图片,点击一次是查看大图,长按则是每张图片出现一个checkBox,可以进行选择

下面是实例效果图

MainActivity 类

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener, ImageAdapter.OnImageCheckListener, View.OnClickListener {

    private static final int CAMERA_CODE = 12;
    List<File> fileList = new ArrayList<>();
    ImageAdapter adapter;

    GridView gvImage;
    TextView tvFinish;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        //弹出对话框,加载数据
        loadData();
    }

    private void initView() {
        gvImage = (GridView) findViewById(R.id.gv_image);
        tvFinish = (TextView) findViewById(R.id.tv_finish);

        adapter = new ImageAdapter(this, fileList);
        adapter.setOnImageCheckListener(this);
        gvImage.setAdapter(adapter);
        gvImage.setOnItemClickListener(this);
        gvImage.setOnItemLongClickListener(this);

        tvFinish.setOnClickListener(this);
    }

    private ProgressDialog showProgressDialog() {
        //弹出对话框
        ProgressDialog dialog = new ProgressDialog(this);
        dialog.setTitle("提示");
        dialog.setMessage("正在加载图片,请稍等。。。");
        dialog.show();
        return dialog;
    }

    private void loadData() {
        final ProgressDialog dialog = showProgressDialog();
        //开启线程
        new Thread() {
            @Override
            public void run() {
                super.run();
                //递归
                //从sd卡中获取所有图片
                getFile(Environment.getExternalStorageDirectory());
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        dialog.dismiss();
                        adapter.notifyDataSetChanged();
                    }
                });
            }
        }.start();
    }

    public void getFile(File dir) {
        //1. 获取子目录
        File[] files = dir.listFiles();
        if (files == null)
            return;
        //集合或者数组去点for
        for (File file : files) {
            if (file.isDirectory())
                getFile(file);
            else {
                //加载图片
                if (file.getName().endsWith(".png") || file.getName().endsWith(".jpg")) {
                    fileList.add(file);
                }
            }

        }
    }

    File cameraFile;

    //点击
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        if (position == 0) {
            //getAbsolutePath返回的路径是没有"/"
            cameraFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/DCIM/" + System.currentTimeMillis() + ".png");
            //打开照相机
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            //照相机需要带数据
            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cameraFile));
            startActivityForResult(intent, CAMERA_CODE);
        } else {
            //打开大图
            File file = fileList.get(position - 1);
            //带数据跳转到现实大图
            Intent intent = new Intent(this, ShowBigImage.class);
            intent.putExtra("file", file);
            startActivity(intent);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.e("TAG", resultCode + "---------------------");
        if (requestCode == CAMERA_CODE && resultCode == RESULT_OK) {
            Log.e("TAG", (cameraFile.exists()) + "");
            fileList.add(0, cameraFile);
            adapter.notifyDataSetChanged();
        }
    }

    //长按
    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        if (position == 0)
            return false;
        else {
            adapter.open(position);
        }
        return true;
    }

    @Override
    public void onImageCheck(boolean b) {
        //b代表 适配器中 有没有勾选的值
        tvFinish.setEnabled(b);

    }

    @Override
    public void onClick(View v) {
        //需要知道有哪些数据被选中
        //不能使用泛型,ArrayList才实现了序列化,List没有实现
        ArrayList<File> resultList = new ArrayList<>();
        //通过适配器中的 为true的 选中的项来加载file
        SparseBooleanArray booleanArray = adapter.getBooleanArray();
        for (int i = 0; i < booleanArray.size(); i++) {
            boolean isCheck = booleanArray.get(booleanArray.keyAt(i));
            if (isCheck) {
                int position = booleanArray.keyAt(i);
                resultList.add(fileList.get(position - 1));
            }
        }
        Intent intent = new Intent();
        intent.putExtra("list", resultList);
        //返回数据
        setResult(RESULT_OK, intent);
        finish();
    }
}

ImageAdapter 类

public class ImageAdapter extends ListItemAdapter<File> {

    private boolean select = false;

    public void open(int posisiont) {
        select = true;
        booleanArray.put(posisiont, true);
        if (onImageCheckListener != null)
            onImageCheckListener.onImageCheck(true);
        this.notifyDataSetChanged();
    }

    public void close() {
        select = false;
        booleanArray.clear();
        notifyDataSetChanged();
    }

    //position
    //HashMap<Integer, Boolean> map = new HashMap<>();

    private  SparseBooleanArray booleanArray = new SparseBooleanArray();

    public SparseBooleanArray getBooleanArray() {
        return booleanArray;
    }

    public ImageAdapter(Context context, List<File> list) {
        super(context, list);
    }

    @Override
    public int getCount() {
        //多出来的就是照相机
        return super.getCount() + 1;
    }

    //    @Override
//    public View getView(int position, View convertView, ViewGroup parent) {
//        if (convertView == null) {
//            ImageView iv = new ImageView(mContext);
//            iv.setScaleType(ImageView.ScaleType.CENTER_CROP);
//            iv.setBackgroundColor(Color.argb(0xFF, 0x07, 0x05, 0x18));
//            int width = mContext.getResources().getDisplayMetrics().widthPixels / 3 - 2;
//            GridView.LayoutParams params = new GridView.LayoutParams(width, width);
//            iv.setPadding(2, 2, 2, 2);
//            iv.setLayoutParams(params);
//            convertView = iv;
//        }
//        ImageView iv = (ImageView) convertView;
//        if (position == 0) {
//            //照相机
//            iv.setImageResource(R.mipmap.camera);
//        } else {
//            iv.setImageURI(Uri.fromFile(getItem(position - 1)));
//        }
//        return convertView;
//    }
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = View.inflate(mContext, R.layout.item_image, null);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        if (position == 0) {
            holder.image.setImageResource(R.mipmap.camera);
            holder.checkBox.setVisibility(View.GONE);
        } else {
            holder.image.setImageURI(Uri.fromFile(getItem(position - 1)));
            if (select) {
                holder.checkBox.setVisibility(View.VISIBLE);
                //当前的需不需要勾选呢
                //null
                Boolean b = booleanArray.get(position);
                if (b == null || b == false) {
                    holder.checkBox.setChecked(false);
                } else {
                    holder.checkBox.setChecked(true);
                }
                //item点击和布局冲突
                holder.checkBox.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Boolean b = booleanArray.get(position);
                        if (b == null || b == false)
                            b = true;
                        else
                            b = false;
                        booleanArray.put(position, b);
                        //判断所有的boolean,如果已经没有一个true 关闭
                        for (int i = 0; i < booleanArray.size(); i++) { //4-true  0==false
                            //两个值  key -- > 3 4
                            // 0  1  2 3 4 5
                            boolean isChecked = booleanArray.get(booleanArray.keyAt(i));
                            Log.e("TAG", "----" + isChecked);
                            Log.e("TAG", booleanArray.toString());
                            if (isChecked) {
                                //有被勾选的值
                                if (onImageCheckListener != null)
                                    onImageCheckListener.onImageCheck(true);
                                return;
                            }
                        }
                        if (onImageCheckListener != null)
                            onImageCheckListener.onImageCheck(false);
                        //没有被勾选的值了
                        //关闭
                        close();
                    }
                });
            } else {
                holder.checkBox.setVisibility(View.GONE);
            }
            //不能使用onCheck
//            holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
//                @Override
//                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//                    booleanArray.put(position, isChecked);
//                }
//            });
        }
        return convertView;
    }

    //回调方法。
    //写在需要执行方法的地方
    //他实现 在需要返回的地方
    public interface OnImageCheckListener {
        public void onImageCheck(boolean b);
    }

    private OnImageCheckListener onImageCheckListener;

    //alt+insert

    public void setOnImageCheckListener(OnImageCheckListener onImageCheckListener) {
        this.onImageCheckListener = onImageCheckListener;
    }

    class ViewHolder {
        ImageView image;
        CheckBox checkBox;

        public ViewHolder(View convertView) {
            image = (ImageView) convertView.findViewById(R.id.iv_image);
            int width = mContext.getResources().getDisplayMetrics().widthPixels / 3 - 2;
            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(width, width);
            image.setLayoutParams(params);
            checkBox = (CheckBox) convertView.findViewById(R.id.cb_check);
        }

    }
}

ListItemAdapter类

//也可以用 extends 来限制一个泛型的父类
//在类的后面定义一个泛型
public abstract class ListItemAdapter<T> extends BaseAdapter {

    protected Context mContext;
    protected List<T> mList;

    //必须要有上下文,数据
    //List<File>  List<String>
    public ListItemAdapter(Context context, List<T> list) {
        mContext = context;
        mList = list;
    }

    //适配器去加载一个List
    public void setList(List<T> list) {
        this.mList = list;
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return mList == null ? 0 : mList.size();
    }

    @Override
    public T getItem(int position) {
        return mList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }
}

ShowBigImage 类

public class ShowBigImage extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ImageView iv = new ImageView(this);
        File file = (File) getIntent().getSerializableExtra("file");
        iv.setImageURI(Uri.fromFile(file));
        setContentView(iv);
    }
}

main_xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.administrator.imageselector.MainActivity">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="@color/colorPrimary">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="选取图片"
            android:textColor="@android:color/white"
            android:textSize="18sp" />

        <TextView
            android:id="@+id/tv_finish"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="10dp"
            android:enabled="false"
            android:text="完成"
            android:textColor="@color/textenable" />
    </RelativeLayout>

    <GridView
        android:id="@+id/gv_image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:horizontalSpacing="2dp"
        android:numColumns="3"
        android:verticalSpacing="2dp" />
</LinearLayout>

item_image.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#03030a">

    <ImageView
        android:id="@+id/iv_image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="5dp"
        android:scaleType="centerCrop"
        android:src="@mipmap/camera" />

    <CheckBox
        android:id="@+id/cb_check"
        android:button="@null"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:background="@drawable/cb_selector"
        android:layout_alignParentRight="true"
        android:layout_margin="10dp"
       />

</RelativeLayout>

res下color文件夹下的textenable.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@android:color/white" android:state_enabled="true" />
    <item android:color="@android:color/darker_gray" android:state_enabled="false" />
</selector>
时间: 2024-10-06 14:09:25

android写一个图片选择的相关文章

Android实现本地图片选择及预览缩放效果仿春雨医生

在做项目时经常会遇到选择本地图片的需求,以前都是懒得写直接调用系统方法来选择图片,但是这样并不能实现多选效果,最近又遇到了,所以还是写一个demo好了,以后也方便使用.还是首先来看看效果 显示的图片使用RecyclerView实现的,利用Glide来加载:下面弹出的图片文件夹效果是采用PopupWindow实现,这里比采用PopupWindow更方便,弹出显示的左边图片是这个文件夹里的第一张图片:选中的图片可以进行预览,使用网上一个大神写的来实现的:至于图片的获取是用ContentProvide

自己写一个图片验证码程序

本程序基于struts2,用action响应请求. 一.首先,创建一个用于产生随即验证码图片的类ImageCode.java. 1 package com.exp.image; 2 3 import java.awt.BasicStroke; 4 import java.awt.Color; 5 import java.awt.Font; 6 import java.awt.Graphics; 7 import java.awt.Graphics2D; 8 import java.awt.Ren

自己写一个图片按钮(XAML)

有时需要用三张图片(正常状态,鼠标移上,鼠标按下)来作为一个按钮的样式,虽然这种做法不好,应该用矢量的方式制作样式,但有的时候还是需要这样做的. 每次都修改按钮的样式来实现这个做法,既麻烦又会生成大段的XAML代码,不利于维护,抽出一个自定义图片按钮控件,只需传入三张图片的路径即可使用,显然是更好的做法,下面就演示一下如何编写这个控件,VS2015和Blend2015结合使用. 1. 首先,在VS中新建一个WPF自定义控件库,命名为WpfCustomControlLibrary,系统会自动生成一

Android中将一个图片切割成多个图片[转]

有种场景,我们想将一个图片切割成多个图片.比如我们在开发一个拼图的游戏,就首先要对图片进行切割. 以下是封装好的两个类,可以实现图片的切割.仅供参考和学习. 一个是ImagePiece类,此类保存了一个Bitmap对象和一个标识图片的顺序索引的int变量. Java代码   package arui319.blog.csdn.net; import android.graphics.Bitmap; public class ImagePiece { public int index = 0; p

Android中将一个图片切割成多个图片

有种场景,我们想将一个图片切割成多个图片.比如我们在开发一个拼图的游戏,就首先要对图片进行切割. 以下是封装好的两个类,可以实现图片的切割.仅供参考和学习. 一个是ImagePiece类,此类保存了一个Bitmap对象和一个标识图片的顺序索引的int变量. 1 package com.example.imagesplitter; 2 3 import android.graphics.Bitmap; 4 5 /** 6 * 图片切割实体类 7 */ 8 public class ImagePie

写一个图片轮播器(使用collectionView)

一.属性 我们需要一个 collectionView 和一个 NStimer .collectionView 用来存放需要循环播放的对象, NSTimer 用来定时滚动collectionView @interface ViewController ()<UICollectionViewDelegate,UICollectionViewDataSource> @property(nonatomic,strong)UICollectionView* showCollection; @proper

Vue学习—Vue写一个图片轮播组件

1.先看效果: 熟悉的图片轮播,只要是个网站,百分之90以上会有个图片轮播.我认为使用图片轮播. 第一可以给人以一种美观的感受,而不会显得网站那么呆板, 第二可以增加显示内容,同样的区域可以显示更多内容. 2.每学一个新东西 ,图片轮播都是很好的练手案例,而且,也很实用. 3.基本要求:页面加载,自动播放.鼠标悬停,停止播放.鼠标离开,继续播放 点击左右箭头切换上一张,下一张图片. 下方小圆点显示当前位第几张图片. 4.使用Vue实现,想法: 5.示例代码 结构html: <template>

android写一个API包给别人用,怎么来。

http://vip.shulink.com/files/article/html/45/45869/2345396.html http://vip.shulink.com/files/article/html/45/45869/2345403.html http://vip.shulink.com/files/article/html/45/45869/2347868.html http://vip.shulink.com/files/article/html/45/45869/2390293

Android实用视图动画及工具系列之九:漂亮的图片选择器,高性能防崩溃图片选择工具

实现效果 功能说明 Andorid-ImagesPickers是一个图片选择(单选/多选).拍照.裁剪的图片选择器.使用方便,功能可自己配置,Andorid-ImagesPickers自身并没有强制绑定某个ImageLoader,开发者可以根据自己项目给Andorid-ImagesPickers配置图片加载器. 也许有人会问:系统不是有相册选择器吗,为什么还有做一个图片选择器呢,有必要吗?我告诉你很有必要.微信,QQ等等App它们都是自己带图片选择器,并没有直接调系统的图片选择器.为什么要这么做