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); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。