安卓文本編輯器php cpp,用安卓原生控件封裝一個簡易的富文本編輯器

最近接到項目需求:移動端原生寫一個富文本編輯器。? ? ? ? ( ⊙ o ⊙ )從沒遇到過富文本要用原生寫的,然后就查閱各種資料。然后結合自己的思路:其實安卓的富文本編輯器就是一個 “容器”。

那么接下來我就帶給大家說一說我自定義這個富文本編輯器的思路與實現過程。

·經過查閱資料之后發現:安卓的富文本編輯器就是一個容器,在用戶對這個編輯器中的子控件進行操作的時候對這么多的子控件進行控制。 這就是一個簡易的富文本編輯器。

1.安卓有一個控件叫做scrollview,這個控件是一個自動擴容并且可以滑動的控件,既然是富文本編輯器,肯定少不了這個。(編輯器中所有的操作都用在這個容器中)

2.緊接著,根據需求得知:我們原生的富文本編輯器里需要輸入文字和插入圖片,邏輯僅此而已。但是,圖片的右上角需要有一個小叉號,用于刪除此張圖片。那么就先來封裝這個小控件。

f49a19eda39404239430ddc5cf266348.png

正如大家所見:封裝一個相對布局,圖片居中顯示,自適應大小,然后在布局的右上角有一個叉號, 那么這個叉號的點擊事件就用來處理這個控件的增加和刪除。

3.準備工作做好了,接下來就開始封裝和處理邏輯。

在封裝之前,我們想想需要處理的邏輯和可能遇到的情況:

在初始化這個編輯器之前,我們需要有一個默認的輸入框,讓用戶可以編輯。

用戶編輯的過程中需要注意兩個地方,用戶編輯完一段文字后需要添加一張圖片,正常在容器中添加即可;如果用戶將光標指在一段文本的中間,那么則需要判斷這個光標的位置,然后將文本框中的文字分離,緊接著在分離的文字中間插入圖片,然后在圖片下面再插入一個文本框,并且將分離完的后半部分文字添加在輸入框中。這么以來就完成了圖片添加的部分邏輯。

再來說,圖片刪除的邏輯: 如果用戶點擊右上角刪除圖片,那就將整個封裝的控件刪除;再次判斷如果圖片上下都是輸入框,就合并這兩個輸入框。

清楚了大致邏輯之后,我們開始封裝這個所謂的富文本編輯器。

一、繼承scrollview,封裝一個自定義組件,并且將需要的組件與變量初始化。(直接上代碼)

初始化變量及其構造方法。

2cbee079629801dea8f346fe18e65972.png

在其構造方法中加入出初始化控件時所有需要的子控件,還有子控件的初始化及其監聽。

302c3d6a88e79d7b9775b3f9bf96351b.png

437f56f02eb08322c81d368525bce4c3.png

41da6d3a7ac4a42fe7c14e583cd87890.png

以上就是初始化控件之后的一些基本操作,大致意思如下:

1)創建編輯器中的第一個文本輸入框Edittext,并且設置其屬性,還有監聽。這個監聽有兩個,一個是獲取焦點的監聽,一個是輸入文本內容的監聽。

在輸入框獲取到焦點的時候,需要將默認文字設置成空(產品需求);還有另一個需求就是文本框內不允許輸入表情,對于表情android有一套算法,這個算法大概是判斷這個文本的占字節數,如果輸入的文本中有發現類似的敏感字,就直接刪除這個表情,并且提示用戶“暫不支持輸入表情”。再有就是監聽當前光標的位置,然后對退格鍵進行監聽。在代碼中都有注釋寫到的。后續會粘貼出來代碼。

2)然后就是對動畫的一個初始化,如果用戶刪除掉圖片之后,直接讓圖片消失會顯得很突然,所以我們在其中加入一個動畫,來讓用戶感覺這一個過程不是那么突然,那么粗暴。

-----------------------------------------------------------來一條分割線------------------------------------------------------------

