android实现微信朋友圈发布动态功能

本文实例为大家分享了android仿微信朋友圈发布动态功能的具体代码,供大家参考,具体内容如下

效果图:

本文概述

用到的开源库:仿照微信的图片选择器,Luban压缩图片,glide

上面红圈部分,当用户选中图片时,当=9张时,那个加号图片就会消失!

本文主要仿照微信的发布动态功能,主要时针对微信发布动态时,选中图片后的变化状态!

整体布局

这可以看到,控制图片状态的地方就是一个recyclerview

思路

利用recyclerview的多行视图来实现!

微信上的效果是,先选中图片后才会进入这个界面,这里实现的是我现在项目中用到的效果:默认显示一个带+好的图片,点击这个图片,会让你选择图片。

注意

我们不知道用户选择的图片大小是怎么样的,所以这里,选中图片后,先进行了压缩然后用glide去加载显示的。(这里之所以用glide是因为,用biatmap显示时,即使压缩了,但是同时选中5张以上,就会oom,所以用glide加载压缩后的url)

代码

代码里注释已经写的很详细了!

- ReleaseMessageActivity

public class ReleaseMessageActivity extends AppCompatActivity {

 @BindView(R.id.text_cancel)
 TextView textCancel;
 @BindView(R.id.text_release)
 TextView textRelease;
 @BindView(R.id.mRec)
 RecyclerView mRec;
 @BindView(R.id.et_messsage)
 EditText etMesssage;
 private ArrayList<String> listImagePath;
 private ArrayList<String> mList = new ArrayList<>();
 private ReleaseMsgAdapter adapter;

 private ArrayList<String> list = new ArrayList<String>();

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_release_message);
  ButterKnife.bind(this);
  setRecyclerview();
 }

 private void setRecyclerview() {
  if (mList != null) {
   GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 4);
   mRec.setLayoutManager(gridLayoutManager);
   adapter = new ReleaseMsgAdapter(ReleaseMessageActivity.this, mList);
   mRec.setAdapter(adapter);
  }

 }

 @OnClick({R.id.text_cancel, R.id.text_release})
 public void onClick(View view) {
  switch (view.getId()) {
   case R.id.text_cancel:
    ToastUtil.showToast("取消");
    break;
   case R.id.text_release:
    ToastUtil.showToast("发布");
    break;
  }
 }
 //用户选中图片后,拿到回掉结果
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if (requestCode == 0 && resultCode == RESULT_OK) {
   listImagePath = data.getStringArrayListExtra(EXTRA_RESULT);
   compress(listImagePath);
  }
 }
//压缩 拿到返回选中图片的集合url,然后转换成file文件
 public void compress(ArrayList<String> list) {
  for (String imageUrl : list) {
   LogUtils.e(">>>>>>", imageUrl);
   File file = new File(imageUrl);
   compressImage(file);
  }
  adapter.addMoreItem(list);
 }
//压缩
 private void compressImage(File file) {
  Luban.get(this)//用的第三方的压缩,开源库 Luban 大家可以自行百度
    .load(file)      //传人要压缩的图片
    .putGear(Luban.THIRD_GEAR)  //设定压缩档次,默认三挡
    .setCompressListener(new OnCompressListener() { //设置回调
     @Override
     public void onStart() {
      //TODO 压缩开始前调用,可以在方法内启动 loading UI
     }

     @Override
     public void onSuccess(final File file) {
      URI uri = file.toURI();
      String[] split = uri.toString().split(":");
      list.add(split[1]);//压缩后返回的文件,带file字样,所以需要截取
      LogUtils.e(BaseApplication.TAG, uri + "????????????" + split[1]);
     }

     @Override
     public void onError(Throwable e) {
      //TODO 当压缩过去出现问题时调用
     }
    }).launch();//启动压缩
 }
}

ReleaseMsgAdapter

