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);
    }
  }

}

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

(0)

相关推荐

  • Android使用gallery和imageSwitch制作可左右循环滑动的图片浏览器

    效果图: 为了使图片浏览器左右无限循环滑动 我们要自定义gallery的adapter 如果要想自定义adapter首先要了解这几个方法 @Override public int getCount() { // TODO Auto-generated method stub return 0; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } @O

  • Android实现网络图片浏览器

    本文实例为大家分享了Android网络图片浏览器的制作过程,供大家参考,具体内容如下 一.创建一个"网络图片浏览器的应用程序",并设计用户交互界面,"网络图片浏览器"对应的布局文件(activity_main.xml)代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.and

  • Android编程实现的超炫图片浏览器

    本文实例讲述了Android编程实现的超炫图片浏览器.分享给大家供大家参考,具体如下: 使用过Android自带的gallery组件的人都知道,gallery实现的效果就是拖动浏览一组图片,相比iphone里也是用于拖动浏览图片的coverflow,显然逊色不少.实际上,可以通过扩展gallery,通过伪3D变换可以基本实现coverflow的效果.本文通过源代码解析这一功能的实现.具体代码作用可参照注释. 最终实现效果如下: 要使用gallery,我们必须首先给其指定一个adapter.在这里

  • Android实现图片浏览器示例

    本文所述为一个基础的Android图片浏览器代码,是仿写Google原版实现的,代码中实现了主要的实现过程和方法,具体的完善还需要自己添加,代码中有很多注释,可帮助新手们快速理解代码,使用了部分图像资源. 主要功能代码如下: package com.android.coding; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.Vi

  • Android应用中图片浏览时实现自动切换功能的方法详解

    先给最终效果图: 当我们在最下边的gallery中切换图片时,上面的大图片会自动切换,切换时有动画效果哦,很简单的一个程序,有待完善更多的功能! activity代码: package cn.com.chenzheng_java; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.View; import android.view.V

  • Android实现网页图片浏览功能

    本文实例为大家分享了AndAndroid实现网页图片浏览的具体代码,供大家参考,具体内容如下 基本功能:输入图片的url然后点击按钮加载出来图片 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&

  • Android实现网络图片浏览功能

    我们在上网的过程中经常看到各种图片,那你知道它是如何实现的吗?接下来就让我们一块探讨一下. 网络图片的浏览可以分为俩部分,基本的页面布局与界面交互,让我们一步步的来编写. 基本布局很简单,只需要有一个输入图片链接的EditText,一个浏览按钮,一个ImageView就差不多了.下面是简单代码. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="ht

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

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

  • Android 微信图片分享功能

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

  • Android实现图片浏览并改变透明度

    本文实例为大家分享了简单的图片浏览器制作,供大家参考,具体内容如下 例子中的图片浏览器既可以改变图片的透明度,也可以根据用户在图片上选定的某一区域,对其进行显示,用于查看图片的局部细节. 在activity_main.xml中: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/and

  • Android WebView中图片浏览及缩放效果

    本文实例为大家分享了Android WebView图片浏览及缩放效果展示的具体代码,供大家参考,具体内容如下 此工程用到了两个开源库: PhotoView支持图片的缩放 Android-Universal-Image-Loader图片的异步加载 (android studio)将两个源工程中的library文件夹导入到Demo Module所在的Project中,修改各自的build.gradle文件,让里面的版本号.所用的android包等与Demo Module相同即可.大致如图: 源代码:

  • Jetpack Compose 实现一个图片选择框架功能

    目录 获取图片 拍照策略 NothingCaptureStrategy FileProviderCaptureStrategy MediaStoreCaptureStrategy 总结 拍照权限 取消拍照导致的脏数据 resolveActivity API 的兼容性 File API 的兼容性 Github 知乎的 Matisse应该蛮多 Android 开发者有了解过或者是曾经使用过,这是知乎在 2017 年开源的一个 Android 端图片选择框架,其颜值在现在看来也还是挺不错的 可惜近几年

  • Android仿微信图片点击全屏效果

    废话不多说,先看下效果: 先是微信的 再是模仿的 先说下实现原理,再一步步分析 这里总共有2个Activity一个就是主页,一个就是显示我们图片效果的页面,参数通过Intent传送,素材内容均来自网络,(感谢聪明的蘑菇) 图片都是Glide异步下的,下的,下的重要的事情说三次,然后就是用动画做放大操作然后显示出来了(并没有做下载原图的实现,反正也是一样 下载下来Set上去而且动画都不需要更简便). OK,我们来看分析下 obj,目录下分别创建了2个对象,一个用来使用来处理显示页面的图片尺寸信息以

  • Android Tiny集成图片压缩框架的使用

    为了简化对图片压缩的调用,提供最简洁与合理的api压缩逻辑,对于压缩为Bitmap根据屏幕分辨率动态适配最佳大小,对于压缩为File优化底层libjpeg的压缩,整个图片压缩过程全在压缩线程池中异步压缩,结束后分发回UI线程. 支持的压缩类型 Tiny图片压缩框架支持的压缩数据源类型: 1.Bytes 2.File 3.Bitmap 4.Stream 5.Resource 6.Uri(network.file.content) Tiny支持单个数据源压缩以及批量压缩,支持的压缩类型: 1.数据源

  • Android中使用GridView实现仿微信图片上传功能(附源代码)

    由于工作要求最近在使用GridView完成图片的批量上传功能,我的例子当中包含仿微信图片上传.拍照.本地选择.相片裁剪等功能,如果有需要的朋友可以看一下,希望我的实际经验能对您有所帮助. 直接上图,下面的图片就是点击"加号"后弹出的对话框,通过对话框可以根据自己需求进行相片选择. 项目结构: 下面直接上代码. 整体的布局文件activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/

  • Android UI控件之Gallery实现拖动式图片浏览效果

    我们知道现在智能手机上都有这样一种功能,就是你在浏览图片的时候.不是硬性的点击按钮而是可以实现手指的拖动,划开效果.使用户具有更好的交互体验,不过这种效果是如何实现的呢? 在Android中是通过Gallery来实现拖动效果的. 通过Gallery可以实现各种各样的效果,此篇文章只是简要谈谈他的用法,至于后续的一些效果 有机会的时候做一个整理. 首先看看其简单实现吧!本次实例是通过选取图片实现类似设置背景的功能! 不过需要说明的是:图片不宜过大,否则容易内存溢出,android对大图片的支持不好

随机推荐