一衬横、上下文菜單( context menu )
用 TextView 實(shí)現(xiàn)裹粤,通過clickaspan處理點(diǎn)擊事件。
背景圖用 Android 9-patch shadow generator 生成蜂林,參數(shù)如下:
round 8
shadow blur 8
shadow color #757575
Outline width 3
128x35
20%-30%
9%-6%
二遥诉、點(diǎn)擊選取標(biāo)注
1. 點(diǎn)擊后繪制包裹框
頭文件:fpdf_annot.h
API:FPDFPage_GetAnnotCount、FPDFAnnot_GetRect噪叙,獲得標(biāo)注的整體包裹Rect矮锈。
得到 Rect 后,將之繪制出來睁蕾,與文本選擇一樣苞笨,不過繪制的是矩形方框。
2. 將標(biāo)注形狀轉(zhuǎn)換為文本選擇
標(biāo)注僅是形狀子眶,無文本選擇信息瀑凝。需要通過 FPDFAnnot_CountAttachmentPoints、 FPDFAnnot_GetAttachmentPoints臭杰、FPDFText_GetCharIndexAtPos 恢復(fù)文本選擇猜丹。
FPDFAnnot_GetRect 獲得的僅僅是一個(gè)整體包裹框,并非實(shí)際形狀硅卢。實(shí)際形狀由 AttachmentPoints 定義射窒,可以包含多個(gè)矩形信息,一組 AttachmentPoints 由矩形的四個(gè)頂點(diǎn) (x1,y1)将塑、 (x2,y2)脉顿、 (x3,y3)、 (x4,y4) 組成点寥,這樣的“矩形”可以是任意形狀艾疟、任意旋轉(zhuǎn)角度的。
2.1
在此之前需用 FPDFAnnot_GetAttachmentPoints 修改點(diǎn)擊高亮標(biāo)注的方法敢辩,因?yàn)槎鄠€(gè)高亮標(biāo)注的包裹框可能有重疊蔽莱,而包裹框的包裹范圍大于高亮標(biāo)注的實(shí)際范圍。若存在多個(gè)結(jié)果戚长,則用 FPDFAnnot_GetAttachmentPoints 剔除不符合的盗冷,并將其他符合條件(包含觸點(diǎn)下的PDF像素)的高亮標(biāo)注存儲(chǔ)起來。若仍然存在多個(gè)結(jié)果同廉,則需要計(jì)算出最符合條件的仪糖,可能是面積最小的,也可能是中心點(diǎn)距離最近的迫肖。
點(diǎn)擊選取標(biāo)注的第一步本質(zhì)是在平面內(nèi)用一個(gè)點(diǎn)選擇包含該點(diǎn)的矩形锅劝,所有矩形的旋轉(zhuǎn)為0。這樣的問題可以簡(jiǎn)單迭代判斷蟆湖,或用R樹解決達(dá)到性能最優(yōu)化故爵。
簡(jiǎn)單處理高亮標(biāo)注的單擊選取問題,會(huì)造成標(biāo)注之間的錯(cuò)誤遮蔽現(xiàn)象隅津。
-
反例:(靜讀天下)
標(biāo)注添加的先后順序影響標(biāo)注之間的錯(cuò)誤遮蔽诬垂。
-
反例:(ezpdf reader)
較大的高亮標(biāo)注覆蓋并遮蔽較小的高亮標(biāo)注,使其無法被選中呢铆。
2.2
AttachmentPoints 的坐標(biāo)配合 FPDFText_GetCharIndexAtPos 可以用來恢復(fù)高亮標(biāo)注的文本選擇晦鞋。
于是乎,標(biāo)注選擇與文本選擇自然地共享幾乎全部功能棺克,都可以調(diào)用翻譯悠垛、分享、查詞典等菜單項(xiàng)娜谊。
三确买、新建高亮標(biāo)記
關(guān)鍵 API:FPDFPage_CreateAnnot、FPDFAnnot_SetRect纱皆、FPDFAnnot_AppendAttachmentPoints.
FPDFAnnot_SetRect 和 FPDFAnnot_AppendAttachmentPoints 的區(qū)別參考 https://stackoverflow.com/questions/61524219/difference-between-fpdfannot-setrect-and-fpdfannot-appendattachmentpoints-when-a/64835128#64835128湾趾。(順便幫我的回答點(diǎn)下贊也是好的芭商。。搀缠。)
FPDFAnnot_AppendAttachmentPoints 定義的矩形與選區(qū)矩形差不多铛楣,但之前實(shí)現(xiàn)的選區(qū)矩形太過分散,可以用簡(jiǎn)單的算法艺普,將同一行的矩形合并成大矩形簸州。
生成的高亮標(biāo)注兩邊沒有鼓脹效果,不知如何實(shí)現(xiàn)歧譬。
四岸浑、保存PDF
API:FPDF_SaveAsCopy。雖然可以傳入標(biāo)志位FPDF_INCREMENTAL
瑰步,但無法增量保存矢洲。不用增量保存的話,結(jié)果PDF文件體積較大面氓。