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;
privateArrayListmList=newArrayList<>();
privateReleaseMsgAdapteradapter;
privateArrayListlist=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(ArrayListlist){
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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。