android实现微信朋友圈发布动态功能
本文实例为大家分享了android仿微信朋友圈发布动态功能的具体代码,供大家参考,具体内容如下
效果图:
本文概述
用到的开源库:仿照微信的图片选择器,Luban压缩图片,glide
上面红圈部分,当用户选中图片时,当=9张时,那个加号图片就会消失!
本文主要仿照微信的发布动态功能,主要时针对微信发布动态时,选中图片后的变化状态!
整体布局
这可以看到,控制图片状态的地方就是一个recyclerview
思路
利用recyclerview的多行视图来实现!
微信上的效果是,先选中图片后才会进入这个界面,这里实现的是我现在项目中用到的效果:默认显示一个带+好的图片,点击这个图片,会让你选择图片。
注意
我们不知道用户选择的图片大小是怎么样的,所以这里,选中图片后,先进行了压缩然后用glide去加载显示的。(这里之所以用glide是因为,用biatmap显示时,即使压缩了,但是同时选中5张以上,就会oom,所以用glide加载压缩后的url)
代码
代码里注释已经写的很详细了!
-ReleaseMessageActivity
publicclassReleaseMessageActivityextendsAppCompatActivity{ @BindView(R.id.text_cancel) TextViewtextCancel; @BindView(R.id.text_release) TextViewtextRelease; @BindView(R.id.mRec) RecyclerViewmRec; @BindView(R.id.et_messsage) EditTextetMesssage; privateArrayListlistImagePath; privateArrayList mList=newArrayList<>(); privateReleaseMsgAdapteradapter; privateArrayList list=newArrayList (); @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_release_message); ButterKnife.bind(this); setRecyclerview(); } privatevoidsetRecyclerview(){ if(mList!=null){ GridLayoutManagergridLayoutManager=newGridLayoutManager(this,4); mRec.setLayoutManager(gridLayoutManager); adapter=newReleaseMsgAdapter(ReleaseMessageActivity.this,mList); mRec.setAdapter(adapter); } } @OnClick({R.id.text_cancel,R.id.text_release}) publicvoidonClick(Viewview){ switch(view.getId()){ caseR.id.text_cancel: ToastUtil.showToast("取消"); break; caseR.id.text_release: ToastUtil.showToast("发布"); break; } } //用户选中图片后,拿到回掉结果 @Override protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){ super.onActivityResult(requestCode,resultCode,data); if(requestCode==0&&resultCode==RESULT_OK){ listImagePath=data.getStringArrayListExtra(EXTRA_RESULT); compress(listImagePath); } } //压缩拿到返回选中图片的集合url,然后转换成file文件 publicvoidcompress(ArrayList list){ for(StringimageUrl:list){ LogUtils.e(">>>>>>",imageUrl); Filefile=newFile(imageUrl); compressImage(file); } adapter.addMoreItem(list); } //压缩 privatevoidcompressImage(Filefile){ Luban.get(this)//用的第三方的压缩,开源库Luban大家可以自行百度 .load(file)//传人要压缩的图片 .putGear(Luban.THIRD_GEAR)//设定压缩档次,默认三挡 .setCompressListener(newOnCompressListener(){//设置回调 @Override publicvoidonStart(){ //TODO压缩开始前调用,可以在方法内启动loadingUI } @Override publicvoidonSuccess(finalFilefile){ URIuri=file.toURI(); String[]split=uri.toString().split(":"); list.add(split[1]);//压缩后返回的文件,带file字样,所以需要截取 LogUtils.e(BaseApplication.TAG,uri+"????????????"+split[1]); } @Override publicvoidonError(Throwablee){ //TODO当压缩过去出现问题时调用 } }).launch();//启动压缩 } }
ReleaseMsgAdapter
publicclassReleaseMsgAdapterextendsRecyclerView.Adapter{ privateActivitycontext; privateArrayList mList; privatefinalLayoutInflaterinflater; privatestaticfinalintITEM_TYPE_ONE=0x00001; privatestaticfinalintITEM_TYPE_TWO=0x00002; /** *这里之所以用多行视图,因为我们默认的有一张图片的(那个带+的图片,用户点击它才会才会让你去选择图片) *集合url为空的时候,默认显示它,当它达到集合9时,这个图片会自动隐藏。 */ publicReleaseMsgAdapter(Activitycontext,ArrayList mList){ this.context=context; this.mList=mList; inflater=LayoutInflater.from(context); } @Override publicRecyclerView.ViewHolderonCreateViewHolder(ViewGroupparent,intviewType){ parent.setPadding(20,0,20,0); switch(viewType){ caseITEM_TYPE_ONE: returnnewMyHolder(inflater.inflate(R.layout.release_message_item,parent,false)); caseITEM_TYPE_TWO: returnnewMyTWOHolder(inflater.inflate(R.layout.release_message_two_item,parent,false)); default: returnnull; } } @Override publicvoidonBindViewHolder(RecyclerView.ViewHolderholder,intposition){ if(holderinstanceofMyHolder){ bindItemMyHolder((MyHolder)holder,position); }elseif(holderinstanceofMyTWOHolder){ bindItemTWOMyHolder((MyTWOHolder)holder,position); } } privatevoidbindItemTWOMyHolder(finalMyTWOHolderholder,intposition){ LogUtils.e("Adapter",listSize()+""); if(listSize()>=9){//集合长度大于等于9张时,隐藏图片 holder.imageview2.setVisibility(View.GONE); } holder.imageview2.setOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewv){ //选择图片 CommonUtil.uploadPictures(context,9-listSize(),0); } }); } privatevoidbindItemMyHolder(MyHolderholder,intposition){ Glide.with(context) .load(mList.get(position)) .centerCrop() .into(holder.imageview); } @Override publicintgetItemViewType(intposition){ if(position+1==getItemCount()){ returnITEM_TYPE_TWO; }else{ returnITEM_TYPE_ONE; } } @Override publicintgetItemCount(){ LogUtils.e("getItemCount",mList.size()+1+""); returnmList.size()+1; } classMyHolderextendsRecyclerView.ViewHolder{ privatefinalImageViewimageview; publicMyHolder(ViewitemView){ super(itemView); imageview=(ImageView)itemView.findViewById(R.id.imageview); } } classMyTWOHolderextendsRecyclerView.ViewHolder{ privatefinalImageViewimageview2; publicMyTWOHolder(ViewitemView){ super(itemView); imageview2=(ImageView)itemView.findViewById(R.id.imageview2); } } //对外暴露方法。点击添加图片(类似于上啦加载数据) publicvoidaddMoreItem(ArrayList loarMoreDatas){ mList.addAll(loarMoreDatas); notifyDataSetChanged(); } //得到集合长度 publicintlistSize(){ intsize=mList.size(); returnsize; } }
CommonUtil.uploadPictures
/* *选择图片 **/ publicstaticIntentuploadPictures(Activityactivity,intnumber,intrequestCode){ //加载图片 PhotoPickerIntentintent=newPhotoPickerIntent(activity); intent.setSelectModel(SelectModel.MULTI);//多选 intent.setShowCarema(true);//是否显示拍照 intent.setMaxTotal(number);//最多选择照片数量,默认为9 //intent.setSelectedPaths(imagePaths);//已选中的照片地址,用于回显选中状态 intent.putExtra("type","photo");//选择方式; activity.startActivityForResult(intent,requestCode); returnintent; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。