Android 图片选择详解及实例代码
程序员文章站
2024-02-23 10:51:58
android 图片选择
可以达到的效果:
1.第一个图片的位置放照相机,点击打开照相机
2.其余的是显示全部存储的图片,点击一次是查看大图,长按则是...
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>
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!