android高仿微信聊天消息列表自由復(fù)制文字变丧,雙擊查看文本內(nèi)容

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)容效果
gif4.gif
gif3.gif
消息頁(yè)全選 消息頁(yè)自由復(fù)制放大鏡
demo_1.jpg
demo_2.jpg
消息頁(yè)選中文本 查看內(nèi)容
demo_3.jpg
demo_4.jpg

特點(diǎn)功能:

  • 支持自由選擇文本
  • 支持自定義文本有:游標(biāo)顏色、游標(biāo)大小霍转、選中文本顏色
  • 支持默認(rèn)全選文字或選2個(gè)文字
  • 支持滑動(dòng)依然顯示彈窗
  • 支持放大鏡功能
  • 支持全選情況下自定義彈窗
  • 支持操作彈窗:每行個(gè)數(shù)荐绝、圖片、文字避消、監(jiān)聽回調(diào)低滩、彈窗顏色、箭頭圖片
  • 支持 AndroidX

Demo

下載 APK-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)用SelectTextHelperreset()即可。
@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類特別說明曲梗、原理:
    SelectTextEventBusEventBus基礎(chǔ)上加功能。在register時(shí)記錄下類和方法妓忍,方便在Activity/Fragment Destroy時(shí)unregister所有SelectTextEventBusEventBus虏两。

  • 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();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末世剖,一起剝皮案震驚了整個(gè)濱河市定罢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旁瘫,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異僵蛛,居然都是意外死亡红柱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門宁仔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稠屠,“玉大人,你說我怎么就攤上這事翎苫∪ú海” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵拉队,是天一觀的道長(zhǎng)弊知。 經(jīng)常有香客問我,道長(zhǎng)粱快,這世上最難降的妖魔是什么秩彤? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮事哭,結(jié)果婚禮上漫雷,老公的妹妹穿的比我還像新娘。我一直安慰自己鳍咱,他們只是感情好降盹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谤辜,像睡著了一般蓄坏。 火紅的嫁衣襯著肌膚如雪价捧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天涡戳,我揣著相機(jī)與錄音结蟋,去河邊找鬼。 笑死渔彰,一個(gè)胖子當(dāng)著我的面吹牛嵌屎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播恍涂,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼宝惰,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了再沧?” 一聲冷哼從身側(cè)響起尼夺,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎炒瘸,沒想到半個(gè)月后汞斧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡什燕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年粘勒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屎即。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡庙睡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出技俐,到底是詐尸還是另有隱情乘陪,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布雕擂,位于F島的核電站啡邑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏井赌。R本人自食惡果不足惜谤逼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望仇穗。 院中可真熱鬧流部,春花似錦、人聲如沸纹坐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至果漾,卻和暖如春球切,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绒障。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工欧聘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人端盆。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像费封,于是被迫代替她去往敵國(guó)和親焕妙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容