public class ReleaseMsgAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
 private Activity context;
 private ArrayList<String> mList;
 private final LayoutInflater inflater;
 private static final int ITEM_TYPE_ONE = 0x00001;
 private static final int ITEM_TYPE_TWO = 0x00002;
 /**
 *这里之所以用多行视图,因为我们默认的有一张图片的(那个带+的图片,用户点击它才会才会让你去选择图片)
 *集合url为空的时候,默认显示它,当它达到集合9时,这个图片会自动隐藏。
 */
 public ReleaseMsgAdapter(Activity context, ArrayList<String> mList) {
  this.context = context;
  this.mList = mList;
  inflater = LayoutInflater.from(context);
 }

 @Override
 public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  parent.setPadding(20, 0, 20, 0);
  switch (viewType) {
   case ITEM_TYPE_ONE:
    return new MyHolder(inflater.inflate(R.layout.release_message_item, parent, false));
   case ITEM_TYPE_TWO:
    return new MyTWOHolder(inflater.inflate(R.layout.release_message_two_item, parent, false));
   default:
    return null;
  }
 }

 @Override
 public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
  if (holder instanceof MyHolder) {
   bindItemMyHolder((MyHolder) holder, position);
  } else if (holder instanceof MyTWOHolder) {
   bindItemTWOMyHolder((MyTWOHolder) holder, position);
  }
 }

 private void bindItemTWOMyHolder(final MyTWOHolder holder, int position) {
  LogUtils.e("Adapter", listSize() + "");
  if (listSize() >= 9) {//集合长度大于等于9张时,隐藏 图片
   holder.imageview2.setVisibility(View.GONE);
  }
  holder.imageview2.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
   //选择图片
    CommonUtil.uploadPictures(context, 9 - listSize(), 0);
   }
  });
 }

 private void bindItemMyHolder(MyHolder holder, int position) {
  Glide.with(context)
    .load(mList.get(position))
    .centerCrop()
    .into(holder.imageview);
 }

 @Override
 public int getItemViewType(int position) {
  if (position + 1 == getItemCount()) {
   return ITEM_TYPE_TWO;
  } else {
   return ITEM_TYPE_ONE;
  }
 }

 @Override
 public int getItemCount() {
  LogUtils.e("getItemCount", mList.size() + 1 + "");
  return mList.size() + 1;
 }

 class MyHolder extends RecyclerView.ViewHolder {
  private final ImageView imageview;
  public MyHolder(View itemView) {
   super(itemView);
   imageview = (ImageView) itemView.findViewById(R.id.imageview);
  }
 }

 class MyTWOHolder extends RecyclerView.ViewHolder {
  private final ImageView imageview2;
  public MyTWOHolder(View itemView) {
   super(itemView);
   imageview2 = (ImageView) itemView.findViewById(R.id.imageview2);
  }
 }
 //对外暴露方法 。点击添加图片(类似于上啦加载数据)
  public void addMoreItem(ArrayList<String> loarMoreDatas) {
  mList.addAll(loarMoreDatas);
  notifyDataSetChanged();
 }
//得到集合长度
 public int listSize() {
  int size = mList.size();
  return size;
 }
}

CommonUtil.uploadPictures

/*
* 选择图片
* */
 public static Intent uploadPictures(Activity activity, int number,int requestCode){
  //加载图片
  PhotoPickerIntent intent = new PhotoPickerIntent(activity);
  intent.setSelectModel(SelectModel.MULTI);//多选
  intent.setShowCarema(true); // 是否显示拍照
  intent.setMaxTotal(number); // 最多选择照片数量,默认为9
//  intent.setSelectedPaths(imagePaths); // 已选中的照片地址, 用于回显选中状态
  intent.putExtra("type","photo");//选择方式;
  activity.startActivityForResult(intent,requestCode);
  return intent;
 }

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

(0)

