android微信ピクチャセレクタ

12397 ワード

コード項目githubアドレスIMAlbum
一、業務シーン
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);
        }
    }

}