Android微信图片浏览框架设计
一、业务场景
1、聊天界面发送图片==>多选点选+有右上角”发送”+图片预览==>图片预览支持右上角”发送”逻辑
2、发表动态==>多选点选+右上角”完成”+图片预览==>图片预览支持右上角”完成”逻辑
3、个人资料更改头像==>单选点选+图片预览截图==>图片预览截图支持右上角”使用”逻辑
二、Intent参数设计;(Intent传参原则:尽量不要使用自定义类型专递参数)
1、最基本的参数传递(可选图片最大数目、右上角的标题、单选模式还是多选模式、返回结果的参数)
/**最大图片选择次数,int类型,默认9*/ publicstaticfinalStringEXTRA_SELECT_COUNT="max_select_count"; /**发送按钮的标题如完成或发送*/ publicstaticfinalStringEXTRA_SUBMIT_TITLE="extra_submit_title"; /**图片选择模式,默认多选*/ publicstaticfinalStringEXTRA_SELECT_MODE="select_count_mode"; /**选择结果,返回为ArrayList<String>图片路径集合*/ publicstaticfinalStringEXTRA_RESULT="select_result";
2、扩展部分参数传递(图片选择界面的第一个Item是否显示拍照功能、预览的activity是否支持”勾选取消结束”勾选按钮)
/**是否显示相机,默认显示*/ publicstaticfinalStringEXTRA_SHOW_CAMERA="show_camera"; /**是否跳转到ImageDetailCheckPicsAct上*/ publicstaticfinalStringEXTRA_JUMPTOCHECKPICS="is_jumpto_checkpics";
3、在”发表动态选择”已经选了5张图片,再去选择图片–图片浏览器需要将已选的图片勾选状态设置为勾选
/**默认已被选择集*/ publicstaticfinalStringEXTRA_DEFAULT_SELECTED_LIST="default_list";
4、截图功能(单选模式下,如果启动截图模式,那么选择后跳转截图界面)
/**单选是否原图返回或先跳转截图后返回*/ publicstaticfinalStringRESIZEBIT="RESIZEBIT"; /**截图保存的路径*/ publicstaticfinalStringRESULT="resultPath"; /**单选是否截图*/ publicstaticfinalStringMODE_SCALE_BOOLEAN="MODE_SCALE_BOOLEAN"; /**单选截图区域蓝色框的宽;单位dp*/ publicstaticfinalStringSCALEW="scaleW"; /**单选截图区域蓝色框的高;单位dp*/ publicstaticfinalStringSCALEH="SCALEH"; /**单选截图后图片保存的像素宽;单位sp*/ publicstaticfinalStringLIMITW="limitWidth"; /**单选截图后图片保存的像素高;单位sp*/ publicstaticfinalStringLIMITH="limitHight"; /**单选截图的保存的路径*/ publicstaticfinalStringMODE_SCALE_PATH="MODE_SCALE_PATH";
三、理清楚需求之后进行设计
此处省略;分享的代码实现的功能,尚未设计优化代码可读性较差
代码项目github地址IMAlbum
四、代码使用方法
publicstaticvoidjumpToSelectPics(ActivitymContext,booleanisShowCamera,intselectMaxCount,intselectMode,
StringsubmitBtnStr,booleanisJumpToCheckPics,ArrayList<String>hasSelectList){
Intentintent=newIntent(mContext,MultiImageSelectorActivity.class);
//whethershowcamera
intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA,isShowCamera);
//Stringofsubmitbutton
intent.putExtra(MultiImageSelectorActivity.EXTRA_SUBMIT_TITLE,submitBtnStr);
//Stringofsubmitbutton
intent.putExtra(MultiImageSelectorFragment.EXTRA_JUMPTOCHECKPICS,isJumpToCheckPics);
//maxselectimageamount
intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT,selectMaxCount);
//selectmode(MultiImageSelectorActivity.MODE_SINGLEORMultiImageSelectorActivity.MODE_MULTI)
intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_MODE,selectMode);
//EXTRA_DEFAULT_SELECTED_LIST
if(hasSelectList!=null){
intent.putStringArrayListExtra(MultiImageSelectorActivity.EXTRA_DEFAULT_SELECTED_LIST,hasSelectList);
}
//
mContext.startActivityForResult(intent,REQUEST_IMAGE);
}
/**
*图片格式jpeg
*@parampicResultPath图片的要保存的地址
*@paramscaleW截图区域的宽度单位dp
*@paramscaleH截图区域的高度单位dp
*@paramlimtWidth裁剪出来的图的宽度
*@paramlimitHight裁剪出来的图的高度
*@paramisScaleImg是否按照limtWidth、limitHight的比例进行放大缩小
*@description:
*@authorzhangjianlin(990996641)
*@date2015年6月11日下午4:25:00
*/
publicstaticvoidjumpToSelecAndCropImg(ActivitymContext,StringpicResultPath,intscaleW,intscaleH,
intlimtWidth,intlimitHight,booleanisScaleImg){
Intentintent=newIntent(mContext,MultiImageSelectorActivity.class);
//whethershowcamera
intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA,false);
//maxselectimageamount
intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT,1);
//selectmode(MultiImageSelectorActivity.MODE_SINGLEORMultiImageSelectorActivity.MODE_MULTI)
intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_MODE,MultiImageSelectorActivity.MODE_SINGLE);
//intent.putExtra(MultiImageSelectorActivity.EXTRA_DEFAULT_CROP_CAMERA,isScaleImg);
intent.putExtra(CropImageAct.RESIZEBIT,isScaleImg);
intent.putExtra(CropImageAct.RESULT,picResultPath);
intent.putExtra(CropImageAct.SCALEW,scaleW);
intent.putExtra(CropImageAct.SCALEH,scaleH);
intent.putExtra(CropImageAct.LIMITW,limtWidth);
intent.putExtra(CropImageAct.LIMITH,limitHight);
mContext.startActivityForResult(intent,REQUEST_CROPIMAGE);
}
/**
*@Description:选择单张图片不剪切
*返回值ArrayList
switch(requestCode){
caseIntentUtils.REQUEST_IMAGE:
if(data!=null){
ArrayList<String>resultList=data
.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT);
}
break;
}
*@parammContext
*/
publicstaticvoidjumpToSelectNoCropImg(ActivitymContext){
jumpToSelectPics(mContext,false,2,MultiImageSelectorActivity.MODE_SINGLE);
}
五、baseselectactivity类
/**
@Override
publicvoidonConfigurationChanged(ConfigurationnewConfig){
super.onConfigurationChanged(newConfig);
}
<activityandroid:name="com.huika.huixin.control.me.activity.PersonalInfoAct"
android:launchMode="singleTask"
android:configChanges="orientation|keyboardHidden|screenSize"
>
</activity>
*@Description:选择图片的act
*@authorzhangjianlin
*@date2015-9-24下午2:06:28
*/
publicabstractclassBaseSelectPicActextendsActivity{
privatefinalintCROPCAMARA_TAKEPHOTO=1003;
privatefinalintCROPCAMARA_SELECTFROMALBUM=1004;
/**从拍照中选择*/
privatefinalintACTIVITY_RESULT_CROPCAMARA_WITH_DATA=1;
privateFilemPicFile;//选择图片路径
privateStringpicPath;
@Override
publicvoidonConfigurationChanged(ConfigurationnewConfig){
super.onConfigurationChanged(newConfig);
}
@Override
protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
super.onActivityResult(requestCode,resultCode,data);
if(resultCode!=RESULT_OK){return;}
switch(requestCode){
caseIntentUtils.REQUEST_IMAGE://选择照片
/**addbyzjl*/
if(null!=data){
ArrayList<String>resultList=data
.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT);
hasSelectPicsNoCrop(resultList);
/*if(null!=resultList){
*
*}*/
}
break;
caseACTIVITY_RESULT_CROPCAMARA_WITH_DATA://拍照
/*if(mPicFile.exists()){
*
*}*/
if(mPicFile==null&&!TextUtils.isEmpty(picPath))mPicFile=newFile(picPath);
if(null!=mPicFile&&mPicFile.exists()){
hasTakePhotoPic(mPicFile);
}
break;
caseIntentUtils.REQUEST_CROPIMAGE:
if(null==data){return;}
if(TextUtils.isEmpty(mPicFile.toString())||!mPicFile.exists()){
Toast.makeText(this,"没有选择图片",Toast.LENGTH_LONG).show();
return;
}
StringmPicNativePath=Environment.getExternalStorageDirectory().getAbsolutePath()+"/image"+mPicFile.getName();
try{
FilecacheTool.copyFile(mPicFile.getAbsolutePath(),mPicNativePath);
}catch(Exceptione){
e.printStackTrace();
}
hasPicsCroped(mPicNativePath);
break;
}
};
protectedvoidselectPhoto(){
ImageTool.jumpToSelectNoCropImg(this);
}
protectedvoidselectPhotoAndCrop(){
mPicFile=ImageTools.initTempFile();
/*photoIntent=ImageTools.cropPhotoOfCompressFromGalleryIntent(Uri.fromFile(mPicFile));startActivityForResult(photoIntent,Constant.ACTIVITY_RESULT_CROPIMAGE_WITH_DATA);*/
ImageTool.jumpToSelecAndCropImg(this,mPicFile.toString(),300,300,600,600,true);
}
/**拍照*/
protectedvoidtakePhoto(){
if(!ImageTools.isSDCardExist()){
Toast.makeText(this,"没有内存卡",Toast.LENGTH_LONG).show();
return;
}
mPicFile=newFile(Environment.getExternalStorageDirectory().getAbsolutePath()+"/"
+System.currentTimeMillis()+".jpg");
picPath=mPicFile.getAbsolutePath();
Intentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(mPicFile));
startActivityForResult(intent,ACTIVITY_RESULT_CROPCAMARA_WITH_DATA);
}
protectedabstractvoidhasSelectPicsNoCrop(ArrayList<String>resultList);
protectedabstractvoidhasTakePhotoPic(FilemPicFile);
protectedabstractvoidhasPicsCroped(StringmPicNativePath);
@Override
protectedvoidonSaveInstanceState(BundleoutState){
outState.putString("picPathCache",picPath);
super.onSaveInstanceState(outState);
}
@Override
protectedvoidonRestoreInstanceState(BundlesavedInstanceState){
picPath=savedInstanceState.getString("picPathCache");
super.onRestoreInstanceState(savedInstanceState);
}
}
六、图库选择simple
publicclassAlbumTestActextendsBaseSelectPicActimplementsOnClickListener{
privateImageViewiv_showresult;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
//TODOAuto-generatedmethodstub
super.onCreate(savedInstanceState);
setContentView(R.layout.act_albumtest);
findViewById(R.id.tv_takephoto).setOnClickListener(this);
findViewById(R.id.tv_selectphoto).setOnClickListener(this);
findViewById(R.id.tv_selectandcrop).setOnClickListener(this);
iv_showresult=(ImageView)findViewById(R.id.iv_showresult);
}
@Override
publicvoidonClick(Viewv){
//TODOAuto-generatedmethodstub
switch(v.getId()){
caseR.id.tv_takephoto:
takePhoto();
break;
caseR.id.tv_selectphoto:
selectPhoto();
break;
caseR.id.tv_selectandcrop:
selectPhotoAndCrop();
break;
default:
break;
}
}
@Override
protectedvoidhasSelectPicsNoCrop(ArrayList<String>resultList){
//TODOAuto-generatedmethodstub
if(null!=resultList){
if(resultList.size()>0)
{
ImageLoader.getInstance().displayImage(Scheme.FILE.wrap(resultList.get(0)),iv_showresult);
}
}
}
@Override
protectedvoidhasTakePhotoPic(FilemPicFile){
//TODOAuto-generatedmethodstub
if(null!=mPicFile&&mPicFile.exists())
{
ImageLoader.getInstance().displayImage(Scheme.FILE.wrap(mPicFile.getPath()),iv_showresult);
}
}
@Override
protectedvoidhasPicsCroped(StringmPicNativePath){
//TODOAuto-generatedmethodstub
if(null!=mPicNativePath&&newFile(mPicNativePath).exists())
{
ImageLoader.getInstance().displayImage(Scheme.FILE.wrap(mPicNativePath),iv_showresult);
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。