android微信ピクチャセレクタ
12397 ワード
コード項目githubアドレスIMAlbum
一、業務シーン
1、チャットインタフェース画像の送信=>複数選択+右上隅の「送信」+画像プレビュー=>画像プレビュー右上隅の「送信」ロジック2、発表ダイナミック=>複数選択+右上隅の「完了」+画像プレビュー=>画像プレビュー右上隅の「完了」ロジック3、個人情報変更アイコン=>ラジオポイント選択+画像プレビュースクリーンショット=>画像プレビュースクリーンショット右上隅の「使用」ロジックをサポート
二、Intentパラメータ設計;(Intentパラメータ原則:カスタムタイプの専用パラメータは使用しないでください)
1、最も基本的なパラメータ伝達(画像の最大数、右上隅のタイトル、ラジオモードかマルチ選択モードか、結果を返すパラメータを選択可能)
2、拡張部分パラメータ伝達(画像選択画面の最初のItemが写真撮影機能を表示しているか、プレビューのactivityが「チェックキャンセル終了」チェックボタンをサポートしているか)
3、「動的選択を発表する」で5枚の画像を選択してから、画像を選択する--画像ブラウザは選択した画像のチェック状態をチェック状態に設定する必要がある
4、スクリーンショット機能(ラジオモードでスクリーンショットモードを起動した場合、選択後にスクリーンショットインターフェースをジャンプする)
三、需要を整理してから設計する
ここでは省略する.共有コード実装の機能は、コード可読性の悪いコードプロジェクトgithubアドレスIMAlbumを最適化するために設計されていません.
四、コードの使用方法
五、baseselectactivityクラス
六、図庫選択simple
一、業務シーン
1、チャットインタフェース画像の送信=>複数選択+右上隅の「送信」+画像プレビュー=>画像プレビュー右上隅の「送信」ロジック2、発表ダイナミック=>複数選択+右上隅の「完了」+画像プレビュー=>画像プレビュー右上隅の「完了」ロジック3、個人情報変更アイコン=>ラジオポイント選択+画像プレビュースクリーンショット=>画像プレビュースクリーンショット右上隅の「使用」ロジックをサポート
二、Intentパラメータ設計;(Intentパラメータ原則:カスタムタイプの専用パラメータは使用しないでください)
1、最も基本的なパラメータ伝達(画像の最大数、右上隅のタイトル、ラジオモードかマルチ選択モードか、結果を返すパラメータを選択可能)
/** ,int , 9 */
public static final String EXTRA_SELECT_COUNT = "max_select_count";
/** */
public static final String EXTRA_SUBMIT_TITLE = "extra_submit_title";
/** , */
public static final String EXTRA_SELECT_MODE = "select_count_mode";
/** , ArrayList */
public static final String EXTRA_RESULT = "select_result";
2、拡張部分パラメータ伝達(画像選択画面の最初のItemが写真撮影機能を表示しているか、プレビューのactivityが「チェックキャンセル終了」チェックボタンをサポートしているか)
/** , */
public static final String EXTRA_SHOW_CAMERA = "show_camera";
/** ImageDetailCheckPicsAct */
public static final String EXTRA_JUMPTOCHECKPICS = "is_jumpto_checkpics";
3、「動的選択を発表する」で5枚の画像を選択してから、画像を選択する--画像ブラウザは選択した画像のチェック状態をチェック状態に設定する必要がある
/** */
public static final String EXTRA_DEFAULT_SELECTED_LIST = "default_list";
4、スクリーンショット機能(ラジオモードでスクリーンショットモードを起動した場合、選択後にスクリーンショットインターフェースをジャンプする)
/** */
public static final String RESIZEBIT = "RESIZEBIT";
/** */
public static final String RESULT = "resultPath";
/** */
public static final String MODE_SCALE_BOOLEAN = "MODE_SCALE_BOOLEAN";
/** ; dp */
public static final String SCALEW = "scaleW";
/** ; dp */
public static final String SCALEH = "SCALEH";
/** ; sp */
public static final String LIMITW = "limitWidth";
/** ; sp */
public static final String LIMITH = "limitHight";
/** */
public static final String MODE_SCALE_PATH = "MODE_SCALE_PATH";
三、需要を整理してから設計する
ここでは省略する.共有コード実装の機能は、コード可読性の悪いコードプロジェクトgithubアドレスIMAlbumを最適化するために設計されていません.
四、コードの使用方法
public static void jumpToSelectPics(Activity mContext, boolean isShowCamera, int selectMaxCount, int selectMode,
String submitBtnStr, boolean isJumpToCheckPics, ArrayList hasSelectList) {
Intent intent = new Intent(mContext, MultiImageSelectorActivity.class);
// whether show camera
intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA, isShowCamera);
// String of submit button
intent.putExtra(MultiImageSelectorActivity.EXTRA_SUBMIT_TITLE, submitBtnStr);
// String of submit button
intent.putExtra(MultiImageSelectorFragment.EXTRA_JUMPTOCHECKPICS, isJumpToCheckPics);
// max select image amount
intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT, selectMaxCount);
// select mode (MultiImageSelectorActivity.MODE_SINGLE OR MultiImageSelectorActivity.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
* @param picResultPath
* @param scaleW dp
* @param scaleH dp
* @param limtWidth
* @param limitHight
* @param isScaleImg limtWidth、limitHight
* @description:
* @author zhangjianlin (990996641)
* @date 2015 6 11 4:25:00
*/
public static void jumpToSelecAndCropImg(Activity mContext, String picResultPath, int scaleW, int scaleH,
int limtWidth, int limitHight, boolean isScaleImg) {
Intent intent = new Intent(mContext, MultiImageSelectorActivity.class);
// whether show camera
intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA, false);
// max select image amount
intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT, 1);
// select mode (MultiImageSelectorActivity.MODE_SINGLE OR MultiImageSelectorActivity.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) {
case IntentUtils.REQUEST_IMAGE:
if (data != null) {
ArrayList resultList = data
.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT);
}
break;
}
* @param mContext
*/
public static void jumpToSelectNoCropImg(Activity mContext) {
jumpToSelectPics(mContext, false, 2, MultiImageSelectorActivity.MODE_SINGLE);
}
五、baseselectactivityクラス
/**
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
* @Description: act
* @author zhangjianlin
* @date 2015-9-24 2:06:28
*/
public abstract class BaseSelectPicAct extends Activity {
private final int CROPCAMARA_TAKEPHOTO = 1003;
private final int CROPCAMARA_SELECTFROMALBUM = 1004;
/** */
private final int ACTIVITY_RESULT_CROPCAMARA_WITH_DATA = 1;
private File mPicFile; //
private String picPath;
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_OK) { return; }
switch (requestCode) {
case IntentUtils.REQUEST_IMAGE: //
/** add by zjl */
if (null != data) {
ArrayList resultList = data
.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT);
hasSelectPicsNoCrop(resultList);
/* if (null != resultList) {
*
* } */
}
break;
case ACTIVITY_RESULT_CROPCAMARA_WITH_DATA: //
/* if (mPicFile.exists()) {
*
* } */
if (mPicFile == null && !TextUtils.isEmpty(picPath)) mPicFile = new File(picPath);
if (null != mPicFile && mPicFile.exists()) {
hasTakePhotoPic(mPicFile);
}
break;
case IntentUtils.REQUEST_CROPIMAGE:
if (null == data) { return; }
if (TextUtils.isEmpty(mPicFile.toString()) || !mPicFile.exists()) {
Toast.makeText(this, " ", Toast.LENGTH_LONG).show();
return;
}
String mPicNativePath = Environment.getExternalStorageDirectory().getAbsolutePath() +"/image" + mPicFile.getName();
try {
FilecacheTool.copyFile(mPicFile.getAbsolutePath(), mPicNativePath);
} catch (Exception e) {
e.printStackTrace();
}
hasPicsCroped(mPicNativePath);
break;
}
};
protected void selectPhoto() {
ImageTool.jumpToSelectNoCropImg(this);
}
protected void selectPhotoAndCrop() {
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);
}
/** */
protected void takePhoto() {
if (!ImageTools.isSDCardExist()) {
Toast.makeText(this, " ", Toast.LENGTH_LONG).show();
return;
}
mPicFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/"
+ System.currentTimeMillis() + ".jpg");
picPath = mPicFile.getAbsolutePath();
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mPicFile));
startActivityForResult(intent, ACTIVITY_RESULT_CROPCAMARA_WITH_DATA);
}
protected abstract void hasSelectPicsNoCrop(ArrayList resultList);
protected abstract void hasTakePhotoPic(File mPicFile);
protected abstract void hasPicsCroped(String mPicNativePath);
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putString("picPathCache", picPath);
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
picPath = savedInstanceState.getString("picPathCache");
super.onRestoreInstanceState(savedInstanceState);
}
}
六、図庫選択simple
public class AlbumTestAct extends BaseSelectPicAct implements OnClickListener {
private ImageView iv_showresult;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
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
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.tv_takephoto:
takePhoto();
break;
case R.id.tv_selectphoto:
selectPhoto();
break;
case R.id.tv_selectandcrop:
selectPhotoAndCrop();
break;
default:
break;
}
}
@Override
protected void hasSelectPicsNoCrop(ArrayList resultList) {
// TODO Auto-generated method stub
if (null != resultList) {
if(resultList.size() > 0)
{
ImageLoader.getInstance().displayImage(Scheme.FILE.wrap(resultList.get(0)), iv_showresult);
}
}
}
@Override
protected void hasTakePhotoPic(File mPicFile) {
// TODO Auto-generated method stub
if(null != mPicFile && mPicFile.exists())
{
ImageLoader.getInstance().displayImage(Scheme.FILE.wrap(mPicFile.getPath()), iv_showresult);
}
}
@Override
protected void hasPicsCroped(String mPicNativePath) {
// TODO Auto-generated method stub
if(null != mPicNativePath && new File(mPicNativePath).exists())
{
ImageLoader.getInstance().displayImage(Scheme.FILE.wrap(mPicNativePath), iv_showresult);
}
}
}