SelectTextHelper-高仿微信聊天消息列表自由復(fù)制文字贩挣,雙擊查看文本內(nèi)容
掘金地址 github地址
SelectTextHelper
打造一個(gè)全網(wǎng)最逼近微信聊天消息自由復(fù)制豁辉,雙擊查看文本內(nèi)容框架阳柔。 匯聚底層TextView
框架焰枢、原理并加以整理得出的一個(gè)實(shí)用的Helper
。
僅用兩個(gè)類實(shí)現(xiàn)便實(shí)現(xiàn)如此強(qiáng)大的功能舌剂,用法也超級(jí)簡(jiǎn)單济锄。
[圖片上傳失敗...(image-5fe91b-1631947452195)]
項(xiàng)目演示
消息頁(yè)效果 | 查看內(nèi)容效果 |
---|---|
消息頁(yè)全選 | 消息頁(yè)自由復(fù)制放大鏡 |
---|---|
消息頁(yè)選中文本 | 查看內(nèi)容 |
---|---|
特點(diǎn)功能:
- 支持自由選擇文本
- 支持自定義文本有:游標(biāo)顏色、游標(biāo)大小霍转、選中文本顏色
- 支持默認(rèn)全選文字或選2個(gè)文字
- 支持滑動(dòng)依然顯示彈窗
- 支持放大鏡功能
- 支持全選情況下自定義彈窗
- 支持操作彈窗:每行個(gè)數(shù)荐绝、圖片、文字避消、監(jiān)聽回調(diào)低滩、彈窗顏色、箭頭圖片
- 支持 AndroidX
Demo
如何添加
Gradle添加:
1.在Project的build.gradle
中添加倉(cāng)庫(kù)地址
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
2.在Module目錄下的build.gradle
中添加依賴
[圖片上傳失敗...(image-2ccdc7-1631947452196)]
dependencies {
implementation 'com.github.ITxiaoguang:SelectTextHelper:xxx'
}
傳送門
主要實(shí)現(xiàn)
通過 仿照的例子 并改進(jìn)彈窗坐標(biāo)位置岩喷、大小加上EventBus
實(shí)現(xiàn)
簡(jiǎn)單用例
1.導(dǎo)入代碼
把該項(xiàng)目里的selecttext Module
放入你的項(xiàng)目里面 或者 按照Gradle
添加的步驟導(dǎo)入依賴恕沫。
2.給你的TextView
創(chuàng)建Helper
和加監(jiān)聽
SelectTextHelper mSelectableTextHelper=new SelectTextHelper
.Builder(textView)// 放你的textView到這里!纱意!
.setCursorHandleColor(0xFF1379D6/*mContext.getResources().getColor(R.color.colorAccent)*/)// 游標(biāo)顏色 default 0xFF1379D6
.setCursorHandleSizeInDp(24)// 游標(biāo)大小 單位dp default 24
.setSelectedColor(0xFFAFE1F4/*mContext.getResources().getColor(R.color.colorAccentTransparent)*/)// 選中文本的顏色 default 0xFFAFE1F4
.setSelectAll(true)// 初次選中是否全選 default true
.setScrollShow(true)// 滾動(dòng)時(shí)是否繼續(xù)顯示 default true
.setSelectedAllNoPop(true)// 已經(jīng)全選無彈窗婶溯,設(shè)置了true在監(jiān)聽會(huì)回調(diào) onSelectAllShowCustomPop 方法 default false
.setMagnifierShow(true)// 放大鏡 default true
.setPopSpanCount(5)// 設(shè)置操作彈窗每行個(gè)數(shù) default 5
.setPopStyle(R.drawable.shape_color_4c4c4c_radius_8/*操作彈窗背*/, R.drawable.ic_arrow/*箭頭圖片*/)// 設(shè)置操作彈窗背景色、箭頭圖片
.addItem(0/*item的圖標(biāo)*/,"復(fù)制"/*item的描述*/, // 操作彈窗的每個(gè)item
()->Log.i("SelectTextHelper","復(fù)制")/*item的回調(diào)*/)
.build();
mSelectableTextHelper.setSelectListener(new SelectTextHelper.OnSelectListener(){
/**
* 點(diǎn)擊回調(diào)
*/
@Override
public void onClick(View v){
// clickTextView(textView.getText().toString().trim());
}
/**
* 長(zhǎng)按回調(diào)
*/
@Override
public void onLongClick(View v){
// postShowCustomPop(SHOW_DELAY);
}
/**
* 選中文本回調(diào)
*/
@Override
public void onTextSelected(CharSequence content){
// selectedText = content.toString();
}
/**
* 彈窗關(guān)閉回調(diào)
*/
@Override
public void onDismiss(){
}
/**
* 點(diǎn)擊TextView里的url回調(diào)
*/
@Override
public void onClickUrl(String url){
}
/**
* 全選顯示自定義彈窗回調(diào)
*/
@Override
public void onSelectAllShowCustomPop(){
// postShowCustomPop(SHOW_DELAY);
}
/**
* 重置回調(diào)
*/
@Override
public void onReset(){
// SelectTextEventBus.getDefault().dispatch(new SelectTextEvent("dismissOperatePop"));
}
/**
* 解除自定義彈窗回調(diào)
*/
@Override
public void onDismissCustomPop(){
// SelectTextEventBus.getDefault().dispatch(new SelectTextEvent("dismissOperatePop"));
}
/**
* 是否正在滾動(dòng)回調(diào)
*/
@Override
public void onScrolling(){
// removeShowSelectView();
}
});
3.demo中提供了查看文本內(nèi)容的SelectTextDialog
和 消息列表自由復(fù)制MainActivity
查看文本內(nèi)容方法:
- 該方法比較簡(jiǎn)單,將
textView
參照步驟2放入SelectTextHelper
中爬虱,在dismiss
調(diào)用SelectTextHelper
的reset()
即可。
@Override
public void dismiss(){
mSelectableTextHelper.reset();
super.dismiss();
}
高仿微信聊天消息列表自由復(fù)制方法:
recycleView
+adapter
+ 多布局的使用在這里不闡述腾它,請(qǐng)看本項(xiàng)目demo跑筝。為
adapter
里text類型ViewHolder
中的textView
參照步驟2放入SelectTextHelper
中,注冊(cè)SelectTextEventBus
瞒滴。SelectTextEventBus
類特別說明曲梗、原理:
SelectTextEventBus
在EventBus
基礎(chǔ)上加功能。在register
時(shí)記錄下類和方法妓忍,方便在Activity/Fragment Destroy
時(shí)unregister
所有SelectTextEventBus
的EventBus
虏两。text類型
ViewHolder
添加EventBus
監(jiān)聽
/**
* 自定義SelectTextEvent 隱藏 光標(biāo)
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void handleSelector(SelectTextEvent event){
if(null==mSelectableTextHelper){
return;
}
String type=event.getType();
if(TextUtils.isEmpty(type)){
return;
}
switch(type){
case"dismissAllPop":
mSelectableTextHelper.reset();
break;
case"dismissAllPopDelayed":
postReset(RESET_DELAY);
break;
}
}
- 重寫
adapter
里的onViewRecycled
方法,該方法在回收View
時(shí)調(diào)用
@Override
public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder){
super.onViewRecycled(holder);
if(holder instanceof ViewHolderText){
// 注銷
SelectTextEventBus.getDefault().unregister(holder);
}
}
- 防抖
/**
* 延遲顯示CustomPop
* 防抖
*/
private void postShowCustomPop(int duration){
textView.removeCallbacks(mShowCustomPopRunnable);
textView.postDelayed(mShowCustomPopRunnable,duration);
}
private final Runnable mShowCustomPopRunnable=
()->showCustomPop(text_rl_container,textMsgBean);
/**
* 延遲重置
* 為了支持滑動(dòng)不重置
*/
private void postReset(int duration){
textView.removeCallbacks(mShowSelectViewRunnable);
textView.postDelayed(mShowSelectViewRunnable,duration);
}
private void removeShowSelectView(){
textView.removeCallbacks(mShowSelectViewRunnable);
}
private final Runnable mShowSelectViewRunnable=
()->mSelectableTextHelper.reset();