全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

详解android写一个选择图片的示例代码

可以达到的效果

  • 第一个图片的位置放照相机,点击打开照相机
  • 其余的是显示全部存储的图片,点击一次是查看大图,长按则是每张图片出现一个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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# android  # 选择图片  # 选择本地图片  # android选择多张图片  # Android仿微信选择图片和拍照功能  # Android拍照或从图库选择图片并裁剪  # Android实现拍照、选择图片并裁剪图片功能  # android完美实现 拍照 选择图片 剪裁等代码分享  # 勾选  # 加载  # 弹出  # 递归  # 对话框  # 的是  # 第一个  # 不需要  # 则是  # 要有  # 可以用  # 写在  # 多出  # 可以达到  # 回调  # 正在加载  # 大家多多  # 跳转到  # 请稍等  # 实现了 


相关文章: 网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  济南网站制作的价格,历城一职专官方网站?  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  如何选择高性价比服务器搭建个人网站?  c# 在ASP.NET Core中管理和取消后台任务  制作网站的基本流程,设计网站的软件是什么?  建站之星后台密码遗忘如何找回?  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  python的本地网站制作,如何创建本地站点?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  重庆网站制作公司哪家好,重庆中考招生办官方网站?  如何安全更换建站之星模板并保留数据?  如何快速搭建高效WAP手机网站吸引移动用户?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  如何配置IIS站点权限与局域网访问?  C++如何编写函数模板?(泛型编程入门)  如何制作一个表白网站视频,关于勇敢表白的小标题?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  历史网站制作软件,华为如何找回被删除的网站?  小程序网站制作需要准备什么资料,如何制作小程序?  测试制作网站有哪些,测试性取向的权威测试或者网站?  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  网站制作软件免费下载安装,有哪些免费下载的软件网站?  建站主机默认首页配置指南:核心功能与访问路径优化  如何通过VPS建站实现广告与增值服务盈利?  网站按钮制作软件,如何实现网页中按钮的自动点击?  建站主机系统SEO优化与智能配置核心关键词操作指南  已有域名和空间如何快速搭建网站?  网站制作模板下载什么软件,ppt模板免费下载网站?  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  如何续费美橙建站之星域名及服务?  建站VPS推荐:2025年高性能服务器配置指南  佛山网站制作系统,佛山企业变更地址网上办理步骤?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  大同网页,大同瑞慈医院官网?  公司网站制作价格怎么算,公司办个官网需要多少钱?  Python路径拼接规范_跨平台处理说明【指导】  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  如何在万网ECS上快速搭建专属网站?  建站主机选虚拟主机还是云服务器更好?  Android自定义控件实现温度旋转按钮效果  深入理解Android中的xmlns:tools属性  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  早安海报制作网站推荐大全,企业早安海报怎么每天更换?  如何选择高效响应式自助建站源码系统?  中山网站推广排名,中山信息港登录入口? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。