仿微信朋友圈拍照上传
模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy!
1. PhotoPicker的使用
这是一个支持选择多张图片,点击图片放大,图片之间左右滑动互相切换的库,同时支持图片删除的库,效果类似微信。(1) 添加PhotoPicker的架包(2) 使用选择图片:安卓6.0以后需要在代码中添加读写sd卡和相机的权限 当然清单文件中也需要添加的PhotoPicker.builder().setPhotoCount(maxPhoto) //设置最多选择的图片数量.setShowCamera(true) //是否显示相机按钮.setSelected(photos) //设置已经选好的图片.start(SendDynamicActivity.this); //上下文参数 需要传activity查看图片:PhotoPreview.builder().setPhotos(photos) //设置选择好的图片.setCurrentItem(position) //设置当前选择的条目.setShowDeleteButton(true) //是否显示删除按钮.start(this);
2. 发布朋友圈页面
代码比较简单直接上
package com.zlc.friendcirclephoto.ui;import android.Manifest;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.text.InputFilter;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.mylhyl.acp.Acp;
import com.mylhyl.acp.AcpListener;
import com.mylhyl.acp.AcpOptions;
import com.zlc.friendcirclephoto.adapter.MyItemTouchHelperCallback;
import com.zlc.friendcirclephoto.adapter.SendImageAdapter;
import com.zlc.friendcirclephoto.view.CommonEditText;
import com.zlc.friendcirclephoto.R;
import com.zlc.friendcirclephoto.utils.LogUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;import me.iwf.photopicker.PhotoPicker;
import me.iwf.photopicker.PhotoPreview;/*** Created by zlc* 发布朋友圈*/
public class SendDynamicActivity extends BaseActivity implements View.OnClickListener,SendImageAdapter.OnClickListener{private ImageView im_fanhui;private TextView tv_title;private CommonEditText id_et_content;private TextView id_tv_num;private TextView id_tv_max_num;private SendImageAdapter mPhotoAdapter;public static final int maxPhoto = 9; //最大选择几张照片private List<Object> images = new ArrayList<>();private ArrayList<String> photos = new ArrayList<>();private RecyclerView mRecycleView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_send_note);initView();initData();initListener();}private void initView() {im_fanhui = findView(R.id.id_iv_back);tv_title = findView(R.id.id_tv_title);tv_title.setText("发布");id_et_content = findView(R.id.id_common_et);mRecycleView = findView(R.id.id_recycleview);id_tv_num = findView(R.id.tv_num);id_tv_max_num = findView(R.id.id_tv_max_num);id_et_content.setHint("这一刻的想法......");id_tv_num.setText("0");id_tv_max_num.setText("/188");id_et_content.setFilters(new InputFilter[]{new InputFilter.LengthFilter(188)});}private void initData() {images.add(1);mRecycleView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));mPhotoAdapter = new SendImageAdapter(SendDynamicActivity.this, images);mRecycleView.setAdapter(mPhotoAdapter);mPhotoAdapter.setOnClickListener(this);MyItemTouchHelperCallback callBack = new MyItemTouchHelperCallback(mPhotoAdapter);//实现拖拽排序final ItemTouchHelper touchHelper = new ItemTouchHelper(callBack);//调用ItemTouchHelper的attachToRecyclerView方法建立联系touchHelper.attachToRecyclerView(mRecycleView);}private void initListener() {im_fanhui.setOnClickListener(this);id_et_content.setOnTextChaged(new CommonEditText.OnTextChaged() {@Overridepublic void setText(String s) {id_tv_num.setText(s.length()+"");}});}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.id_iv_back:finish();break;}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK && (requestCode == PhotoPicker.REQUEST_CODE || requestCode == PhotoPreview.REQUEST_CODE)) {List<String> photos = null;if (data != null) {photos = data.getStringArrayListExtra(PhotoPicker.KEY_SELECTED_PHOTOS);}if (photos != null) {clearPhotoS(photos.size());images.addAll(images.size()-1,photos);mPhotoAdapter.notifyDataSetChanged();}}}@Overridepublic void onClick(View v, int position) {switch (v.getId()){case R.id.iv_add:selectPhoto();break;case R.id.im_delete:delImages(position);break;case R.id.iv_img:lookPhoto(position);break;}}public void delImages(int position){images.remove(position);if(mPhotoAdapter!=null)mPhotoAdapter.notifyItemRemoved(position);}public void clearPhotoS(int size){LogUtil.e("返回有几张照片",size+"");images.clear();images.add(1);}//选择图片private void selectPhoto() {List<Object> images = mPhotoAdapter.getDatas();photos.clear();for (int i = 0;i< images.size()-1;i++ ){photos.add(images.get(i).toString());}//权限Acp.getInstance(this).request(new AcpOptions.Builder().setPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CAMERA,Manifest.permission.READ_EXTERNAL_STORAGE).build(),new AcpListener() {@Overridepublic void onGranted() {LogUtil.e("msg", "权限外全部通过");PhotoPicker.builder().setPhotoCount(maxPhoto).setShowCamera(true).setSelected(photos).start(SendDynamicActivity.this);}@Overridepublic void onDenied(List<String> permissions) {LogUtil.e(permissions.toString() ,"权限拒绝");}});}//查看图片private void lookPhoto(int position){photos.clear();List<Object> images = mPhotoAdapter.getDatas();for (int i = 0;i< images.size()-1;i++ ){photos.add(images.get(i).toString());}PhotoPreview.builder().setPhotos(photos).setCurrentItem(position).setShowDeleteButton(true) //是否显示删除按钮.start(this);}
}
3. 图片适配器代码
public class SendImageAdapter extends RecyclerView.Adapter<SendImageAdapter.ViewHolder> implements ItemTouchHelperAdapter{private Activity mContext;private List<Object> mDatas;private LayoutInflater mLayoutInflater;public SendImageAdapter(Activity context,List<Object> datas){this.mContext = context;this.mDatas = datas;mLayoutInflater = LayoutInflater.from(context);}@Overridepublic SendImageAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = mLayoutInflater.inflate(R.layout.send_grid_item,parent,false);return new ViewHolder(view);}@Overridepublic void onBindViewHolder(final SendImageAdapter.ViewHolder viewHolder, final int position) {Object image = mDatas.get(position);LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) viewHolder.id_rl_img.getLayoutParams();int w = params.width = (int) ((ScreenUtil.getScreenWidth(mContext) - DensityUtil.dp2px(mContext,38)) / 3.0);params.height = w;params.bottomMargin = DensityUtil.dp2px(mContext,7);params.rightMargin = DensityUtil.dp2px(mContext,7);viewHolder.id_rl_img.setLayoutParams(params);if (image instanceof String) {viewHolder.im_delete.setVisibility(View.VISIBLE);viewHolder.iv_add.setVisibility(View.GONE);viewHolder.im_img.setVisibility(View.VISIBLE);//这里最好使用glide Picasso加载本地图片 bitmap容易造成内存溢出Bitmap bitmap = BitmapFactory.decodeFile(image.toString());viewHolder.im_img.setImageBitmap(bitmap);LogUtil.e("手机照片", image.toString());} else {viewHolder.im_delete.setVisibility(View.INVISIBLE);viewHolder.iv_add.setVisibility(View.VISIBLE);viewHolder.im_img.setVisibility(View.GONE);viewHolder.iv_add.setImageResource(R.drawable.tupiantianjia2x);LogUtil.e("添加照片", ""+image);}viewHolder.iv_add.setOnClickListener(new MyClickListener(viewHolder));viewHolder.im_img.setOnClickListener(new MyClickListener(viewHolder));viewHolder.im_delete.setOnClickListener(new MyClickListener(viewHolder));}@Overridepublic int getItemCount() {if(mDatas == null){return 0;}return mDatas.size() >= 9 ? 9 : mDatas.size();}public List<Object> getDatas() {return mDatas;}public static class ViewHolder extends RecyclerView.ViewHolder{private final ImageView im_img;private final ImageView iv_add;private final ImageView im_delete;private final FrameLayout id_rl_img;public ViewHolder(View itemView) {super(itemView);im_img = (ImageView) itemView.findViewById(R.id.iv_img);iv_add = (ImageView) itemView.findViewById(R.id.iv_add);im_delete = (ImageView) itemView.findViewById(R.id.im_delete);id_rl_img = (FrameLayout) itemView.findViewById(R.id.id_rl_img);}}//拖拽排序相关@Overridepublic void onItemMove(int fromPos, int toPos) {if(fromPos == mDatas.size()-1 || toPos == mDatas.size()-1 )return;if (fromPos < toPos)//向下拖动for (int i = fromPos; i < toPos; i++) {Collections.swap(mDatas, i, i + 1);}else {//向上拖动for (int i = fromPos; i > toPos; i--) {Collections.swap(mDatas, i, i - 1);}}notifyItemMoved(fromPos,toPos);}//滑动删除相关@Overridepublic void onItemDel(int pos) {if(pos == mDatas.size() - 1)return;mDatas.remove(pos);notifyItemRemoved(pos);}public interface OnClickListener{void onClick(View v, int position);}private static OnClickListener onClickListener;public void setOnClickListener(OnClickListener onClickListener) {this.onClickListener = onClickListener;}public static class MyClickListener implements View.OnClickListener{private ViewHolder mHolder;public MyClickListener(ViewHolder holder ){this.mHolder = holder;}@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.iv_add:case R.id.im_delete:case R.id.iv_img:if(onClickListener!=null) {int pos = mHolder.getAdapterPosition();onClickListener.onClick(view, pos);}break;}}}
}
4. 拖拽排序
(1) RecycleView通过ItemTouchHelper 实现MyItemTouchHelperCallback callBack = new MyItemTouchHelperCallback(mPhotoAdapter);//实现拖拽排序final ItemTouchHelper touchHelper = new ItemTouchHelper(callBack);//调用ItemTouchHelper的attachToRecyclerView方法建立联系touchHelper.attachToRecyclerView(mRecycleView);(2) MyItemTouchHelperCallback的自定义
package com.zlc.friendcirclephoto.adapter;import android.graphics.Canvas;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.support.v7.widget.helper.ItemTouchHelper;public class MyItemTouchHelperCallback extends ItemTouchHelper.Callback {private SendImageAdapter mAdapter; //适配器传过来private boolean isLongDrag = true;private boolean isMoveSwipe = true;public MyItemTouchHelperCallback(SendImageAdapter adapter){this.mAdapter = adapter;}@Overridepublic int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();int dragFlags = 0; //拖拽的标志int swipeFlags = 0; //删除的标志int position = viewHolder.getAdapterPosition();if(position == mAdapter.getDatas().size() - 1){ // 如果是最后一个条目 则既不能拖拽也不能删除dragFlags = 0;swipeFlags = 0;} else if(layoutManager instanceof GridLayoutManager || layoutManager instanceof StaggeredGridLayoutManager){//网格布局 则支持上下左右拖拽 不支持删除dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; //允许上下左右的拖动swipeFlags = 0; //不能删除}else if(layoutManager instanceof LinearLayoutManager){ //线性布局分为垂直和水平LinearLayoutManager manager = (LinearLayoutManager) layoutManager;int orientation = manager.getOrientation();if(orientation == LinearLayoutManager.HORIZONTAL){ //横向listview列表 dragFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; //允许左右的拖动swipeFlags = ItemTouchHelper.DOWN; //只允许从上向下侧滑}else if(orientation == LinearLayoutManager.VERTICAL){ //竖向listview列表dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; //允许上下的拖动swipeFlags = ItemTouchHelper.LEFT; //只允许从右向左侧滑删除}}else{ //最后一个条目既不能拖拽也不能删除 相当于更多dragFlags = 0;swipeFlags = 0;}return makeMovementFlags(dragFlags,swipeFlags);}@Overridepublic boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {mAdapter.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());return true;}@Overridepublic void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {mAdapter.onItemDel(viewHolder.getAdapterPosition());}// 该方法返回true时,表示支持长按拖动@Overridepublic boolean isLongPressDragEnabled() {return isLongDrag;}//该方法返回true时,表示支持滑动删除@Overridepublic boolean isItemViewSwipeEnabled() {return isMoveSwipe;}//从静止状态变为拖拽或者滑动的时候会回调该方法,参数actionState表示当前的状态。 开始拖拽的时候给item添加一个背景色,然后在拖拽完成的时候还原@Overridepublic void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {//拖拽的时候才设置背景颜色
// if (actionState != ItemTouchHelper.ACTION_STATE_IDLE && actionState != ItemTouchHelper.ACTION_STATE_SWIPE) {// viewHolder.itemView.setBackgroundColor(Color.LTGRAY);
// }super.onSelectedChanged(viewHolder, actionState);}//当用户操作完毕某个item并且其动画也结束后会调用该方法@Overridepublic void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {//重置改变,防止由于复用而导致的显示问题super.clearView(recyclerView, viewHolder);viewHolder.itemView.setBackgroundColor(0);}//我们可以在这个方法内实现我们自定义的交互规则或者自定义的动画效果@Overridepublic void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);}public void setLongDrag(boolean longDrag) {isLongDrag = longDrag;}public void setMoveSwipe(boolean moveSwipe) {isMoveSwipe = moveSwipe;}
}(3) 具体实现方法//拖拽排序相关@Overridepublic void onItemMove(int fromPos, int toPos) {if(fromPos == mDatas.size()-1 || toPos == mDatas.size()-1 )return;if (fromPos < toPos)//向下拖动for (int i = fromPos; i < toPos; i++) {Collections.swap(mDatas, i, i + 1);}else {//向上拖动for (int i = fromPos; i > toPos; i--) {Collections.swap(mDatas, i, i - 1);}}notifyItemMoved(fromPos,toPos);}//滑动删除相关@Overridepublic void onItemDel(int pos) {if(pos == mDatas.size() - 1)return;mDatas.remove(pos);notifyItemRemoved(pos);}
5. 联系方式
qq:1509815887@qq.com
email : zlc921022@163.com
phone : 18684732678
6.下载地址
点击去下载
仿微信朋友圈拍照上传相关推荐
- android com.mylhyl,Android 高仿微信朋友圈拍照上传功能
模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. photopicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...
- android 微信高仿,Android 高仿微信朋友圈拍照上传功能
模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. PhotoPicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间 ...
- Android仿微信朋友圈图片上传选择器布局
标题有点绕口,直接上一个效果图,如果符合你的需求的请在往下看,避免浪费你的时间 当当当当,标红的区域就是今天我们要干的活了 ,搞起来! 思路: 对android有点了解的人都知道在列表显示中我们可以使 ...
- 仿微信朋友圈图片上传
先贴上地址 项目地址 介绍 仿微信朋友圈的图片上传,图片上传缓存,断网后重新连接网络或者APP重启,自动上传未上传的图片 Config的阿里云配置需要自己添加 public class Config ...
- android 高仿朋友圈title,Android之高仿微信朋友圈图片上传
碰到过很多上传图片的功能,大多都是要求是仿微信,不论是单图还是多图,更不知道是出于什么原因要去仿微信,总之,作为开发人员,很无奈,今天就把这种需求总结出来了,方便以后使用,下面就开始撸...... 一 ...
- Android 仿微信朋友圈拍照原理解读,技术分析
在日常开发中,我们的APP中经常会有拍照的功能,很多的产品经理会要求把拍照和拍照后编辑的体验弄成和微信一样. 先来看看微信的拍照界面和编辑界面 微信拍照的两个优点 :1.响应速度快,从点击拍照按钮,到 ...
- Android实现仿微信朋友圈发布动态(拍照、图库选择、照片压缩、显示、保存、缩略图、点击缩略图删除对应文件等)
原址: http://blog.csdn.net/zhang3776813/article/details/52092591 /*** 仿微信朋友圈发布动态* 拍照或图库选择 * 压缩图片并保存**/ ...
- Android实现仿微信朋友圈发布动态(拍照、图库选择、照片压缩、显示、保存、缩略图、点击缩略图删除对应文件等)附源码
原创作品,转载请注明出处:http://blog.csdn.net/zhang3776813/article/details/52092591 最近项目需求中要用到类似微信朋友圈发布 ...
- Android 仿微信朋友圈添加图片
github地址(欢迎下载Demo) https://github.com/zhouxu88/WXCircleAddPic 老习惯,先上图,着急用的朋友,直接带走Demo,先拿来用吧,毕竟老板催的紧, ...
最新文章
- python中getopt函数_python getopt模块详解
- 百度的TSDB——可针对tag查询,应该类似kairosDB
- oauth2 token为空拦截_feign之间传递oauth2-token的问题和解决
- Python super 函数 - Python零基础入门教程
- python是开源语言吗c,属于新十年的开发语言:Go语言可能很快会取代Python
- 符合要求的安全电路用计算机屏蔽电缆,全国计算机三级信息安全技术习题及答案...
- unity ab包加载_Unity资源管理和打包
- [译]介绍Spark2.4的用于处理复杂数据类型的新内置函数与高阶函数
- Word文档编辑技巧(一)
- Spring IoC 的实现机制
- Fultter之Future用法入门
- NRPE: Unable to read output 问题处理总结
- 隐藏input的光标
- 【C语言】冒泡排序法
- Md5扩展攻击的原理和应用
- 区块链应用成功案例有哪些?
- 计算机改变我们生活英语作文,How did computer change our live?(计算机如何改变我们的生活?初中英语作文)...
- 软件测试面试题整理(十一)之软件测试理论(技术)——终极篇
- 西门子SMART PLC增量式PID(完整梯形图FC)
- 春节“聊天宝”使用秘籍,轻松应对亲戚尬聊
热门文章
- 解决“attempted relative import with no known parent package“的错误
- IT运维的365天--009微信双开批处理文件运行出错(当前目录无效)的解决
- CS224W-图神经网络 笔记5.1:Spectral Clustering - 谱聚类基础知识点
- 荧光染料BDP FL maleimide/马来酰亚胺,CAS:773859-49-7
- pt-table-checksum 使用实践
- ATECC508A芯片开发笔记(九):加密读写508芯片数据的流程及相应设置
- MCU芯片设计和软件开发
- VsCode镜像下载(国内镜像源,高速秒下)
- 美团外卖小哥竟开发阿里云盘,抢先首发
- 9 客户端认证方式 之 PKCE