最近因为项目需求,需要做一个QQ聊天界面里边的相册功能,那是个什么功能?难道和微信不一样???试了一下,厉害了,我的哥,竟然可以滑动选择图片,这是咋弄的,还可以这么玩,好奇!!!必须给整出来,就算没有这个需求了,也要整出来,所有意思啊

百度,Google,找了半天,只有一篇,CSDN上边有一篇http://blog.csdn.net/chendong_/article/details/52473160,就是这个了,还有github上边也有一篇,https://github.com/chendongMarch/SlidingCheckSample,应该是同一个人的,毕竟项目名字是一样的,其他的没注意看,不管他,下载下来看看再说

虽然有点出入吧,但是大体上基本没错,运行效果

演示视频

  • 普通模式演示视频

  • 九宫格模式演示视频

大体就是这样子的了,但是博主就说明了一下他的framelayout是怎么重写的,那么我再补充些,在activity里边是怎么运行的吧,也便于以后再有这个需求的时候,能有个地方查找到,更容易入手

package com.march.slidingchecksample;import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;import com.march.quickrvlibs.RvViewHolder;
import com.march.quickrvlibs.SimpleRvAdapter;
import com.march.quickrvlibs.inter.OnClickListener;
import com.march.quickrvlibs.inter.OnLongClickListener;
import com.march.slidingselect.SlidingSelectLayout;import java.util.ArrayList;
import java.util.List;/*** 直接集成activity,然后添加方法 各种初始化 也是可以的,但是可能是博主为了对6.0进行兼容,所以进行了大量封装* 但是有用佮只有本来的几个方法,最后边的三个方法 基本没用,  前提是SDK版本必须是22以下(包含22)*/
public class MainActivity extends MyBaseActivity {private RecyclerView mRv;private SlidingSelectLayout mScl;private List<Demo> demos;private int size;private float spanCount = 4f;private SimpleRvAdapter<Demo> adapter;/**** 初始化数据*/@Overrideprotected void onInitDatas() {super.onInitDatas();/**(getResources().getDisplayMetrics().widthPixels获取屏幕宽度*///屏幕的偏移量   是屏幕的1/4 因为recyclerview的gridview布局里边每行有四个item,所以偏移量是屏幕的1/4,//如果每行有三个item 则spanCount = 1f;size = (int) (getResources().getDisplayMetrics().widthPixels / spanCount);demos = new ArrayList<>();for (int i = 0; i < 50; i++) {demos.add(new Demo(i, "this is " + i));}}/**** 初始化view* @param save*/@Overrideprotected void onInitViews(final Bundle save) {super.onInitViews(save);mRv = getView(R.id.recyclerview);mScl = getView(R.id.scl);/**展示recyclerview为gridview类型   布局填充器**/mRv.setLayoutManager(new GridLayoutManager(mContext, (int) spanCount));createAdapter();}/**** 滑动监听事件*/@Overrideprotected void onInitEvents() {super.onInitEvents();/**滑动选择事件*/mScl.setOnSlidingSelectListener(new SlidingSelectLayout.OnSlidingSelectListener<Demo>() {@Overridepublic void onSlidingSelect(int pos, View parentView, Demo data) {//滑动选中之后,修改集合的数据为true 默认值为false 因为没有设置类型 则取默认值/***获取item是否选中*/demos.get(pos).isChanged = !demos.get(pos).isChanged;/**更改item*//**notifyItemChanged表示在集合里边的数据发生改变的时候,更改本item的变化*/adapter.notifyItemChanged(pos);}});}/**** 初始化适配器*/private void createAdapter() {/**simpleRvAdapter相当于simpleadapter,同样是适配器的一种**/adapter = new SimpleRvAdapter<Demo>(mContext, demos, R.layout.item_rv) {@Overridepublic void onBindView(RvViewHolder holder, Demo data, int pos, int type) {ViewGroup.LayoutParams lp = holder.getParentView().getLayoutParams();lp.width = size;lp.height = size;TextView tv = (TextView) holder.getView(R.id.content);if (data.isChanged) {tv.setTextColor(Color.RED);tv.setText("change " + data.desc);} else {tv.setTextColor(Color.WHITE);tv.setText(data.desc);}/**设置settag,至于没有gettag,博主已经在重写的framelayout里边写完了*/mScl.markView(holder.getParentView(), pos, data);}};adapter.setOnChildClickListener(new OnClickListener<Demo>() {@Overridepublic void onItemClick(int pos, RvViewHolder holder, Demo data) {data.isChanged = !data.isChanged;/**notifyItemChanged表示在集合里边的数据发生改变的时候,更改本item的变化*/adapter.notifyItemChanged(pos);}});/**此方法可以忽略,如果只想做一个界面,博主只是为了展示一个效果*/adapter.setOnItemLongClickListener(new OnLongClickListener<Demo>() {@Overridepublic void onItemLongClick(int pos, RvViewHolder holder, Demo data) {startActivity(new Intent(mContext, ItemHeaderRuleActivity.class));}});mRv.setAdapter(adapter);}/**** 添加布局  创建布局* @return*/@Overrideprotected int getLayoutId() {return R.layout.activity_main;}/*** 没有权限* @return*/@Overrideprotected String[] getPermission2Check() {return new String[0];}/**** 是否显示titleBar 返回false 则隐藏titleBar* @return*/@Overrideprotected boolean isInitTitle() {return false;}}

具体代码,注释已写好,说下需要注意的地方,as开发人员需要在项目的build.gradle里边 添加下边的代码

