SpectatorView多人视频-顶部观众view

88 阅读1分钟
public class SpectatorView extends ConstraintLayout {

    private ImageView ivArrowLeft;
    private RecyclerView rvSpectator;
    private ImageView ivArrowRight;
    private SpectatorAdapter adapter;
    private LinearLayoutManager linearLayoutManager;
    private List<MeetingUserInfo> datas;
    private int firstVisiblePos;    //可见的第一个item位置
    private int lastVisiblePos; //可见的最后一个item位置
    private OnItemLongClickListener listener;

    public SpectatorView(@NonNull @NotNull Context context, @Nullable @org.jetbrains.annotations.Nullable AttributeSet attrs) {
        super(context, attrs);
        initView(context);
    }

    private void initView(Context context) {
        View view = LayoutInflater.from(context).inflate(R.layout.layout_spectator, this);
        ivArrowLeft = view.findViewById(R.id.iv_arrow_left);
        rvSpectator = view.findViewById(R.id.rv_spectator);
        ivArrowRight = view.findViewById(R.id.iv_arrow_right);

        linearLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false);
        rvSpectator.setLayoutManager(linearLayoutManager);
        rvSpectator.addItemDecoration(new DividerItemDecoration(context, DividerItemDecoration.HORIZONTAL_LIST, R.drawable.shape_recyc_hor_divider_16dp));
        RecycleViewScrollListener scrollListener = new RecycleViewScrollListener(LinearLayoutManager.HORIZONTAL);
        scrollListener.setOnScrollStateListener(isScrolling -> {
            if (isScrolling) {
                refreshArrowVisible();
            }
        });
        rvSpectator.addOnScrollListener(scrollListener);
        datas = new ArrayList<>();
        adapter = new SpectatorAdapter();
        rvSpectator.setAdapter(adapter);
        adapter.setOnLongClickListener((view1, userId, x, y) -> {
            if (null != listener) listener.onItemLongClick(view1, userId, x, y);
        });
    }

    public void addUser(String userId) {
        if (!isExistUser(userId)) {
            MeetingUserInfo userInfo = new MeetingUserInfo();
            userInfo.setUserId(userId);
            datas.add(userInfo);
            if (datas.size() == 1) {
                adapter.setData(datas);
            } else {
                adapter.notifyDataSetChanged();
            }

            refreshArrowVisible();
        }
    }

    public void removeUser(String userId) {
        if (isExistUser(userId)) {
            datas.remove(getUser(userId));
            adapter.notifyDataSetChanged();

            refreshArrowVisible();
        }
    }

    public void removeUser(String userId, int position) {
        if (isExistUser(userId)) {
            datas.remove(position);
            adapter.notifyDataSetChanged();

            refreshArrowVisible();
        }
    }

    public void updateUser(String userId) {
        if (isExistUser(userId)) {
            MeetingUserInfo userInfo = getUser(userId);
            userInfo.setName(MeetingManager.getInstance().getUser(userId).getName());
            userInfo.setAvatarUrl(MeetingManager.getInstance().getUser(userId).getAvatarUrl());
            int position = datas.indexOf(userInfo);
            adapter.notifyItemChanged(position);
        }
    }

    private void refreshArrowVisible() {
        rvSpectator.post(() -> {
            firstVisiblePos = linearLayoutManager.findFirstVisibleItemPosition();
            lastVisiblePos = linearLayoutManager.findLastVisibleItemPosition();

            ivArrowLeft.setVisibility(firstVisiblePos > 0 ? View.VISIBLE : View.GONE);
            ivArrowRight.setVisibility(lastVisiblePos == datas.size() - 1 ? View.GONE : View.VISIBLE);
        });
    }

    /**
     * @param isSuccess true 替换成功更新item,false替换失败显示原view
     */
    public void replace(String oldUserId, String newUserId, boolean isSuccess) {
        MeetingUserInfo userInfo = getUser(oldUserId);
        if (null != userInfo) {
            int position = getUserPosition(oldUserId);
            userInfo.setVisible(true);
            if (isSuccess) {
                userInfo.setUserId(newUserId);
                userInfo.setName(MeetingManager.getInstance().getUser(newUserId).getName());
                userInfo.setAvatarUrl(MeetingManager.getInstance().getUser(newUserId).getAvatarUrl());
            }

            adapter.notifyItemChanged(position);
        }
    }

    public boolean isExistUser(String userId) {
        for (int i = 0; i < datas.size(); i++) {
            if (userId.equals(datas.get(i).getUserId())) {
                return true;
            }
        }
        return false;
    }

    public MeetingUserInfo getUser(String userId) {
        for (int i = 0; i < datas.size(); i++) {
            if (userId.equals(datas.get(i).getUserId())) {
                return datas.get(i);
            }
        }
        return null;
    }

    public int getUserPosition(String userId) {
        for (int i = 0; i < datas.size(); i++) {
            if (userId.equals(datas.get(i).getUserId())) {
                return i;
            }
        }
        return -1;
    }

    public List<MeetingUserInfo> getData() {
        return datas;
    }

    //设置在讲话的用户样式
    public void setActiveVoice(String userId, boolean isMaxVoice) {
        if (isMaxVoice) {
            for (int i = 0; i < datas.size(); i++) {
                datas.get(i).setMaxVoice(userId.equals(datas.get(i).getUserId()));
            }
        } else {
            for (int i = 0; i < datas.size(); i++) {
                datas.get(i).setMaxVoice(false);
            }
        }
        adapter.notifyDataSetChanged();
    }

    public void setOnItemLongClickListener(OnItemLongClickListener listener) {
        this.listener = listener;
    }

    public interface OnItemLongClickListener {
        void onItemLongClick(View view, String userId, int x, int y);
    }
}