Android图片上传实现预览效果

首先具体分析一下,实现的功能,其中需求分析是必不可少的,需求、逻辑清除之后,再上手写代码,思路会很清晰。

1.多图上传首先得选择图片(这里项目需求是既可以拍照上传也可以从相册中选择)

2.拍照上传很简单了网上也有很多例子,调用照相机,返回uri,获取图片

3.从相册中选择图片

  •  3.1 获取手机中的所有图片
  •  3.2 将图片存到自定义图片数组中显示
  •  3.3 自定义ViewPager浏览图片

主要的逻辑大体是这样,下面具体看一下实现:

一、首先看一下界面:

<com.view.NoScrollGridView
          android:id="@+id/noScrollgridview"
          android:layout_marginLeft="@dimen/smaller_space"
          android:layout_marginRight="@dimen/smaller_space"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:horizontalSpacing="3dp"
          android:listSelector="@color/transparent"
          android:numColumns="3"
          android:scrollbars="none"
          android:layout_gravity="center"
          android:layout_marginTop="@dimen/smaller_space"
          android:verticalSpacing="5dp" />

是一个 NoScrollGridView,项目需要,所以用了不滚动的GridView,大家用GridView也是一样的。

noScrollgridview = (GridView) findViewById(R.id.noScrollgridview);
    noScrollgridview.setSelector(new ColorDrawable(Color.TRANSPARENT));
    /*新建传值给adapter*/
    if (file == null) {
      picAdapter = new PictureAdapter(this, 0, null);
    } else {
      //添加失败的图片到数组中
      for (int i=0;i<file.getMulFailFilePaths().length;i++){
        ImageItem imageItem = new ImageItem();
        imageItem.setImagePath(file.getMulFailFilePaths()[i].trim());
        Bimp.tempSelectBitmap.add(imageItem);
      }
      /*上传失败传值给adapter*/
      picAdapter = new PictureAdapter(this, 2, file);
    } 

这个是初始化图片数组,适配器(新建、上传失败、上传成功的图片我用的都是一个adapter)

ImageItem是图片的模型,下面有它的属性

//从图库选择的图片model
public class ImageItem extends File implements Serializable {
  @Id
  public String imageId; //图片id
  public String thumbnailPath;
  public String imagePath; //图片路径
  private Bitmap bitmap;
  public boolean isSelected = false; 

