每个项目基本上都有相册和拍照选择图片这个功能。
这里我也记录一下,每次只需复制到我们项目里边就可以了,可以为我们节约很多的时间。
所以这里和大家分享一下这个强大的图片选择器,基本上能满足我们项目中遇到的情况。
功能
- 可以选择相机,相册和文件管理
- 可以做头像修改
- 可以做类似发朋友圈选择多张图片(同样可以拍照和选择)
- 可以设置最多选择的张数
- 源码任意修改,简单易懂,修改称自己喜欢的界面
- 点击可查看大图(而且任意地方可调用)
那先看一下基本效果:
修改头像.jpg选择照片.jpg
基本效果.jpg
那么下面我们来说一下使用步骤:
- 项目中使用到ImageLoader,所以先引入这个库,已经使用到了则直接跳过
这里可以给大家一个,当然也可以自己去找
implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
- 下载代码按照文件夹名字拷贝到对应的文件夹下面这一步大家应该很熟悉嘿嘿 文件示意图.png
点击这里下载源码哦!!!!- 修改拷贝进项目的bug,多数只需修改引入路径,xml文件中的包名
- 在 manifest.xml 文件中添加 activity 和 provider
<!-- 这里下面的这些activity对应上别遗漏就ok --> <activity android:name=".header.photo.PhotoActivity" android:launchMode="singleTask" android:windowSoftInputMode="adjustPan|stateUnspecified"/> <activity android:name=".header.photo.PhotoAlbumActivity" android:windowSoftInputMode="adjustPan|stateUnspecified" android:launchMode="singleTask" android:screenOrientation="portrait"/> <activity android:name=".header.TakePhotoActivity" android:windowSoftInputMode="adjustPan|stateUnspecified" android:launchMode="singleTask" android:theme="@style/MyDialogStyleBottom" android:screenOrientation="portrait"/> <activity android:name=".header.SavePhotoPopActivity" android:windowSoftInputMode="adjustPan|stateUnspecified" android:launchMode="singleTask" android:theme="@style/DialogStyleRight" android:screenOrientation="portrait"/> <activity android:name=".header.PhotoViewActivity" android:windowSoftInputMode="adjustPan|stateUnspecified" android:launchMode="singleTask" android:screenOrientation="portrait"/> <!-- 此部分代码需要移植到您的 app 下的 manifest,并且 authorities 指定您的包名。例如:com.android.FileProvider --> <!-- 否则使用拍照功能时,会崩溃 --> <provider android:name="android.support.v4.content.FileProvider" android:authorities="自己的包名.FileProvider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/rc_file_path"/> </provider>
- 单个图片的调用,比如说这里点击上传头像
TakePhotoActivity.startActivityForSiglePhoto(HeaderActivity.this, 10, false);//点击调用
//选择后回调,10表示单张选择,1表示多图选择 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { switch (requestCode) { case 1: //图片选择 // 选择图片返回路径 ArrayList<String> dataPath1 = new ArrayList<>(); if (!TextUtils.isEmpty(TakePhotoActivity.getDataPath(data)) && !"null".equals(TakePhotoActivity.getDataPath(data))) { dataPath1.add(TakePhotoActivity.getDataPath(data)); } else { dataPath1 = TakePhotoActivity.getDataPathArr(data); } addImageAdapter.remove(0); if (dataPath1 == null || dataPath1.size() < 1) { return; } for (int i = 0; i < dataPath1.size(); i++) { PublicImage aa = new PublicImage(); aa.cover = dataPath1.get(i); addImageAdapter.getList().add(i, aa); } if (addImageAdapter.getCount() < 4) { addImageAdapter.getList().add(0, itemAdd); } addImageAdapter.notifyDataSetChanged(); break; case 10: // 头像选择 // 选择图片返回路径 String dataPath = ""; dataPath = TakePhotoActivity.getDataPath(data); Bitmap bitmap = Utils.GetLocalOrNetBitmap(dataPath); ivHeader.setImageBitmap(bitmap); header = Utils.bitmapToBase641(bitmap); //header是定义的一个String变量 Log.d(TAG, "onActivityResult: header==>" + header); if (!TextUtils.isEmpty(header)) { //上传服务器 // setHeader(); } break; } } }
- 多图选择调用,这里需要自己在需要使用到的地方添加GridView,下面举个例子:
xml文件中<GridView android:id="@+id/gv_image" android:layout_width="match_parent" android:numColumns="4" android:listSelector="#00000000" android:verticalSpacing="10dp" android:layout_marginRight="@dimen/dp_16" android:layout_marginLeft="@dimen/dp_16" android:cacheColorHint="#00000000" android:layout_marginTop="@dimen/dp_260" android:layout_height="wrap_content"> </GridView>
java代码:
/** * 选择图片 */ private AddImageAdapter addImageAdapter; private List<PublicImage> images; private PublicImage itemAdd; private GridView gridView; //初始化界面 private void initView() { ivHeader = findViewById(R.id.iv_header); gridView =findViewById(R.id.gv_image); //权限检查 if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { Utils.showToast(this, "木有权限"); ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 0); } // 显示的添加按钮 itemAdd = new PublicImage(); itemAdd.isAdd = true; images = new ArrayList<>(); images.add(itemAdd); addImageAdapter = new AddImageAdapter(HeaderActivity.this, 1); gridView.setAdapter(addImageAdapter); addImageAdapter.setData(images); //点击更换头像 ivHeader.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TakePhotoActivity.startActivityForSiglePhoto(HeaderActivity.this, 10, false); } }); } /** * 获取图片编码传给后台 * @return 以“|”分隔的图片编码 */ private String getImgeString() { String images = ""; List<PublicImage> imageList = addImageAdapter.getList(); if (imageList != null) { // ViewUtils.showLog("imagelist_size==>" + imageList.size()); if (imageList.size() > 2) { for (int i = 1; i < imageList.size(); i++) { // Logger.d("imageuil==>>"+ imageList.get(i).cover); Bitmap img = Utils.GetLocalOrNetBitmap(imageList.get(i).cover); String str = Utils.bitmapToBase641(img); images += (str + "|"); } images = images.substring(0, images.length() - 1); } else { if (imageList.size() > 1) { Bitmap img = Utils.GetLocalOrNetBitmap(imageList.get(1).cover); images = Utils.Bitmap2StrByBase64(img); } } } // ViewUtils.showLog("image==>" + images); return images; }
- 点击查看大图则在 AddImageAdapter 中可查看使用方法
PhotoViewActivity.startActivity(context,position, imgs); //这样即可
好了!大功告成!!!
回手掏,鬼刀一开看不见,走位,走位!!! 哈哈哈哈哈
网友评论