    dependencies {classpath 'com.android.tools.build:gradle:2.1.3'classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'}

然后更新,花费时间会很长,基本五到十分钟吧,在下载的时候,你可以先看下上百年的代码注释,还有一个地方需要注意,因为博主已经兼容了6.0,自然监听权限的框架肯定是少不了的,所以呢,SDK版本号,就必须改成23了

android {compileSdkVersion 23buildToolsVersion "23.0.3"

至于在哪里修改,应该不用我说了吧,不知道的百度吧。

在项目app的build.gradle里边还需要添加两个包

    compile 'com.march.quickrvlibs:quickrvlibs:2.1.3'compile 'com.march.baselib:baselib:0.0.1'

我记得需要改动的就这些了,嗯,如果还有忘记的,欢迎补充。

仿QQ聊天界面里边的相册(QQ相册)相关推荐

  1. java qq聊天界面代码,Java简易qq聊天,代码

    Java简易qq聊天,代码 关注:156  答案:2  手机版 解决时间 2021-02-26 11:56 提问者心死旳很干净 2021-02-25 16:17 Java简易qq聊天,代码 最佳答案 ...

  2. qq聊天界面 java程序 51cto_Java QQ项目详细设计之:组操作模块

    好长时间没发博文了,今天再写点,今天写qq软件的组操作模块,由于客户端方面的组操作不需要复杂的逻辑,所以就不写客户端了,只写一下服务器端的组操作响应,好,先写一下伪码: 组操作模块 由于基本的几个组操 ...

  3. C语言实现类似QQ聊天界面抖动功能

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/104991863 实 ...

  4. 点击跳转到QQ聊天界面

    <!--//需要添加好友验证--><a href="tencent://message/?uin=QQ号码&Site=&Menu=yes"> ...

  5. gui编程实践(2)--qq聊天界面 JTextArea多行文本框组件

    //qq聊天界面 package com.test; import java.awt.*; import javax.swing.*; public class Demo8_10 extends JF ...

  6. 【3】QQ 聊天界面

    1.说明 稍微修改了下QQ示例里面的聊天界面界面,然后把代码扣过来完成了QQ聊天界面部分,效果还可以. 不过自己添加了消息响应:窗口抖动,截屏,字体栏的显示和隐藏 2.代码部分 // QQTalk.h ...

  7. qt小项目 代码实现简易的QQ聊天界面

    qt小项目 代码实现简易的QQ聊天界面 代码 效果图 总结 代码 myDialog.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QW ...

  8. QQ聊天界面的布局和设计(IOS篇)-第二季

    QQChat Layout - 第二季 本来第二季是快写好了, 也花了点功夫, 结果gitbook出了点问题, 给没掉了.有些细节可能会一带而过, 如有疑问, 相互交流进步~. 在第一季中我们完成了Q ...

  9. 防qq聊天界面纯HTML5,html5 实现qq聊天的气泡效果

    教程:http://m.blog.csdn.net/blog/yhc13429826359/38778337 写的很好.自己实现的时候,由于img float:left,会脱离文档流,导致结构混乱. ...

  10. 使用js实现的带输入状态的简单的仿微信聊天界面

    使用js实现的简单的仿微信聊天界面,实现固定的聊天回复功能,只能是固定的5句,但是回复的内容可以在代码的判断中进行修改. 实现的效果有:1.实现仿微信的聊天界面 2.实现仿微信的正在输入功能. 原理: ...

最新文章

  1. Openstack组件部署 — Nova_Install and configure a compute node
  2. web项目获取运行时...\WEB-INF\classes目录下文件
  3. linux配置ip 网关 和dns(转)
  4. 我阅读的第一个程序GridView遇到的问题
  5. cad模糊查询符号_万能模糊查询SQL
  6. ASP——Request.Form()方法获取POST提交方式的表单中文乱码解决方案
  7. PHP做二次开发:ThinkCMF门户应用安装
  8. Linux服务器架设笔记-Squid服务器配置
  9. 【论文笔记】PTE:预测性文本嵌入
  10. 如何设置CSDN的ID(仅新建可设置)
  11. 单片机c语言程序编写歌谱,单片机简谱程序
  12. Phase2 Day14 Collections RedBlackTree
  13. adobe官方卸载工具:Creative Cloud Cleaner Tool Mac版
  14. html怎样在视频上添加文字,视频底部加一行文字 如何在视频上加文字
  15. vue3 Extraneous non-props attributes (modelValue) were passed to component but could not be automati
  16. Excel·VBA按列拆分工作表、工作簿
  17. 无人机利用视觉slam实现位置估计
  18. 利用c语言编写一个时钟计时器(c语言基础练习)
  19. Ubuntu上mysql的安装及使用【转】
  20. 从零开始一键安装TeslaMate

热门文章

  1. 夜深了,最好喝点咖啡
  2. GPU深度报告,三大巨头,十四个国内玩家一文看懂【物联网智商精选】
  3. Tue Feb 23 2021 00:00:00 GMT+0800 (中国标准时间)时间格式转换
  4. 洛依微服务版本简单研究
  5. 标准C语言程序设计第七版pdf,C语言程序设计 201607.pdf
  6. 999C - Alphabetic Removals
  7. cdr 2021 卸载
  8. 2019/9/10谷歌开发者大会汇总
  9. windows x86和x64的区别
  10. MyBatis 的一级缓存与二级缓存