  public String getImageId() {
    return imageId;
  }
  public void setImageId(String imageId) {
    this.imageId = imageId;
  }
  public String getThumbnailPath() {
    return thumbnailPath;
  }
  public void setThumbnailPath(String thumbnailPath) {
    this.thumbnailPath = thumbnailPath;
  }
  public String getImagePath() {
    return imagePath;
  }
  public void setImagePath(String imagePath) {
    this.imagePath = imagePath;
  }
  public boolean isSelected() {
    return isSelected;
  }
  public void setSelected(boolean isSelected) {
    this.isSelected = isSelected;
  }
[java] view plain copy print?
/*根据图片路径获取图片的bitmap*/
public Bitmap getBitmap() {
  if(bitmap == null){
    try {
      bitmap = Bimp.revitionImageSize(imagePath);
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
  return bitmap;
}
public void setBitmap(Bitmap bitmap) {
  this.bitmap = bitmap;
} 

接下来是适配器:

由于涉及到添加图片,adapter中添加一个flag用来显示新建的图片,将选择的图片添加到公有的图片数组中,初始化的时候加载图片数组显示。(大家在看的时候可以忽略掉我的flag)

@SuppressLint("HandlerLeak")
public class PictureAdapter extends BaseAdapter {
  private LayoutInflater inflater;
  private int selectedPosition = -1;
  private boolean shape;
  private int flag = 0;//0 默认新建 1上传成功 2上传失败
  private AppItem_file file;
  public boolean isShape() {
    return shape;
  }
  private Activity context; 

  public void setShape(boolean shape) {
    this.shape = shape;
  } 

  public PictureAdapter(Activity context,int flag,AppItem_file file) {
    this.context = context;
    inflater = LayoutInflater.from(context);
    this.flag = flag;
    this.file = file;
  } 

//  public void update() {
//    loading();
//  } 

  public int getCount() {
    if (flag==0){  //新建图片
      if (Bimp.tempSelectBitmap.size() == 6) {
        return 6;
      }
      return (Bimp.tempSelectBitmap.size() + 1);
    }
    else if (flag==1){ //上传成功
      return file.getFileList().size();
    }
    else { //上传失败
      return file.getMulFailFilePaths().length;
    } 

  } 

  public Object getItem(int arg0) {
    if (flag==1){
      return file.getFileList().get(arg0);
    }else {
      return file.getMulFailFilePaths()[arg0];
    }
  } 

  public long getItemId(int arg0) {
    return arg0;
  } 

  public void setSelectedPosition(int position) {
    selectedPosition = position;
  } 

  public int getSelectedPosition() {
    return selectedPosition;
  } 

  public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    if (convertView == null) {
      //根据图片的数量加载不同布局
      if (getCount()==1&&flag!=0){
        convertView = inflater.inflate(R.layout.item_published_singal_item,
            parent, false);
      }
      else {
        convertView = inflater.inflate(R.layout.item_published_grida,
            parent, false);
      } 

      holder = new ViewHolder();
      holder.image = (ImageView) convertView
          .findViewById(R.id.item_grida_image);
      convertView.setTag(holder);
    } else {
      holder = (ViewHolder) convertView.getTag();
    } 

    /**
     * 根据初始化adapter传过来的flag值,去不同的地方找图片
     * flag=0,去Bimp的图片数组中找
     * flag=1,证明上传成功的,去下载好的getFileList中找
     * flag=2,为上传失败的,图片保存在FailFile中的List<ImageItem>中
     * 优化图片显示
     */
    if (flag==0){  //新建图片
      if (position == Bimp.tempSelectBitmap.size()) {
        holder.image.setImageBitmap(BitmapFactory.decodeResource(
            convertView.getResources(), R.drawable.icon_add_pic_unfocused));
        if (position == 6) {
          if (flag==0){
            holder.image.setVisibility(View.GONE);
          }
        }
      } else {
        holder.image.setImageBitmap(Bimp.tempSelectBitmap.get(position).getBitmap());
      }
    }
    else if (flag==1){ //上传成功
//      List<Integer> ids = new ArrayList<Integer>();
//      for (int i=0;i<file.getFileList().size();i++){
//        ids.add(file.getFileList().get(i).getS_id());
//      }
      int id=file.getFileList().get(position).getS_id();
      try {
//        File file= NeedApplication.db.findById(File.class,id);
        String fileBigImgUri =NeedApplication.db.findById(File.class,id).getFileUriBig();
        if (fileBigImgUri!=null&&!"null".equals(fileBigImgUri))
        ImageLoader.getInstance().displayImage((fileBigImgUri).trim(),holder.image);
      } catch (DbException e) {
        e.printStackTrace();
      }
    }
    else { //上传失败
        String url = "file://"+file.getMulFailFilePaths()[position].trim();
        ImageLoader.getInstance().displayImage(url, holder.image);
    } 

    return convertView;
  } 

  public class ViewHolder {
    public ImageView image;
  } 

} 

下面是自定义相册界面,用来选择图片的

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#E1E0DE"
  > 

  <RelativeLayout
    android:id="@+id/headview"
    android:layout_width="fill_parent"
    android:layout_height="45dp"
    android:background="@drawable/plugin_camera_title_bar"
    android:gravity="center_vertical"
    android:layout_marginBottom="3dp"
    >
    <Button
      android:layout_width="60dp"
      android:layout_height="wrap_content"
      android:textSize="14sp"
      android:textColor="#fff"
      android:id="@+id/back"
      android:text="相册"
      android:background="@drawable/plugin_camera_title_btn_back"
      android:layout_marginTop="5dp"
      android:layout_marginBottom="5dp"
      android:layout_centerVertical="true"
      />
    <Button
      android:layout_width="67dp"
      android:layout_height="wrap_content"
      android:textSize="14sp"
      android:textColor="#fff"
      android:id="@+id/cancel"
      android:text="取消"
      android:background="@drawable/plugin_camera_title_btn_cancel"
      android:layout_centerVertical="true"
      android:layout_marginRight="5dp"
      android:layout_alignParentRight="true"
      />
  </RelativeLayout> 

  <RelativeLayout
    android:id="@+id/bottom_layout"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_alignParentBottom="true"
    android:background="@drawable/plugin_camera_bottom_bar"
    android:layout_marginTop="3dp"
    >
    <Button
      android:id="@+id/preview"
      android:layout_width="90dp"
      android:layout_height="wrap_content"
      android:layout_alignParentLeft="true"
      android:layout_centerVertical="true"
      android:layout_marginLeft="10dp"
      android:text="预览"
      android:background="@drawable/plugin_camera_title_btn_preview"
      />
    <Button
      android:id="@+id/ok_button"
      android:layout_width="90dp"
      android:layout_height="wrap_content"
      android:layout_alignParentRight="true"
      android:layout_centerVertical="true"
      android:layout_marginRight="10dp"
      android:background="@drawable/plugin_camera_ok_btn_state"
      />
  </RelativeLayout> 

  <GridView
    android:id="@+id/myGrid"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_above="@id/bottom_layout"
    android:layout_below="@id/headview"
    android:layout_centerInParent="true"
    android:layout_marginTop="2dp"
    android:horizontalSpacing="10dp"
    android:numColumns="4"
    android:verticalSpacing="10dp"
    android:background="#E1E0DE" />
  <TextView
    android:id="@+id/myText"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:text="相册没有图片"
    android:textColor="@color/black"
    /> 

</RelativeLayout> 

同样也是用了GridView,获取手机中的图片,添加到数组中,显示

这里用到了一个AlbumHelper(相册帮助类),网上找的代码,感觉挺好的

public List<ImageBucket> getImagesBucketList(boolean refresh) {
    if (refresh || (!refresh && !hasBuildImagesBucketList)) {
      buildImagesBucketList();
    }
    List<ImageBucket> tmpList = new ArrayList<ImageBucket>();
    Iterator<Entry<String, ImageBucket>> itr = bucketList.entrySet()
        .iterator();
    while (itr.hasNext()) {
      Entry<String, ImageBucket> entry = (Entry<String, ImageBucket>) itr
          .next();
      tmpList.add(entry.getValue());
    }
    return tmpList;
  } 

获取到数据源之后,该显示了,也就是利用的获取图片帮助类里面的方法

// 初始化,给一些对象赋值
  private void init() {
    helper = AlbumHelper.getHelper();
    helper.init(getApplicationContext()); 

    contentList = helper.getImagesBucketList(false);
    dataList = new ArrayList<ImageItem>();
    for(int i = 0; i<contentList.size(); i++){
      dataList.addAll( contentList.get(i).imageList );
    } 

    back = (Button) findViewById(R.id.back);
    cancel = (Button) findViewById(R.id.cancel);
    cancel.setOnClickListener(new CancelListener());
    back.setOnClickListener(new BackListener());
    preview = (Button) findViewById(R.id.preview);
    preview.setOnClickListener(new PreviewListener());
    intent = getIntent();
    Bundle bundle = intent.getExtras();
    gridView = (GridView) findViewById(R.id.myGrid);
    gridImageAdapter = new AlbumGridViewAdapter(mContext,dataList,Bimp.tempSelectBitmap);
    gridView.setAdapter(gridImageAdapter);
    tv = (TextView) findViewById(R.id.myText);
    gridView.setEmptyView(tv);
    okButton = (Button) findViewById(R.id.ok_button);
    okButton.setText("完成"+"(" + Bimp.tempSelectBitmap.size()
        + "/"+ NeedApplication.picNums+")");
  }
gridImageAdapter
        .setOnItemClickListener(new AlbumGridViewAdapter.OnItemClickListener() { 

          @Override
          public void onItemClick(final ToggleButton toggleButton,
              int position, boolean isChecked,Button chooseBt) {
            if (Bimp.tempSelectBitmap.size() >= NeedApplication.picNums) {
              toggleButton.setChecked(false);
              chooseBt.setVisibility(View.GONE);
              if (!removeOneData(dataList.get(position))) {
                Toast.makeText(AlbumActivity.this, "超出可选图片张数", Toast.LENGTH_SHORT).show();
              }
              return;
            }
            if (isChecked) {
              chooseBt.setVisibility(View.VISIBLE);
              Bimp.tempSelectBitmap.add(dataList.get(position));
              okButton.setText("完成"+"(" + Bimp.tempSelectBitmap.size()
                  + "/"+ NeedApplication.picNums+")");
            } else {
              Bimp.tempSelectBitmap.remove(dataList.get(position));
              chooseBt.setVisibility(View.GONE);
              okButton.setText("完成"+"(" + Bimp.tempSelectBitmap.size() + "/"+ NeedApplication.picNums+")");
            }
            isShowOkBt();
          }
        });

点击图片选择加到公有图片数组中显示已选择。

最后是预览图片,利用自定义viewpager,实现图片滑动,下面贴两张截图吧:

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

(0)

相关推荐

  • Android中3种图片压缩处理方法

    Android中图片的存在形式: 1:文件形式:二进制形式存在与硬盘中. 2:流的形式:二进制形式存在与内存中. 3:Bitmap的形式 三种形式的区别: 文件形式和流的形式:对图片体积大小并没有影响.也就是说,如果你手机SD卡上的图片通过流的形式读到内存中,在内存中的大小也是原图的大小. 注意:不是Bitmap的形式. Bitmap的形式:图片占用的内存会瞬间变大. 以下是代码的形式: /** * 图片压缩的方法总结 */ /* * 图片压缩的方法01:质量压缩方法 */ private Bi

  • android bitmap compress(图片压缩)代码

    android的照相功能随着手机硬件的发展,变得越来越强大,能够找出很高分辨率的图片.有些场景中,需要照相并且上传到服务,但是由于图片的大小太大,那么就上传就会很慢(在有些网络情况下),而且很耗流量,要想速度快,那么就需要减小图片的大小.减少图片的大小有两种方法,1. 照小图片: 2. 压缩大图片. 照相时获取小图片一般不太符合要求,因为,图片的清晰度会很差,但是这种情况有个好处就是应用速度会快些: 压缩图片,就是把大图片压缩小,降低图片的质量,在一定范围内,降低图片的大小,并且满足需求(图片仍

  • android文件上传示例分享(android图片上传)

    主要思路是调用系统文件管理器或者其他媒体采集资源来获取要上传的文件,然后将文件的上传进度实时展示到进度条中. 主Activity 复制代码 代码如下: package com.guotop.elearn.activity.app.yunpan.activity; import java.io.File;import java.io.FileNotFoundException;import java.io.IOException; import android.app.Activity;impor

  • Android实现简单图片压缩的方法

    本文实例讲述了Android实现简单图片压缩的方法.分享给大家供大家参考,具体如下: 在开发图片浏览器等软件是,很多时候要显示图片的缩略图,而一般情况下,我们要将图片按照固定大小取缩略图,一般取缩略图的方法是使用BitmapFactory的decodeFile方法,然后通过传递进去 BitmapFactory.Option类型的参数进行取缩略图,在Option中,属性值inSampleSize表示缩略图大小为原始图片大小的几分之一,即如果这个值为2,则取出的缩略图的宽和高都是原始图片的1/2,图

  • android图片压缩的3种方法实例

    android 图片压缩方法: 第一:质量压缩法: 复制代码 代码如下: private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream();        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中        int op

  • android 将图片压缩到指定的大小的示例

    从网上收集后自己写的一个方法: 1.首先是一个根据分辨率压缩的类,首先对图片进行一次压缩 /** * 根据分辨率压缩图片比例 * * @param imgPath * @param w * @param h * @return */ private static Bitmap compressByResolution(String imgPath, int w, int h) { BitmapFactory.Options opts = new BitmapFactory.Options();

  • Android中使用七牛云存储进行图片上传下载的实例代码

    Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储原理,上面这幅图片是官方给出的原理图,表述当然比较清晰了. 可以看出,要进行图片上传的话可以分为五大步: 1. 客户端用户登录到APP的账号系统里面: 2. 客户端上传文件之前,需要向业务服务器申请七牛的上传凭证,这个凭证由业务服务器使用七牛提供的服务端SDK生成: 3. 客户端使用七牛提供的客户端

  • 详解Android 图片的三级缓存及图片压缩

    为什么需要图片缓存 Android默认给每个应用只分配16M的内存,所以如果加载过多的图片,为了防止内存溢出,应该将图片缓存起来.图片的三级缓存分别是: 内存缓存 本地缓存 网络缓存 其中,内存缓存应优先加载,它速度最快:本地缓存次优先加载,它速度也快:网络缓存不应该优先加载,它走网络,速度慢且耗流量. 三级缓存的具体实现 网络缓存 根据图片的url去加载图片 在本地和内存中缓存 public class NetCacheUtils { private LocalCacheUtils mLoca

  • 浅析Android 快速实现图片压缩与上传功能

    由于最近项目更新功能比较的忙,也没时间去整理自己的知识点和管理自己的博客.在Android对手机相册中的图片的压缩和上传到服务器上,这样的功能在每个app开发中都会有这样的需求.所以今天就对android端怎么快速实现图片压缩和上传进行简单的分析. 首先需要对图片进行压缩,这方面可以使用第三方的库,我在实际的开发中使用的是 compile 'top.zibin:Luban:1.0.9'使用也比较的方便,代码如下: /** * * @param path 代表的是图片的uri路径 */ priva

  • Android图片压缩上传之基础篇

    在android程序开发中我们经常见到需要上传图片的场景,在这里有个技术点,需要把图片压缩处理,然后再进行上传.这样可以减少流量的消耗,提高图片的上传速度等问题. 关于android如何压缩,网上的资料也是很多,但大多数都是代码片段,讲解压缩步骤,而没有一个实用的工具类库.那么如何将压缩算法封装成一个实用工具库呢?其中会遇到些什么问题,比如: 1.需要压缩的图片有多少 2.压缩后的图片是覆盖还是保存到另外的目录 3.如果是另存目录需要将原始图片删除吗 4.如果改变压缩后的图片的尺寸大小是按照原图

  • Android WebP 图片压缩与传输

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

随机推荐