Android微信图片浏览框架设计_Android

一、业务场景

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<String> 图片路径集合 */
  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<String> 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<String> 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);
  }
 <activity android:name="com.huika.huixin.control.me.activity.PersonalInfoAct"
      android:launchMode="singleTask"
      android:configChanges="orientation|keyboardHidden|screenSize"
      >
    </activity> 

 * @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<String> 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<String> 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<String> 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);
    }
  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android微信图片
android 图片浏览框架、android 浏览器框架、android app框架设计、android框架设计、android微信图片浏览,以便于您获取更多的相关知识。

时间: 2024-08-01 00:39:31

Android微信图片浏览框架设计_Android的相关文章

Android微信图片浏览框架设计

一.业务场景 1.聊天界面发送图片==>多选点选+有右上角"发送"+图片预览==>图片预览支持右上角"发送"逻辑 2.发表动态==>多选点选+右上角"完成" + 图片预览==>图片预览支持右上角"完成"逻辑 3.个人资料更改头像==>单选点选 + 图片预览截图==>图片预览截图支持右上角"使用"逻辑 二.Intent参数设计; (Intent传参原则:尽量不要使用自定义类

Android 微信图片分享功能_Android

我们都知道,通过 微信官方 分享sdk 支持图片分享,而且有多种方式.官方链接 可直接查看,不再赘述. 本文要解决的问题是,分享本地带二维码的图片给微信好友和朋友圈.朋友圈图片能够实现长按识别,给微信好友对话框的图片 在 iOS 可以正常识别,但是 Android 端却不能识别 ,为什么? 以下引用网友的回答: 经过分析和功能对比,android wechat app 中有两种图片浏览方式,图片预览,和图片本地发送后的打开查看(这个有识别动作)页面.预览图片功能中,不包含长按手势的识别功能,仔细

android微信支付源码分享_Android

本文为大家分享了android微信支付源码,供大家参考,具体内容如下 参数配置 public static final String APP_ID ; /** 在微信开放平台注册app,微信给分配的id **/ public static final String MCH_ID; /** 申请开通微信支付,成功后微信会给你发一封邮件,给你分配一个商户平台账号,在资料里有商户ID **/ public static final String API_KEY; /** 在微信发给你的那封邮件里,给你

Android WebP 图片压缩与传输_Android

1. 简介 直到4g时代,流量依然是宝贵的东西.而移动网络传输中,最占流量的一种载体:图片,成为了我们移动开发者不得不关注的一个问题. 我们关注的问题,无非是图片体积和质量如何达到一个比较和谐的平衡,希望得到质量不错的图片同时体积还不能太大. 走在时代前列的谷歌给出了一个不错的答案--WebP. WebP是一种图片文件格式,在相同的压缩指标下,webp的有损压缩能比jpg小 25-34%.而在我自己的测试里,有时候能小50%. 2. 大企业背书 WebP在2010年发布第一个版本,到现在已经6年

Android实现图片阴影效果的方法_Android

本文实例介绍了Android实现图片阴影效果,设置画布颜色,图像倾斜效果,图片阴影效果的方法,采用canvas.save(Canvas.MATRIX_SAVE_FLAG);来实现.由于图片的实际尺寸比显示出来的图像要大一些,因此需要适当更改下大小,以达到较好的效果,在原有矩形基础上,画成圆角矩形,同时带有阴影层.读者可以根据自身需要对该程序代码进行个性化的修改以便更符合自身项目需求. 具体实现代码如下: package canvas.test; import android.app.Activi

Android微信签名知识的总结_Android

前言 最近遇到一个项目的应用要上微信登录,大家都知道微信登录是需要开放平台上申请的,在微信开发平台创建移动应用后,需要填写: 需要填写的内容 问题 这里的应用签名是keystore的证书的md5,但是微信的这个只有一个填写输入框,不像百度地图.高德地图那样,有线上的SHA1和开发调试的SHA1两种,那这就纠结了,在开发运行的时候AS IDE默认使用的签名keystore是系统的 debug.keystore,系统的和自己项目线上的keystore的MD5.SHA1肯定是不一样的,那么问题来了,要

android imageview图片居中技巧应用_Android

做UI布局,尤其是遇到比较复杂的多重LinearLayout嵌套,常常会被一些比较小的问题困扰上半天,比如今天在使用ImageView的时候,想让其居中显示,可是无论怎样设置layout_gravity属性,都无法达到效果,部分代码如下: [java] 复制代码 代码如下: <LinearLayout android:layout_width="wrap_content" android:layout_height="fill_parent" android:

Android仿微信语音聊天界面设计_Android

有段时间没有看视频了,昨天晚上抽了点空时间,又看了下鸿洋大神的视频教程,又抽时间写了个学习记录.代码和老师讲的基本一样,网上也有很多相同的博客.我只是在AndroidStudio环境下写的. --主界面代码-- public class MainActivity extends Activity { private ListView mListView; private ArrayAdapter<Recorder> mAdapter; private List<Recorder>

Android实现图片左右滑动效果_Android

关于滑动效果,在Android中用得比较多,本示例实现的滑动效果是使用ViewFlipper来实现的,当然也可以使用其它的View来实现.接下来就让我们开始实现这种效果. 接下来我们看一下程序结构图: MainActivity文件中代码: package com.android.flip; import android.app.Activity; import android.os.Bundle; import android.view.GestureDetector; import andro