以上是一個簡單的初始化,你們一定覺得有點亂,我也覺得有點亂。因為這個容器里面需要做的操作太多了。[流淚]

二、來解析一下當中的邏輯

1)首先看看插入圖片的邏輯

首先初始化好這個圖片的布局,并且給圖片相應的資源。為了后面取值,每一個圖片給一個tag標簽,這個標簽的值就是這個圖片加載的url地址。

ff102b8dab9fe2271a24397d7502a0ba.png

其次,要確定這個圖片插入的位置,如下代碼:

4f72f4f991bde7633ad20a5e07097fff.png

容器是從上往下添加的,那么添加的時候需要注意光標的位置;如果輸入框的內容為空,或者光標頂在了輸入框的最前面,那就直接添加一個輸入框和一張圖片;這么以來,就有了一個大編輯器的感覺。? 如果這個光標不是在最前面,并且里面還有內容,那就截取光標前后的內容,將光標后面的內容,設置到下面的輸入框中,然后再在這兩個輸入框中間添加圖片。? 結束完這個操作之后,要判斷默認的提示文字要不要顯示并且隱藏鍵盤。(后續會講解這個默認文字要不要顯示的方法)

在這里貼上添加Edittext的方法:

29064f34a78525777ffb9719c659345d.png

最難的邏輯已經分析完了,,,接下來開始處理這個默認文字的顯示與隱藏。

2)默認文字的顯示與隱藏

這個問題也苦苦調了一段時間,因為如果用戶一進來就添加圖片,這個時候默認文字也還會顯示,這個原因是:android EditText中的屬性是判斷這個輸入框中有沒有內容,如果有內容才會消失這個默認文字,在這個過程中還遇到一個問題:如果默認文字太多,他自行換行了,那么就會填充這個輸入框的高度,用戶體驗自然就不好了。? 那么在默認文字的處理中,如下:

8b69b86ba4d284601ae22faaf5817f27.png

先給第一個輸入框一個tag,這個是第一個默認的,這個也有可能被頂下去,然后可能被刪除。? ?焦點監聽:如果有焦點了,就直接把他的默認文字給去掉;如果沒有焦點,判斷這個容器中是否只有這么一個控件,如果是的話就繼續判斷 :有焦點就去掉默認提示文字,沒有焦點就設置相關默認提示文字; 如果還有其他控件,就走方法里的判斷。代碼如下:

53a440331df7f76f518688cdc1fc8581.png

如果只有一個控件的話,就判斷是不是第一個默認的輸入框,是的話就不作處理,不是的話就對其做焦點監聽。如果還有其他控件的話,就直接把所有的輸入框的 默認提示文字給設置為空。這樣一來所有子控件全部正常了。

每次處理完退格的時候都必須這么判斷一下,因為要監聽容器中的最后一個輸入框的狀態,才能判斷這個默認文字顯示還是隱藏。

------------------------------------------------------------------------------------------------------------------------------------------------------------------

這個富文本編輯器的主要邏輯大致就這么多。以下再來一小段代碼截圖:輸出數據的方法。

2ba94fbfe0ac37371b705d9307b619bf.png

將數據存到對象,然后存到集合中。 因為調試數據需要html代碼,然后進行轉換輸出:

516b6d518e39ac0129cc8e6ce7ac2015.png

代碼基本上就這么多。。。邏輯也梳理完了, 雖然比較亂吧,,但是都是必經的過程,如果有更好的修改意見,歡迎提出。

最后將View代碼附上。

這幾顯示可能有點亂,大家可以復制到AS或者eclipse上格式化后查看。本文章是修改了網上流行了某個富文本編輯器的改進版,如果侵犯請說明。 因為鏈接我忘了,,,

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533557.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533557.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533557.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python和nltk自然語言處理書評_Python和NLTK自然語言處理