相关推荐

  • Android使用Retrofit2.0技术仿微信发说说

    最近项目做完了,有闲暇时间,一直想做一个类似微信中微信发说说,既能实现拍照,选图库,多图案上传的案例,目前好多App都有类似微信朋友圈的功能,能过发表说说等附带图片上传.下面的就是实现该功能的过程:大家还没有看过Android Retrofit 2.0框架上传图片解决方案(一张与多张的处理)这篇文章,在看今天的就很容易,接在本项目中用到了一个library:photopicker,封装了图片的选择功能,是否选相机,还有选中图片后可以查看图片的功能. 一. 首先:将photopicker到工程中

  • Android仿微信发表说说实现拍照、多图上传功能

    本文实例为大家分享了Android仿微信发表说说.心情功能,供大家参考,具体内容如下 既能实现拍照,选图库,多图案上传的案例,目前好多App都有类似微信朋友圈的功能,能过发表说说等附带图片上传.下面的就是实现该功能的过程:大家还没有看过Android Retrofit 2.0框架上传图片解决方案这篇文章,在看今天的就很容易,接在本项目中用到了一个library:photopicker,封装了图片的选择功能,是否选相机,还有选中图片后可以查看图片的功能.  一. 首先:将photopicker到工

  • Android 高仿微信朋友圈动态支持双击手势放大并滑动查看图片效果

    最近参与了开发一款旅行APP,其中包含实时聊天和动态评论功能,终于耗时几个月几个伙伴完成了,今天就小结一下至于实时聊天功能如果用户不多的情况可以scoket实现,如果用户万级就可以采用开源的smack + opnefile实现,也可以用mina开源+XMMP,至于怎么搭建和实现,估计目前github上一搜一大把,至于即时通讯怕误人子弟,暂且不做介绍,现就把实现的一个微信朋友圈的小功能介绍一下. 先上效果图: 一拿到主流的UI需求,大致分析下,需要我ListView嵌套Gridview,而grid

  • android实现微信朋友圈发布动态功能

    本文实例为大家分享了android仿微信朋友圈发布动态功能的具体代码,供大家参考,具体内容如下 效果图: 本文概述 用到的开源库:仿照微信的图片选择器,Luban压缩图片,glide 上面红圈部分,当用户选中图片时,当=9张时,那个加号图片就会消失! 本文主要仿照微信的发布动态功能,主要时针对微信发布动态时,选中图片后的变化状态! 整体布局 这可以看到,控制图片状态的地方就是一个recyclerview 思路 利用recyclerview的多行视图来实现! 微信上的效果是,先选中图片后才会进入这

  • 微信小程序仿朋友圈发布动态功能

    仿照微信朋友圈做了一个界面如下,先看效果: 1.点开界面 2.选择图片 3.点击上传 4.动态显示 第一个页面的wxml: <view class='page'> <textarea class='text' bindinput="input" placeholder="分享动态" auto-height/> <view class="image_content"> <view class='image'

  • Android仿微信朋友圈全文收起功能示例(附源码)

    在众多的社交类软件中,朋友圈是必不可少的,可以与好友.同学等分享自己的日常和有意思的事情,在开发社交类App时,朋友圈发表的内容你不可能让他全部显示,全部显示的话用户体验度会非常不好,这时就要用到全文.收缩的功能,朋友如果想要看你发的动态,只要点一下全文就可以查看所有的全部的内容了,如果不想看,也没有必要把这一篇文章全部都滑到底部,才能看下一条内容. 下边将源码贴出来供大家参考:(代码不是最简便的,但是功能是可以的) 首先写一个布局,这个布局是每个子项的布局 item_text_list.xml

  • Android 仿微信朋友圈点赞和评论弹出框功能

    贡献/下载源码:https://github.com/mmlovesyy/PopupWindowDemo 本文简单模仿微信朋友圈的点赞和评论弹出框,布局等细节请忽略,着重实现弹出框.发评论,及弹出位置的控制. 1. 微信弹出框 微信朋友圈的点赞和评论功能,有2个组成部分: 点击左下角的"更多"按钮,弹出对话框: 点击评论,弹出输入框,添加评论并在页面中实时显示: 微信朋友圈点赞和评论功能 2. 实际效果 本文将建一个 ListView,在其 Item 中简单模仿微信的布局,然后着重实现

  • PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)

    我们大部分人都发过动态,想必都知道发动态.回复评论.删除动态的整个过程,那么作为初学者,要模仿这些功能有点复杂的,最起码表的关系得弄清楚~~ 先把思路理一下: (1)用户登录,用session读取当前用户----目的是:该用户可以发表动态,重点是显示该用户好友及他自己发表的动态,并且按发表时间排序. (2)做个发表动态框实现发表动态功能 (3)显示该用户和他好友已经发表对的动态信息,并按发表时间由近到远显示 (4)再每条动态后面做一个评论按钮和删除按钮:实现对动态的评论,回复和删除(斜体部分下一

  • iOS实现微信朋友圈视频截取功能

    序言 微信现在这么普及,功能也做的越来越强大,不知大家对于微信朋友圈发视频截取的功能或者苹果拍视频对视频编辑的功能有没有了解(作者这里也猜测,微信的这个功能也是仿苹果的).感觉这个功能确实很方便实用,近来作者也在研究音视频功能,所以就实现了一下这个功能. 功能其实看着挺简单,实现过程也踩了不少坑.一方面记录一下:另一方面也算是对实现过程的再一次梳理,这样大家看代码也会比较明白. 效果 我们先看看我实现的效果 实现 实现过程分析 整个功能可以分为三部分: 视频播放 这部分我们单独封装一个视频播放器

  • Android仿微信朋友圈全文、收起功能的实例代码

    前言 一般在社交APP中都有类似朋友圈的功能,其中发表的动态内容很长的时候不可能让它全部显示.这里就需要做一个仿微信朋友圈全文.收起功能来解决该问题.在网上看到一个例子-->http://www.jb51.net/article/105251.htm,写的很不错,但是有个bug,他这个Demo只有在条目固定的时候才正常,当增加.删除条目的时候会出现全文.收起显示混乱的问题.原因是他使用了固定的position作为key来保存当前显示的状态.这篇文章在他的基础上进行优化. 效果图 具体代码 (详细

  • Android仿微信朋友圈实现滚动条下拉反弹效果

    微信朋友圈上面的图片封面,QQ空间说说上面的图片封面都有下拉反弹的效果,这些都是使用滚动条实现的.下拉,当松开时候,反弹至原来的位置.下拉时候能看到背景图片.那么这里简单介绍一下这种效果的实现. 1.效果图 这部手机显示的分辨率有限,很老的手机调试. 2.具有反弹效果BounceScrollView package com.org.scroll; import android.content.Context; import android.graphics.Rect; import androi

  • Android实现微信朋友圈评论EditText效果

    本文主要讲解实现微信朋友圈评论EditText效果思路,供大家参考,具体内容如下 效果图 当我们点击某一天朋友圈的评论是,列表也会跟随着滑动,使得键盘刚好在我们点击的那条评论上方 getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout(

  • Android实现微信朋友圈发本地视频功能

    一.前言 前一篇文章已经详细介绍了如何使用Xposed框架编写第一个微信插件:摇骰子和猜拳作弊器 本文继续来介绍如何使用Xposed框架编写第二个微信插件,可以将本地小视频发布到朋友圈的功能.在这之前我们还是要有老套路,准备工作要做好,这里还是使用微信6.3.9版本进行操作,准备工作: 1.使用apktool工具进行反编译,微信没有做加固防护,所以这个版本的微信包反编译是没有任何问题的. 2.借助于可视化反编译工具Jadx打开微信包,后续几乎重要分析都是借助这个工具来操作的. 二.猜想与假设 做

随机推荐