首页 > 系统 > Android > 正文

Android 图片选择详解及实例代码

2019-12-12 04:13:43
字体:
来源:转载
供稿:网友

 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>

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表