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

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

时间: 2020-03-01

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

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

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

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

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

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

Android仿微信发朋友圈浏览图片效果

先看一下效果吧: 下面就来说一下具体怎么实现的: 实现思路 1.首先我们要获取数据源,数据源就是我们的每条说说(包括姓名.标题.图片数组) 2.自定义适配器(ListView嵌套着GridView) 3.图片点击浏览图片(Fragment+ViewPager) 具体实现 1.初始化数据源,设置适配器,看一下代码: public class MyActivity extends Activity { /*图片显示列表*/ private ListView listView; /*图片URL数组*/

Android 仿微信发动态九宫格拖拽、删除功能

1.完美1比1 仿照微信仿微信发动态 九宫格拖拽.删除 暴力拖拽ui有点问题,不影响使用,资源文件自己找个+号 2.微信发动态拖拽bug 当选择完图片,长按图片拖拽过程中按下屏幕home键盘,再次进入这时候就不能点击输入文字,点击输入文字的时候会触发选择相册事件 3.拖拽事件用的basequickadapter implementation 'com.android.support:recyclerview-v7:28.0.0' implementation "com.github.CymCha

Android实现录音方法(仿微信语音、麦克风录音、发送语音、解决5.0以上BUG)

先给大家展示下效果图,如果大家感觉不错,请参考使用方法, 效果图如下所示: 使用方法: 录音工具类:AudioRecoderUtils.java,代码如下: public class AudioRecoderUtils { //文件路径 private String filePath; //文件夹路径 private String FolderPath; private MediaRecorder mMediaRecorder; private final String TAG = "fan&q

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

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

PHP仿微信发红包领红包效果

近期项目需要在聊天的基础上新增红包功能,需求:仿微信(不含留言),但只能使用余额发红包.于是多次使用微信红包,了解各种交互界面及业务需求,如展示信息.分类(个人,群普通,群拼手气).个数限制(100).金额限制(200).过期时间(24小时)等等,然后着手开发,下面提及的基本全是提供给app端的接口,毕竟我是phper. 一.设计数据表如下 CREATE TABLE `red_packet` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `us

Android高德地图poi检索仿微信发送位置实例代码

最近项目需求把发送定位模块改成类似微信发送位置给好友的效果,我使用了高德地图实现了一个demo,效果图如下: 从主界面中我们可以看到中心标记上面显示的就是我们定位的地址,下面是一个listview列表,第一条item的数据就是我们定位得到的地址,下面其余的都是我们根据定位得到的经纬度通过poi周边搜索得到的地址.我们进行了如下操作: 我们点击列表的item,中心标记会移动到该item对象的地址上面去. 我们手动移动地图的时候,中心标记的地址会发生相应的变化并且下面的列表也会发生相应的变化. 根据

利用百度地图Android sdk高仿微信发送位置功能及遇到的问题

接触了百度地图开发平台半个月了,这2天试着模仿了微信给好友发送位置功能,对百度地图的操作能力又上了一个台阶 我在实现这个功能的时候,遇到一些困难,可能也是别人将会遇到的困难,特在此列出 1.在微信发送功能中,不管用户如何拖拽地图,总有个覆盖物固定了MapView中央,怎么实现? 其实这很容易实现,只要MapView的布局文件中,将一个ImageView覆盖在MapView的中央,就能够实现不管用户如何拖拽地图,覆盖物(ImageView)总固定总MapView中央 2.如何获取MapView中央

Android仿微信图片上传带加号且超过最大数隐藏功能

1.仿照微信空间上传图片,显示图片数量以及超过最大,上传按钮隐藏功能 2.上效果图 3.上代码,主要是Adapter类 /** * Created by zhangyinlei on 2018/3/2 0002. */ public class AlbumSelectedShowAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private static int TYPE_ADD = 0;//添加图片 privat

Android GridView扩展仿微信微博发图动态添加删除图片功能

在平时的开发中,我们会看到不管是微信发朋友圈照片还是微博发布新鲜事,添加图片的时候都是选完后面还有个+号再去选择图片,这样的话比较方便用户去添加图片,有的右上角还有个-号方便用户去删除图片,而一般用户选择的图片多少都是不定的,我们只限制最大张数,我们用gridview去实现,代码可能比较简单,高手请略过. 0.效果图 1.准备资源图片 添加图片的+号图片 删除图片的图片 2.可设置限制用户选择最大张数 /** * 可以动态设置最多上传几张,之后就不显示+号了,用户也无法上传了 * 默认9张 */