美文网首页
接入融云IM-自定义礼物消息

接入融云IM-自定义礼物消息

作者: 你的益达233 | 来源:发表于2022-05-07 10:07 被阅读0次

一、前言

社交软件,在聊天中送礼物很常见吧。相亲交友类,更是必备。

二、效果图

礼物消息.png

三、解决思路

仔细看效果图,这比普通的自定义消息要复杂些,它没有显示发送方的头像,发送方和接收方看到的礼物消息都是在中间。通过“送出礼物”和“收到礼物”的文案来区分是谁发送的。
不用头像,显示在中间做下如下配置:

 init {
    mConfig.showPortrait = false
    mConfig.centerInHorizontal = true
}

判断谁发送的,可以在消息体里面定义个用户id

viewHolder.setText(R.id.tv_gift_status,if (customizeGiftsMessage.sendUserId == SPUtil.getUserId()){
                viewHolder.context.getString(R.string.send_gift)
            } else {
                viewHolder.context.getString(R.string.receive_gift)
            })

四、给下消息体和Provider参考(正常你们业务没这么复杂的)

CustomizeGiftsMessage

@MessageTag(value = "customize_gift_message", flag = MessageTag.ISPERSISTED | MessageTag.ISCOUNTED)
public class CustomizeGiftsMessage extends MessageContent {


    private String giftImg;
    
    private String giftTip;
    private String giftName;
    private int giftNum;
    
    private int giftType = 0;
    private int sendUserId ; //发送者的用户id,不是融云的id
    //系统心动礼物
    public static int SYSTEM_LOVE_GIFT_TYPE = 1;
    //普通礼物
    public static int NORMAL_GIFT_TYPE = 0;
     //普通的心动礼物
    public static int NORMAL_LOVE_GIFT_TYPE = 2;
    private String msgUid = ""; //自己app服务器建的,不是融云的消息的uid
    
    public CustomizeGiftsMessage(String giftImg,String giftName,String giftTip,int giftNum,int giftType,int sendUserId){
        this.giftImg = giftImg;
        this.giftName = giftName;
        this.giftNum = giftNum;
        this.giftType = giftType;
        this.sendUserId = sendUserId;
        this.giftTip = giftTip;
    }

    public String getGiftImg() {
        return giftImg;
    }

    public void setGiftImg(String giftImg) {
        this.giftImg = giftImg;
    }

    public String getGiftName() {
        return giftName;
    }

    public void setGiftName(String giftName) {
        this.giftName = giftName;
    }

    public int getGiftNum() {
        return giftNum;
    }

    public void setGiftNum(int giftNum) {
        this.giftNum = giftNum;
    }

    public int getGiftType() {
        return giftType;
    }

    public void setGiftType(int giftType) {
        this.giftType = giftType;
    }

    public int getSendUserId() {
        return sendUserId;
    }

    public void setSendUserId(int sendUserId) {
        this.sendUserId = sendUserId;
    }

    public String getGiftTip() {
        return giftTip;
    }

    public void setGiftTip(String giftTip) {
        this.giftTip = giftTip;
    }

    public String getMsgUid() {
        return msgUid;
    }

    public void setMsgUid(String msgUid) {
        this.msgUid = msgUid;
    }

    @Override
    public byte[] encode() {
        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject.put("giftImg",getGiftImg());
            jsonObject.put("giftName",getGiftName());
            jsonObject.put("giftTip",getGiftTip());
            jsonObject.put("giftNum",getGiftNum());
            jsonObject.put("giftType",getGiftType());
            jsonObject.put("sendUserId",getSendUserId());
            jsonObject.put("msgUid",getMsgUid());
        } catch (JSONException e) {
            e.printStackTrace();
        }
        try{
            return jsonObject.toString().getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }

    public CustomizeGiftsMessage(byte [] data){
        String str = null ;
        try{
            str = new String(data,"UTF-8") ;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        try{
            JSONObject json = new JSONObject(str);
            if(json.has("giftImg")){
                giftImg = json.optString("giftImg");
            }
            if(json.has("giftName")){
                giftName = json.optString("giftName");
            }
            if(json.has("giftTip")){
                giftTip = json.optString("giftTip");
            }
            if(json.has("giftNum")){
                giftNum = json.optInt("giftNum");
            }
            if(json.has("giftType")){
                giftType = json.optInt("giftType");
            }
            if(json.has("sendUserId")){
                sendUserId = json.optInt("sendUserId");
            }
            if(json.has("msgUid")){
                msgUid = json.optString("msgUid");
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }


    public CustomizeGiftsMessage(Parcel in){
        this.giftImg = ParcelUtils.readFromParcel(in);
        this.giftName = ParcelUtils.readFromParcel(in);
        this.giftTip = ParcelUtils.readFromParcel(in);
        this.giftNum = ParcelUtils.readIntFromParcel(in);
        this.giftType = ParcelUtils.readIntFromParcel(in);
        this.sendUserId = ParcelUtils.readIntFromParcel(in);
        this.msgUid = ParcelUtils.readFromParcel(in);
    }

    public static final Creator<CustomizeGiftsMessage> CREATOR = new Creator<CustomizeGiftsMessage>() {
        @Override
        public CustomizeGiftsMessage createFromParcel(Parcel parcel) {
            return new CustomizeGiftsMessage(parcel);
        }

        @Override
        public CustomizeGiftsMessage[] newArray(int i) {
            return new CustomizeGiftsMessage[i];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        ParcelUtils.writeToParcel(parcel,giftImg);
        ParcelUtils.writeToParcel(parcel,giftName);
        ParcelUtils.writeToParcel(parcel,giftTip);
        ParcelUtils.writeToParcel(parcel,giftNum);
        ParcelUtils.writeToParcel(parcel,giftType);
        ParcelUtils.writeToParcel(parcel,sendUserId);
        ParcelUtils.writeToParcel(parcel,msgUid);
    }}

CustomizeGiftsMessageProvider

class CustomizeGiftsMessageProvider: BaseMessageItemProvider<CustomizeGiftsMessage>() {

init {
    mConfig.showPortrait = false
    mConfig.centerInHorizontal = true
}

companion object{
    //2022年5月6日10:16:14改为用SP存,这样第二次打开app看到和上次一样,而不是变为了“发出心动礼物”
    //确认被收下的心动礼物,用于处理外面列表的显示,外面列表刷新就会重新走getSummarySpannable
    //expireUidList,noReceivedGiftUidList记录的是上次点进去会话的列表,单纯依靠它判断就会有重复问题
    //var sureReceivedGiftUidList:MutableList<String> = mutableListOf()
    //确认被退回的心动礼物
    //var sureBackGiftUidList:MutableList<String> = mutableListOf()

}

override fun getSummarySpannable(context: Context, p1: CustomizeGiftsMessage): Spannable {
    if (p1.sendUserId == SPUtil.getUserId()){
        //发送方外面显示什么
        return if (p1.giftType == CustomizeGiftsMessage.SYSTEM_LOVE_GIFT_TYPE ){
            //系统心动礼物,也可能是匹配礼物
            var outContentStr = p1.giftTip
            if (p1.giftTip == context.getString(R.string.send_love_gift)){
                if (!SPUtil.getList<String>("sureBackGiftUidList").isNullOrEmpty() && SPUtil.getList<String>("sureBackGiftUidList").contains(p1.msgUid)){
                    outContentStr = context.getString(R.string.love_gift_return_back)
                } else {
                    if (!SPUtil.getList<String>("sureReceivedGiftUidList").isNullOrEmpty() && SPUtil.getList<String>("sureReceivedGiftUidList").contains(p1.msgUid)){
                        outContentStr = context.getString(R.string.send_love_gift_received)
                    }
                }
            }
            SpannableString(outContentStr)
        } else if (p1.giftType ==CustomizeGiftsMessage.NORMAL_LOVE_GIFT_TYPE) {
            SpannableString(context.getString(R.string.send_love_gift_received))
        } else{
            SpannableString(String.format(context.getString(R.string.gift_send_three_tip),p1.giftName,p1.giftNum))
        }
    } else {
        return if (p1.giftType == CustomizeGiftsMessage.SYSTEM_LOVE_GIFT_TYPE ){
            //心动礼物
            SpannableString(context.getString(R.string.gift_send_four_tip))
        } else if (p1.giftType ==CustomizeGiftsMessage.NORMAL_LOVE_GIFT_TYPE){
            SpannableString(context.getString(R.string.gift_send_four_tip_2))
        } else{
            SpannableString(String.format(context.getString(R.string.gift_send_five_tip),p1.giftName,p1.giftNum))
        }
    }

}

override fun onCreateMessageContentViewHolder(parent: ViewGroup, p1: Int): ViewHolder {
    val rootView: View =
        LayoutInflater.from(parent.context).inflate(R.layout.rc_my_gift_item, parent, false)
    ShapeUtils.setShapeCorner2Color(
        rootView,
        parent.context.resources.getColor(R.color.white),
        dp2px(parent.context, 6).toFloat()
    )
    return ViewHolder(parent.context,rootView)
}

override fun bindMessageContentViewHolder(
    viewHolder: ViewHolder,
    parentHolder: ViewHolder,
    customizeGiftsMessage: CustomizeGiftsMessage,
    p3: UiMessage?,
    p4: Int,
    p5: MutableList<UiMessage>?,
    p6: IViewProviderListener<UiMessage>?
) {
    //Log.i("giftImg",customizeGiftsMessage.giftImg)
    LogUtils.i("SummarySpannable3","SummarySpannable3")
    ImageLoader.loadCover(viewHolder.getView(R.id.iv_gift),customizeGiftsMessage.giftImg)
    viewHolder.setText(R.id.tv_gift_name,"【${customizeGiftsMessage.giftName}】x${customizeGiftsMessage.giftNum}")
    viewHolder.setTextColor(R.id.tv_gift_status,viewHolder.context.getColors(R.color.black))
    viewHolder.getView<TextView>(R.id.tv_gift_status).setCompoundDrawablesWithIntrinsicBounds(null,null,null,null)
    when (customizeGiftsMessage.giftType) {
        CustomizeGiftsMessage.NORMAL_GIFT_TYPE -> {
            viewHolder.setText(R.id.tv_gift_status,if (customizeGiftsMessage.sendUserId == SPUtil.getUserId()){
                viewHolder.context.getString(R.string.send_gift)
            } else {
                viewHolder.context.getString(R.string.receive_gift)
            })
        }
        CustomizeGiftsMessage.NORMAL_LOVE_GIFT_TYPE -> {
            if (customizeGiftsMessage.sendUserId == SPUtil.getUserId()){
                viewHolder.setText(R.id.tv_gift_status,viewHolder.context.getString(R.string.send_love_gift_received))
                viewHolder.getView<TextView>(R.id.tv_gift_status).setCompoundDrawablesWithIntrinsicBounds(null,null,viewHolder.context.getDrawables(R.mipmap.ic_gift_received_tag),null)
            } else {
                viewHolder.setText(R.id.tv_gift_status,viewHolder.context.getString(R.string.receive_love_gift))
            }
        }
        CustomizeGiftsMessage.SYSTEM_LOVE_GIFT_TYPE -> {
            if (customizeGiftsMessage.giftTip == viewHolder.context.getString(R.string.send_love_gift)){
                if (!expireUidList.isNullOrEmpty() && expireUidList!!.contains(customizeGiftsMessage.msgUid)){
                    viewHolder.setText(R.id.tv_gift_status,viewHolder.context.getString(R.string.love_gift_return_back))
                    viewHolder.setTextColor(R.id.tv_gift_status,viewHolder.context.getColors(R.color.color_AEAEB2))
                    val sureBackGiftUidList = if (SPUtil.getList<String>("sureBackGiftUidList").isNullOrEmpty()){
                         mutableListOf<String>()
                    } else {
                         SPUtil.getList<String>("sureBackGiftUidList")
                    }
                    sureBackGiftUidList.add(customizeGiftsMessage.msgUid)
                    SPUtil.putList("sureBackGiftUidList",sureBackGiftUidList)

                } else {
                    if (!unreceivedGiftUidList.isNullOrEmpty() && unreceivedGiftUidList!!.contains(customizeGiftsMessage.msgUid)){
                        viewHolder.setText(R.id.tv_gift_status,customizeGiftsMessage.giftTip)
                    } else {
                        viewHolder.setText(R.id.tv_gift_status,viewHolder.context.getString(R.string.send_love_gift_received))
                        viewHolder.getView<TextView>(R.id.tv_gift_status).setCompoundDrawablesWithIntrinsicBounds(null,null,viewHolder.context.getDrawables(R.mipmap.ic_gift_received_tag),null)
                        val sureReceivedGiftUidList =  if (SPUtil.getList<String>("sureReceivedGiftUidList").isNullOrEmpty()){
                            mutableListOf<String>()
                        } else {
                           SPUtil.getList<String>("sureReceivedGiftUidList")
                        }
                        sureReceivedGiftUidList.add(customizeGiftsMessage.msgUid)
                        SPUtil.putList("sureReceivedGiftUidList",sureReceivedGiftUidList)
                    }

                }


            } else {
                viewHolder.setText(R.id.tv_gift_status,customizeGiftsMessage.giftTip)
            }

        }
        else -> {
            viewHolder.setText(R.id.tv_gift_status,viewHolder.context.getString(R.string.gift))
        }
    }
}

override fun onItemClick(
    p0: ViewHolder?,
    p1: CustomizeGiftsMessage?,
    p2: UiMessage?,
    p3: Int,
    p4: MutableList<UiMessage>?,
    p5: IViewProviderListener<UiMessage>?
): Boolean {
    return true
}

override fun isMessageViewType(p0: MessageContent): Boolean {
    return p0 is CustomizeGiftsMessage
}}

记得别忘了注册自定义消息和模板。
如果融云自定义消息方面有问题的,都可以私信我

相关文章

网友评论

      本文标题:接入融云IM-自定义礼物消息

      本文链接:https://www.haomeiwen.com/subject/fewturtx.html