模塊1 NLTK基礎知識第 1章 自然語言處理簡介 31.1 為什么要學習NLP 41.2 從Python的基本知識開始 71.2.1 列表 71.2.2 自助 81.2.3 正則表達式 91.2.4 詞典 111.2.5 編寫函數 111.3 NLTK 131.4 試一試 181.5 本章小結 18第 2章 文本的整理和清洗 192.…

vue tab切換_iviewUITabs選項卡切換組件

概述 選項卡切換組件,常用于平級區域大塊內容的的收納和展現。源碼地址:https://github.com/iview/iview/tree/2.0/src/components/tabs使用: 標簽一的內容標簽二的內容標簽三的內容標簽二的內容在源碼的tabs文件下有三個文件:ind…

java biginteger 比較大小,java – 打印非常大的BigIntegers

我試圖找出與Java 7 x64中的BigIntegers相關的以下問題.我試圖計算一個極高功率的數字.代碼如下,然后是問題描述.import java.math.BigInteger;public class main {public static void main(String[] args) {// Demo calculation; Desired calculation: BigInteger("4096&…

paypal創建訂單后怎么獲得id_5步創建Facebook商店(最新版教程)學習如何在Facebook上賣貨...

請按照以下步驟設置Facebook商店:步驟1:轉到您的Facebook頁面并配置Shop頁面。步驟2:設置您的商店詳細信息。步驟3:配置付款。步驟4:將產品添加到您的Facebook商店。步驟5:管理您的訂單。步驟6:…

php 網絡圖片 轉本地,PHP將Base64圖片轉換為本地圖片并保存

PHP將Base64圖片轉換為本地圖片并保存/*** [將Base64圖片轉換為本地圖片并保存]* param [Base64] $base64_image_content [要保存的Base64]* param [目錄] $path [要保存的路徑]*/function base64_image_content($base64_image_content,$path){//匹配出圖片的格式if (preg_matc…

創建索引名稱已由現有對象使用_Excel編程周末速成班第3課:Excel對象模型

學習Excel技術,關注微信公眾號:excelperfect導語:為了幫助想要快速學會Excel VBA的朋友,特以《Excel Programming Weekend Crash Course》這本書為基礎,開始整理一系列資料,在完美Excel社群上分享。一共有3…

php修改htpasswd,用來解析.htpasswd文件的PHP類

.htpasswd 文件示例:user1:{SHA}kGPaD671VNU0OU5lqLiN/h6Q6acuser2:{SHA}npMqPEX3kPQTox/ZckHDrIcQIuser3:{SHA}q1Fh2LTUjjkncp11m0M9WUH5Zrwclass Htpasswd {private $file ;private $salt AynlJ2H.74VEfI^BZElc-Vb6G0ezE9a55-Wj;private function write($pairs …

socket用起始碼分割_常用條碼Code128碼及EAN13碼的介紹

在條碼打印軟件中,設計條碼標簽時經常用到的碼制是Code128碼和EAN13碼。因為這兩種碼制比較貼近我們的生活。比如:我們去超市購物,商品上貼的條碼標簽都是EAN13碼,因為EAN13碼多用于零售產品包裝。而code128碼多用于工廠產線&…

matlab在c盤有緩存文件夾嗎,win10如何清除C盤緩存文件-win10清除C盤緩存的方法 - 河東軟件園...

在電腦的使用過程中我們會發現磁盤的容量會不斷減小,更多時候其他磁盤還有很多剩余空間,C盤的存儲空間就已經達到極限了。其實在系統的升級和軟件的下載中很多文件就會默認儲存在C盤,時間久了以后,C盤不僅有軟件文件,還…

php 驗證碼字體居中,自定義驗證碼圖片的寬高后文本垂直水平居中[帝國cms ShowKey.php]-網站程序網...

define(EmpireCMSAdmin,1);define(EmpireCMSAPage,login);define(EmpireCMSNFPage,1);require(../class/connect.php);//繪制居中文本, 對于GD的內置字體function pc_ImageStringCenter($image,$text,$font){//字體大小$width array(1>5,6,7,8,9);$height array(1>6,8,…

python中的常量可以修改嗎_深入理解Python變量與常量

變量是計算機內存中的一塊區域,變量可以存儲規定范圍內的值,而且值可以改變。基于變量的數據類型,解釋器會分配指定內存,并決定什么數據可以被存儲在內存中。常量是一塊只讀的內存區域,常量一旦被初始化就不能被改變。…

java方法體邏輯不會寫怎么辦,想自己寫框架?不會寫Java注解可不行

用注解一時爽,一直用一直爽Java后端開發進入spring全家桶時代后,開發一個微服務提供簡單的增刪改查接口跟玩泥巴似的非常簡單,一頓操作猛如虎,回頭一看代碼加了一堆注解:Controller Autowired Value,面向注…

聯想拯救者y7000加內存條_短測聯想拯救者Y7000,到底值不值得買?

7000塊左右的筆記本電腦有什么好選擇,我相信這是很多人一直糾結的問題,雖然我用過的筆記本很多,但是這個價位的用的少之又少,但隨著十代酷睿標壓處理器的大量鋪貨,聯想拯救者Y7000進入了我的視線。那到底值不值得買呢&…

php適用于什么服務器,php – 找不到laravel類(適用于localhost但不適用于DO服務器)...

這是一個重復的問題 – 例如:Laravel 4 migrations – class not found但是,我已經嘗試了所有解決方案(來自我能找到的每個論壇)并且無法解決這個問題.腳本我在我的本地機器上創建了一個Laravel 4項目 – 添加了一些類,控制器,視圖等 – 項目運行良好.然后我將這個新…

python掃雷游戲課程設計小組任務計劃與分配表_python實現掃雷游戲

本文為大家分享了python實現掃雷游戲的具體代碼,供大家參考,具體內容如下本文實例借鑒mvc模式,核心數據為model,維護1個矩陣,0表無雷,1表雷,-1表已經檢測過。本例使用python的tkinter做gui,由于…

時間同步服務器java,Windows 配置時間同步服務器以及配置時間同步間隔

如何修改windows下的時間同步間隔操作步驟如下:打開注冊表:在“開始”菜單→“運行”項下(或按WinR)輸入“Regedit”進入注冊表編輯器。2.修改默認時間服務器IP:展開HKEY_LOCAL_MACHINE->SYSTEM->CurrentControlSet->Services->W…

房價python爬取_python爬取并解析 重慶2015-2019房價走勢

1 #! /usr/bin/env python2 #-*- coding:utf-8 -*-34 5 Created on 2019年11月24日67 author: Admin8 910 importrequests11 from lxml importetree12 importtime13 importcsv1415 16 方法名稱:spider17 功能: 爬取目標網站,并以源碼文本18 參…

PHP遞歸刪除目錄面試題,PHP 遞歸刪除目錄中文件

/*** 遞歸刪除目錄中文件* param $pathname* return bool*/public static function delDir($pathname)//要刪除的目錄{if(file_exists($pathname)) {if(is_file($pathname)) {unlink($pathname);} else {$dir opendir($pathname);while($filename readdir($dir)) {if($filena…

python中 12_python編程中常用的12種基礎知識總結

1、正則表達式替換目標: 將字符串line中的 overview.gif 替換成其他字符串>>> line >>> more.compile(r(?<SRC)"([\w\.])",re.I)>>> mo.sub(r"\1****",line)>>> mo.sub(rreplace_str_\1,line)< /span>>&…

php smarty分頁原理,SMARTY分頁詳解

<?phprequire_once (include/common.inc.php);//這里是個接口common.inc.php里面包函了一些常用到的函數類庫以及SMARTYinclude_once(header.php);//調用頭部信息,SESSION的信息全都保存在這里,這樣做的好處是幾乎所有的頁面都不需要在開頭輸入session_start();$smarty new…