android 微信朋友圈效果(附完整注释)
来源:互联网 发布:迅龙数据恢复 注册码 编辑:程序博客网 时间:2024/05/18 03:10
请尊重原创,转载请注明出处:http://blog.csdn.net/mabeijianxi/article/details/50533703
先看下效果图:
源码地址:https://github.com/mabeijianxi/Circle-of-friends
源码的核心类(adapter)里面几乎对每个方法都有注解。本demo主要想分享的是:
- listview各种嵌套处理
- listview的优化处理
- 用ImageLoader的一些特殊方式来优化图片加载
- listview的高度封装操作(刷新、加载更多、ui操作等)
- Activity动画的灵活应用
<strong></strong><span style="font-size:14px;">public class EaluationAdapter extends RecyclerView.Adapter<EaluationAdapter.EaluationHolder> { /** * 当高分辨率的时候服务器的图片显得太小,这里优化下显示比例 */ private Float fTimes; private Context mContext; private boolean mIsLoadImage = true; private ArrayList<EaluationListBean> mEaluationList; private EaluationGvPicAdaper mEaluationGvPicAdaper; private ImageLoader mImageLoader = ImageLoader.getInstance(); private DisplayImageOptions mConfig = new DisplayImageOptions.Builder() .showImageForEmptyUri(R.drawable.home_youpin) .showImageOnFail(R.drawable.home_youpin) .cacheInMemory(true)// 在内存中会缓存该图片 .cacheOnDisk(true)// 在硬盘中会缓存该图片 .considerExifParams(true)// 会识别图片的方向信息 .resetViewBeforeLoading(true)// 重设图片 .build(); public ArrayList<EaluationListBean> getmEaluationList() { return mEaluationList; } /** * 是否加载图片 * * @param isLoadImage */ public void setLoadImage(boolean isLoadImage) { this.mIsLoadImage = isLoadImage; } public EaluationAdapter(Context context) { this.mContext = context; mEaluationList = new ArrayList<>();// 适配单图放大比例 String sTimes = mContext.getResources().getString(R.string.times); fTimes = Float.valueOf(sTimes); } public void clearAdapterNotifyData() { mEaluationList.clear(); notifyDataSetChanged(); } public void clearAdapter() { mEaluationList.clear(); } public void addEaluationDataAllNotifyData(ArrayList<EaluationListBean> data) { if (data != null) { mEaluationList.addAll(data); notifyDataSetChanged(); } } public void addEaluationDataAll(ArrayList<EaluationListBean> data) { if (data != null) { mEaluationList.addAll(data); } } public void addEaluationData(EaluationListBean data) { if (data != null) { mEaluationList.add(data); notifyDataSetChanged(); } } @Override public int getItemCount() { return mEaluationList.size(); } @Override public EaluationHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate(R.layout.item_comments, parent, false); return new EaluationHolder(view); } @Override public void onBindViewHolder(EaluationHolder holder, int position) { EaluationListBean ealuationListBean = mEaluationList.get(position); List<EaluationListBean.EaluationPicBean> attachments = ealuationListBean.attachments; if (ealuationListBean.avatar != null) { mImageLoader.displayImage(ealuationListBean.avatar.smallPicUrl, holder.icon, mConfig); setIconClick(holder, ealuationListBean.avatar.smallPicUrl, ealuationListBean.avatar.picUrl); } else { holder.icon.setImageResource(R.drawable.home_youpin); setIconClick(holder, "null", "null"); } holder.tv_nickname.setText(ealuationListBean.userName); holder.tv_text.setText(ealuationListBean.content); holder.tv_date.setText(ealuationListBean.creatTime); holder.rb_stars.setRating(ealuationListBean.grade); setUpImage(holder, attachments, position); setUpTereplys(holder, ealuationListBean.evaluatereplys); } /** * 设置回复内容规则 *这里用的是自定义的LinearLayout,这样比listview消耗要小一些 * @param holder * @param evaluatereplysList */ private void setUpTereplys(EaluationHolder holder, List<EvaluatereplysBean> evaluatereplysList) { if (evaluatereplysList != null && evaluatereplysList.size() > 0) { holder.lv_comments_details.setVisibility(View.VISIBLE); EvaluatereplysAdapter evaluatereplysAdapter = new EvaluatereplysAdapter(mContext, evaluatereplysList); holder.lv_comments_details.setAdapter(evaluatereplysAdapter); } else { holder.lv_comments_details.setVisibility(View.GONE); } } /** * 设置图片显示规则 * * @param holder * @param attachments * @param position */ private void setUpImage(EaluationHolder holder, List<EaluationListBean.EaluationPicBean> attachments, int position) { holder.fl_image.setVisibility(View.GONE); if (attachments != null) { if (attachments.size() == 0) { holder.fl_image.setVisibility(View.GONE); } else if (attachments.size() == 1) { setSingleImage(attachments, holder, position); holder.gv_image.setVisibility(View.GONE); holder.iv_image.setVisibility(View.VISIBLE); holder.fl_image.setVisibility(View.VISIBLE); } else { holder.iv_image.setVisibility(View.GONE); holder.gv_image.setVisibility(View.VISIBLE); holder.fl_image.setVisibility(View.VISIBLE); setManyImage(attachments, holder, position); } } else { holder.fl_image.setVisibility(View.GONE); } } /** * 设置头像的点击看大图事件,这里为了方便直接把bean类进行了转换传递 * @param holder * @param miniPicUrl * @param picUrl */ private void setIconClick(EaluationHolder holder, final String miniPicUrl, final String picUrl) { holder.icon.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(mContext, LookBigPicActivity.class); Bundle bundle = new Bundle(); List<EaluationListBean.EaluationPicBean> attachments = new ArrayList<EaluationListBean.EaluationPicBean>(); EaluationListBean.EaluationPicBean ealuationPicBean = new EaluationListBean().new EaluationPicBean(); ealuationPicBean.imageUrl = picUrl; ealuationPicBean.smallImageUrl = miniPicUrl; attachments.add(ealuationPicBean); bundle.putSerializable(LookBigPicActivity.PICDATALIST, (Serializable) attachments); intent.putExtras(bundle); intent.putExtra(LookBigPicActivity.CURRENTITEM, 0); mContext.startActivity(intent);// 动画处理 startActivityAnim(); } }); } /** * 设置多图 * * @param attachments * @param holder * @param position */ private void setManyImage(List<EaluationListBean.EaluationPicBean> attachments, EaluationHolder holder, int position) {// mEaluationGvPicAdaper = (EaluationGvPicAdaper) holder.gv_image.getTag(position);// if(mEaluationGvPicAdaper==null){ EaluationGvPicAdaper mEaluationGvPicAdaper = new EaluationGvPicAdaper(mContext, attachments, mIsLoadImage);// holder.gv_image.setTag(position,mEaluationGvPicAdaper); holder.gv_image.setAdapter(mEaluationGvPicAdaper);// } } /** * 设置单图 * * @param attachments * @param holder */ private void setSingleImage(final List<EaluationListBean.EaluationPicBean> attachments, final EaluationHolder holder, final int position) {//可更具请求选择是否设置是否对单图快滑处理// if (mIsLoadImage) { mImageLoader.displayImage(attachments.get(0).smallImageUrl, holder.iv_image, mConfig, new ImageLoadingListener() { @Override public void onLoadingStarted(String imageUri, View view) { } @Override public void onLoadingFailed(String imageUri, View view, FailReason failReason) { } @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {// 优化显示比例 if (fTimes != 1) { int height = loadedImage.getHeight(); int width = loadedImage.getWidth(); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams((int) (width * fTimes), (int) (height * fTimes)); holder.iv_image.setLayoutParams(params); } } @Override public void onLoadingCancelled(String imageUri, View view) { } }); holder.iv_image.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {// 点击查看大图的操作 Intent intent = new Intent(mContext, LookBigPicActivity.class); Bundle bundle = new Bundle(); bundle.putSerializable(LookBigPicActivity.PICDATALIST, (Serializable) attachments); intent.putExtras(bundle); intent.putExtra(LookBigPicActivity.CURRENTITEM, 0); mContext.startActivity(intent); startActivityAnim(); } });// }// 优化快滑时的图片加载 /* else {//这样其实有时候会得不到,具体原因可以看源码里面的util,里面有详细注释 Bitmap bitmap = mImageLoader.getMemoryCache().get(attachments.get(0).smallImageUrl); if (bitmap != null) { holder.iv_image.setImageBitmap(bitmap); } }*/ } /** * 开始跳转动画 */ private void startActivityAnim() { ((MainActivity) mContext).overridePendingTransition(R.anim.activity2pic_in, R.anim.activity2pic_out); } static class EaluationHolder extends RecyclerView.ViewHolder { public CircularImage icon; public ImageView iv_image; public TextView tv_nickname; public TextView tv_text; // 可更具情况设置为emoji表情 public TextView tv_date; public RatingBar rb_stars; public CustomGridView gv_image; public LinearListView lv_comments_details; public FrameLayout fl_image; public EaluationHolder(View itemView) { super(itemView); icon = (CircularImage) itemView.findViewById(R.id.icon); iv_image = (ImageView) itemView.findViewById(R.id.iv_image); tv_nickname = (TextView) itemView.findViewById(R.id.tv_nickname); tv_text = (TextView) itemView.findViewById(R.id.tv_text); tv_date = (TextView) itemView.findViewById(R.id.tv_date); rb_stars = (RatingBar) itemView.findViewById(R.id.rb_stars); gv_image = (CustomGridView) itemView.findViewById(R.id.gv_image); lv_comments_details = (LinearListView) itemView.findViewById(R.id.lv_comments_details); fl_image = (FrameLayout) itemView.findViewById(R.id.fl_image); } }}</span>
主要对单图与多图处理,对滑动优化处理,其实还开了硬件加速(android:hardwareAccelerated="true"),这样可以最大程度让listview顺畅,大图查看模仿了QQ空间的查看模式,具体的可以看源码里面的几个adapter。
能力有限,如有不足的地方欢迎指出。
源码地址:https://github.com/mabeijianxi/Circle-of-friends
5 0
- android 微信朋友圈效果(附完整注释)
- android 滚动条下拉反弹的效果(类似微信朋友圈)
- Android QQ小红点的实现(附完整注释)
- Android QQ小红点的实现(附完整注释)
- android微信朋友圈分享
- 探究微信朋友圈,图片点击效果
- iOS纯Autolayout实现微信朋友圈和通讯录另附App启动页短视频效果
- 相册图片浏览器(模仿path),效果类似微信朋友圈,效果有优化。
- android类似微信朋友圈评论效果,listview定位,item总在输入法上面的位置
- android仿2016年春节微信朋友圈红包照片效果
- Android微信朋友、朋友圈分享(一)
- Android微信朋友、朋友圈分享(二)
- Android:微信分享(好友、朋友圈、收藏)文字信息
- Android:微信分享(好友、朋友圈、收藏)图片信息
- Android游戏开发----LibGdx游戏引擎制作微信火焰效果(附源码)
- android 微信朋友圈微博分享
- android 微信朋友分享,朋友圈分享
- 自定义ViewGroup打造微信朋友圈之九宫图效果
- iOS应用分发与内测(一)
- 【LeetCode-242】Valid Anagram(C++)
- Recognizing and Localizing Endangered Right Whales with Extremely Deep Neural Networks
- Hash桶实现hash表
- 第二章:高性能Web宏观架构之代理服务器Nginx安装部署
- android 微信朋友圈效果(附完整注释)
- C++编程对缓冲区的理解
- Codeforces 616D Longest k-Good Segment(双指针)
- xmpp整理笔记:xmppFramework框架的导入和介绍
- mathtype 公式插入编号
- 文章标题
- 【Linux】和【Mac】下修改终端提示文字和主机名的方法
- MyBatis (一)configuration.xml的配置/mapper持久类的映射/sqlSession的获取/基础的select,insert,delete,update
- typescript[4] - function