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

作者:lqh 时间:2021-09-13 13:13:19 

 Android 图片选择

可以达到的效果:

1.第一个图片的位置放照相机,点击打开照相机

2.其余的是显示全部存储的图片,点击一次是查看大图,长按则是每张图片出现一个checkBox,可以进行选择

下面是实例效果图

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

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,图片选择
0
投稿

猜你喜欢

  • Java实现输出数字三角形实例代码

    2023-08-25 02:09:51
  • Java数组传递及可变参数操作实例详解

    2023-08-26 21:21:59
  • Lombok中@EqualsAndHashCode注解的使用及说明

    2023-11-30 04:47:05
  • C#使用udp如何实现消息的接收和发送

    2022-05-26 20:56:01
  • ios百度地图的使用(普通定位、反地理编码)

    2023-07-03 15:26:17
  • java抓包后对pcap文件解析示例

    2022-11-23 20:21:53
  • Android仿今日头条顶部导航栏效果的实例代码

    2022-04-02 23:18:03
  • SpringBoot项目鉴权的4种方式小结

    2021-10-23 20:10:05
  • java使用JNA(Java Native Access)调用dll的方法

    2022-02-06 09:27:34
  • Android动态加载布局实现技巧介绍

    2022-03-06 13:31:48
  • 解析Spring Mvc Long类型精度丢失问题

    2021-11-06 12:27:37
  • Spring Boot 2结合Spring security + JWT实现微信小程序登录

    2022-07-14 08:25:54
  • Android 开发之BottomBar+ViewPager+Fragment实现炫酷的底部导航效果

    2022-01-07 19:39:20
  • Springboot轻量级的监控组件SpringbootAdmin

    2023-08-25 10:08:31
  • Java多线程实现复制文件

    2023-03-21 07:54:17
  • Android仿银行客户签名并且保存签名的截图文件并命名为本地时间

    2023-09-19 22:42:48
  • Android创建服务之started service详细介绍

    2022-12-09 15:10:29
  • Flutter 仿微信支付界面

    2023-08-30 01:31:53
  • Java 中的垃圾回收机制详解

    2023-01-11 19:32:34
  • Android Studio真机无线连接USB设备调试运行详解流程

    2023-12-13 00:37:37
  • asp之家 软件编程 m.aspxhome.com