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 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 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 {  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 map = new HashMap<>();  private SparseBooleanArray booleanArray = new SparseBooleanArray();  public SparseBooleanArray getBooleanArray() {    return booleanArray;  }  public ImageAdapter(Context context, List 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 extends BaseAdapter {  protected Context mContext;  protected List mList;  //必须要有上下文,数据  //List List  public ListItemAdapter(Context context, List list) {    mContext = context;    mList = list;  }  //适配器去加载一个List  public void setList(List 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"?>              

item_image.xml

<?xml version="1.0" encoding="utf-8"?>    

res下color文件夹下的textenable.xml

<?xml version="1.0" encoding="utf-8"?>    

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多相关文章

  1. Android(安卓)N中不再支持“Crypto”的解决方案
  2. android gallery 自定义边框+幻灯片效果
  3. Android本地相册图片URI转换绝对路径
  4. Android(安卓)获取drawable目录图片 并存入指定文件的步骤详解
  5. 安卓按钮有按下去的效果的实现方法
  6. Android中通过其他APP启动Activity的四种方式
  7. Android在ExpandableListView控制的基本使用
  8. Android(安卓)4.0 新增的显示数据集的桌面控件
  9. Android(安卓)自定义 HorizontalScrollView 打造再多图片(控件)也

随机推荐

  1. Android(安卓)TypedArray源码详解
  2. Android(安卓)ApiDemos示例解析(110):Vie
  3. 第10章(2)---ThreadLocal
  4. ProgressBar 修改progressDrawable 出现s
  5. android开发-界面设计基本知识Ⅳ
  6. 三端易用的现代跨平台JsBridge之 IOS篇
  7. Android(安卓)如何在strings.xml中放置ht
  8. android中完全退出当前程序的几种方法
  9. Android(安卓)画图Path的使用
  10. android studio报错Unsupported major.mi