升级指南
如果您的项目中集成了BQMM的v1.x版本,在升级到v2.1时会需要对代码进行一些额外的修改。本指南列出了v2.1在集成步骤上与v1.x的不同之处,以供参考。
增加新的Activity
这个版本新增了作者主页功能,可以方便用户查找和下载某一个作者名下的表情包。作者主页是一个新的Activity,需要在AndroidManifest中进行注册。
AndroidManifest.xml
<application>
<activity
android:name="com.melink.bqmmsdk.ui.store.AuthorDetail"
android:screenOrientation="portrait" />
</application>
增加搜索弹窗
1. 引入代码
BQMM在v2.0版本加入了Gif搜索功能,并实现了一个新的搜索弹窗,取代v1.x的联想弹窗。为了方便定制,搜索弹窗以源代码的形式被放在了Demo中,您需要将其拷贝到自己的项目中去。
搜索弹窗的代码一般被放在名为“bqmmgif”的包下。以简单Demo为例,在项目中找到com.siyanhui.mojif.demo.bqmmgif包(路径为/src/com/siyanhui/mojif/demo/bqmmgif/ ),可以看到其中包含四个文件:
BQMMGifManager.java
BQMMSearchContentAdapter.java
BQMMSearchPopupWindow.java
IBqmmSendGifListener.java
将这个包复制到自己项目的代码树中去,并且(如果包路径和Demo中不一样的话)修改一下上述四个java文件头部的包名信息,即可完成代码的引入。
2. 实现搜索功能
上一步引入的四个文件实现的功能可以分为三块:
- 搜索弹窗UI(BQMMSearchPopupWindow.java、BQMMSearchContentAdapter.java)
- 发送表情回调(IBqmmSendGifListener.java)
- 弹窗的收放、翻页、点击项目等操作(BQMMGifManager.java)
前两块如果没有定制需求可以不用关心,而第三块功能,即BQMMGifManager
这个类提供了一些函数,需要在向BQMM注册键盘时调用。
final BQMM bqmm = BQMM.getInstance();
final BQMMGifManager bqmmGifManager = BQMMGifManager.getInstance();
//注册键盘的同时需要传入一个回调。v2.x在表情键盘上增加了一个GIF按钮,在该按钮被点击后传入的回调就会被调用。我们在回调中隐藏表情键盘并显示搜索弹窗。
bqmm.setKeyboard(emoticonPickerView, new IGifButtonClickListener() {
@Override
public void didClickGifTab() {
emoticonPickerView.hideKeyboard();
showInputMethod(messageEditText);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
bqmmGifManager.showTrending();
}
}, 500);
}
});
//增加一些监听,在合适的时机自动关闭弹窗。具体逻辑请参考代码。
bqmmGifManager.addEditViewListeners();
3. 实现Gif表情的封装与发送
Gif表情是一种新的表情,需要新增一些代码进行封装和发送。需要封装进消息的字段一共有五个,缺一不可:
- ID
- 高度
- 宽度
- 图片URL
- 是否为Gif图片
bqmmGifManager.setBQMMSendGifListener(new IBqmmSendGifListener() {
@Override
public void onSendBQMMGif(BQMMGif bqmmGif) {
org.json.JSONObject gifJsonObject = new org.json.JSONObject();
try {
gifJsonObject.put("data_id", bqmmGif.getSticker_id());
gifJsonObject.put("h", bqmmGif.getSticker_height());
gifJsonObject.put("w", bqmmGif.getSticker_width());
gifJsonObject.put("sticker_url", bqmmGif.getSticker_url());
gifJsonObject.put("is_gif", bqmmGif.getIs_gif());
} catch (JSONException e) {
e.printStackTrace();
}
HashMap<String, Object> params = new HashMap<>();
params.put(BQMMConstants.BQMM_MSG_TYPE, BQMMConstants.BQMM_MSG_TYPE_GIF);
params.put(BQMMConstants.BQMM_MSG_DATA, gifJsonObject);
//TODO: params中已经封装好了Gif表情的所有信息,在具体项目中需要调用通信SDK的对应方法进行发送。
}
});
4. 实现Gif表情的解析和展示
解析的过程和封装是对应的,这里不再赘述。将五个字段取出之后,我们可以用BQMMMessageText
将它展示出来:
//bqmmMessageText为UI中的BQMMMessageText示例
//data_id、sticker_url、w、h、is_gif为从消息中解析出的对应字段
bqmmMessageText.showBQMMGif(data_id, sticker_url, w, h, is_gif);
定制消息样式
BQMMMessageText
这个控件原先继承的是TextView
,如今改成了FrameLayout
,这会影响到对消息样式的定制。如果您之前在布局xml中指定过这个控件的android:textColor
、android:textSize
等属性的话,升级之后会发现这些属性失效了。
在新版中,如果要定制消息文本的样式,目前有几种方法:
- 修改style:在
BQMM_Lib
模块的res
文件夹中有一个styles.xml,在这一版本增加了名为BQMMMessageText
的style。原先在xml中对TextView
指定的属性可以被移动到这里。在这个style中的属性会对所有的BQMMMessageText
生效。 - 在构造函数中传入style:与上一个方法类似,只是style改用
BQMMMessageText(@NonNull Context context, @StyleRes int textStyle)
这个构造函数指定。 - 用代码设置:
BQMMMessageText
实现了setTextColor
、setMaxWidth
等几个函数,以方便开发者用代码设置常用的样式。