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

最近因为项目需求,需要做一个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;

    /***
     * 初始化数据
     */
    @Override
    protected 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
     */
    @Override
    protected 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();
    }

    /***
     * 滑动监听事件
     */
    @Override
    protected void onInitEvents() {
        super.onInitEvents();
        /**滑动选择事件*/
        mScl.setOnSlidingSelectListener(new SlidingSelectLayout.OnSlidingSelectListener<Demo>() {
            @Override
            public 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) {
            @Override
            public 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>() {
            @Override
            public void onItemClick(int pos, RvViewHolder holder, Demo data) {
                data.isChanged = !data.isChanged;
                /**notifyItemChanged表示在集合里边的数据发生改变的时候,更改本item的变化*/
                adapter.notifyItemChanged(pos);
            }
        });

        /**此方法可以忽略,如果只想做一个界面,博主只是为了展示一个效果*/
        adapter.setOnItemLongClickListener(new OnLongClickListener<Demo>() {
            @Override
            public void onItemLongClick(int pos, RvViewHolder holder, Demo data) {
                startActivity(new Intent(mContext, ItemHeaderRuleActivity.class));
            }
        });

        mRv.setAdapter(adapter);
    }

    /***
     * 添加布局  创建布局
     * @return
     */
    @Override
    protected int getLayoutId() {
        return R.layout.activity_main;
    }

    /**
     * 没有权限
     * @return
     */
    @Override
    protected String[] getPermission2Check() {
        return new String[0];
    }

    /***
     * 是否显示titleBar 返回false 则隐藏titleBar
     * @return
     */
    @Override
    protected 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 23
    buildToolsVersion "23.0.3"
至于在哪里修改,应该不用我说了吧,不知道的百度吧。

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

    compile 'com.march.quickrvlibs:quickrvlibs:2.1.3'
    compile 'com.march.baselib:baselib:0.0.1'
我记得需要改动的就这些了,嗯,如果还有忘记的,欢迎补充。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值