欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

android朋友圈评论功能兼容沉浸式状态栏,九宫格图片显示

程序员文章站 2022-05-13 08:15:40
...

android朋友圈评论功能,沉浸式状态栏,九宫格图片显示器,上拉加载下拉刷新功能,可直接用到项目中

背景

在前两个项目开发过程中用到了朋友圈这个功能,包含了评论回复、九宫格图片及大图展示展示,上拉加载下拉刷新,RecyclerView和第三方封装的万能适配器,自己根据使用情况,做了一下总结,功能有:

  1. 评论功能,沉浸式与软键盘评论框布局的完美显示,评论布局紧贴item下方显示
  2. 九宫格图片展示采用第三方 BGAPhotoPicker-Android
  3. RecyclerView与第三方万能适配器 BaseRecyclerViewAdapterHelper
  4. retrofit2与rxjava封装请求数据
  5. 表情与字符串间的转换

效果图

android朋友圈评论功能兼容沉浸式状态栏,九宫格图片显示

朋友圈评论回复功能

评论布局采用NoTouchLinearLayout:

/**
* 可以监听返回键点击事件的LinearLayout(解决了第一次点击返回按钮只隐藏键盘的问题)
*/

   public class NoTouchLinearLayout extends LinearLayout {
    public NoTouchLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    public NoTouchLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public NoTouchLinearLayout(Context context) {
        super(context);
    }
    private OnResizeListener mListener;

    public interface OnResizeListener {
        void OnResize();
    }
    public void setOnResizeListener(OnResizeListener l) {
        mListener = l;
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return true;
    }
    //返回键监听,点击返回按钮,键盘和该布局同时隐藏(解决了第一次点击返回按钮只隐藏键盘的问题)
    @Override
    public boolean dispatchKeyEventPreIme(KeyEvent event) {
        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
            mListener.OnResize();
            return true;
        }
        return super.dispatchKeyEventPreIme(event);
        }
}

评论列表采用IRecyclerView:

继承自RecyclerView,作用是:在mainfest里设置 Android:windowSoftInputMode=”adjustResize”,软件盘弹出隐藏时改变布局的大小,即onSizeChanged()方法会被调用。用来监听RecyclerView布局改变,控制评论布局的显示与隐藏
public class IRecyclerView extends RecyclerView {

    public interface OnSizeChangedListener {
        public void onSizeChanged();
    }

    private OnSizeChangedListener onSizeChangedListener;

    public void setOnSizeChangedListener(OnSizeChangedListener onSizeChangedListener) {
        this.onSizeChangedListener = onSizeChangedListener;
    }

    public IRecyclerView(Context context) {
        super(context);
    }

    public IRecyclerView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public IRecyclerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        if (onSizeChangedListener != null) {
            onSizeChangedListener.onSizeChanged();
        }
    }
}

点击item的评论图标时 记录item的位置级父布局的高度,用来确定键盘弹出时,RecyclerView停留的位置,使评论布局刚好显示在当前item下方:

android朋友圈评论功能兼容沉浸式状态栏,九宫格图片显示

   helper.setOnClickListener(R.id.CommentImageView, new View.OnClickListener() {
                                        @Override
                                        public void onClick(View view) {
                                            //获取点击的那个Item的高度
                                            position = helper.getPosition();//记录点击的位置
                                            isReply = false;
                                            mCommentEditText.setHint("评论" + item.getUser().getNickName() + ":");
                                            viewHeight = ((View) view.getParent().getParent()).getHeight();//获取当前View父布局的父布局高度
                                            showCommentLayout();
                                        }
                                    });

布局大小变动后,设置RecyclerViewList要滑动停留的位置

 //布局大小变动后,执行的方法
    @Override
    public void onSizeChanged() {
        linearLayoutManager.scrollToPositionWithOffset(position, mRecyclerViewList.getBottom() - viewHeight);//计算键盘弹出时  mRecyclerViewList要滑动停留的位置
    }

其中要实现的接口

public class CricleFragemnt extends BaseFragment implements IRecyclerView.OnSizeChangedListener, BaseQuickAdapter.RequestLoadMoreListener, SwipeRefreshLayout.OnRefreshListener,
        EasyPermissions.PermissionCallbacks, BGANinePhotoLayout.Delegate{

        }

实现的接口作用
IRecyclerView.OnSizeChangedListener:监听RecyclerView布局变化
BaseQuickAdapter.RequestLoadMoreListener:BaseQuickAdapter适配器上拉加载更多监听
SwipeRefreshLayout.OnRefreshListener:android系统自带下拉刷新
EasyPermissions.PermissionCallbacks:简单易懂的第三方SDK可以简化权限管理。本项目大图预览时用到
BGANinePhotoLayout.Delegate:实现九宫格大图查看功能

演示Apk下载

http://oor5869gg.bkt.clouddn.com/app-debug.apk

代码下载

http://download.csdn.net/detail/ming_ruo_xiao_xi/9908838

目前只总结了这么多功能,有空了准备加入评论表情和其它功能,欢迎关注