制作安卓PDF閱讀器:九、實現縮略圖網格和全文搜索

實現縮略圖卷軸后荆烈,一下子就爆發(fā)出很多的可能性拯勉。這些方向主要有:縮略圖網格、頁面跳轉的歷史記錄憔购、全文搜索宫峦、以及書簽。

一倦始、縮略圖網格

mViewPager.setLayoutManager(new GridLayoutManager(a, 6));

這樣就完成6列網格的顯示了斗遏。GridLayoutManager 擴展自 LinearLayoutManager,所以不會出問題鞋邑,但具體還需調整。

網格切換
橫向NumberPicker账蓉,可以用鍵盤輸入數字枚碗。

二、實現PDF全文搜索

2.1 搜索界面

通過改寫recyclerview的適配器铸本,顯示全部頁面的子集肮雨,作為搜索結果的基本展示。

底部數據就一個 Arraylist箱玷,存放具體頁面的索引怨规。所以也可以使用SparseIntArray。

實現 ResultsProvider 接口將底部數據隱藏起來锡足。

運用廣度優(yōu)先的搜索策略波丰,即優(yōu)先搜索哪些頁面有匹配,而不是全部匹配的具體位置舶得。

2.2 PDF 全文搜索

API : FPDFText_FindStart掰烟、FPDFText_FindNext。暫時這兩個就夠沐批,一頁頁地調用兩個API各一次進行搜索纫骑。

需要用 FPDF_LoadPage、FPDFText_LoadPage分別加載每一頁及其文本對象九孩。測試發(fā)現先馆,七百多頁的內存中的Gpu pro 1,加載全部頁面耗時2.7秒躺彬,加載全部頁面的文本對象耗時4.4-2.7秒煤墙。對每一頁面發(fā)起并關閉一次搜索的時間可忽略不計缤底。

也就是說什么搜沒開始搜索,就有一個4.4秒左右的基本耗時番捂。

JNI_FUNC(void, PdfiumCore, nativeFindAll)(JNI_ARGS, jlong docPtr, jint pages) {
    DocumentFile* docFile = (DocumentFile*)docPtr;
    // 測試搜索功能个唧。 
    const unsigned short nope[] = { 'n', 'o', 'p', 'e', '\0' }; // 模仿測試文件 fpdftext_embeddertest.cpp
    FPDF_DOCUMENT pdfDoc = docFile->pdfDocument;
    if(pdfDoc){
        for(int i=0;i<pages;i++) { // 對每一頁面
            FPDF_PAGE page = FPDF_LoadPage(pdfDoc, i); //加載頁面
            if(page) {
                FPDF_TEXTPAGE text = FPDFText_LoadPage(page); //加載文本
                if(text) {
                    // 發(fā)起搜索
                    FPDF_SCHHANDLE findHandle = FPDFText_FindStart(text, nope, 0, 0); 
                     // 關閉搜索
                    FPDFText_FindClose(findHandle);

                    FPDFText_ClosePage(text); //卸載文本
                }
                FPDF_ClosePage(page); //卸載頁面
            }
        }
    }
}

進一步測試,在發(fā)起搜索和關閉搜索之間正式搜索一次设预。耗時4.5秒徙歼,還是很快的。

FPDFText_FindNext(findHandle); // 正式搜索

這樣一來就可以放心使用API了鳖枕。接下來將有匹配的頁面置入ArrayList里面魄梯,最后傳給上面說的縮略圖頁面子集適配器就可以了!

附從jstring獲取可以傳給FPDFText_FindStart的keyStr:

const unsigned short * keyStr = env->GetStringChars(key, 0);

如果選擇緩存全部頁面對象而不關閉宾符,那么第二次搜索將快很多(200到300毫秒)酿秸;但是會占用內存空間,七百多頁共占0.2GB左右魏烫。

事實也證明頁面及其文本對象的加載是主要耗時過程辣苏。相比之下,jni調用哄褒、jstring轉換等的消耗不值一提稀蟋。


2.3 繪制高亮

又是與繪制選區(qū)差不多唄。拿到基本的搜索結果后呐赡,渲染時進一步循環(huán)調用 FPDFText_FindNext 搜索直到這一頁返回false退客。循環(huán)之內,用FPDFText_GetSchResultIndex链嘀、FPDFText_GetSchCount獲取一頁內所有匹配的字符索引萌狂。然后和之前一樣用FPDFText_CountRects 和 FPDFText_GetRect獲得一些需要繪制的矩形。

這個功能是 JNI 調用最為密集的怀泊,因此簡單測試了一下 JNI 調用的效率茫藏,發(fā)現在native層調用java方法要比正向調用慢一些,不知是否是測試方法的問題包个。

然后是繪制方面刷允,之前說若將選區(qū)方框繪制在后面需要分好幾層,很麻煩碧囊。實際則簡單得多树灶,只需用paint.setXfermode(PorterDuff.Mode.DARKEN)就可以達成類似的效果,神奇糯而。

結果如圖所示天通,使用YPWaveView(動態(tài)波浪視圖)指示搜索進度,效果相當不錯熄驼。

……

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末像寒,一起剝皮案震驚了整個濱河市烘豹,隨后出現的幾起案子,更是在濱河造成了極大的恐慌诺祸,老刑警劉巖携悯,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異筷笨,居然都是意外死亡憔鬼,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門胃夏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轴或,“玉大人,你說我怎么就攤上這事仰禀≌昭悖” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵答恶,是天一觀的道長饺蚊。 經常有香客問我,道長亥宿,這世上最難降的妖魔是什么卸勺? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮烫扼,結果婚禮上,老公的妹妹穿的比我還像新娘碍庵。我一直安慰自己映企,他們只是感情好,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布静浴。 她就那樣靜靜地躺著堰氓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪苹享。 梳的紋絲不亂的頭發(fā)上双絮,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音得问,去河邊找鬼囤攀。 笑死,一個胖子當著我的面吹牛宫纬,可吹牛的內容都是我干的焚挠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼漓骚,長吁一口氣:“原來是場噩夢啊……” “哼蝌衔!你這毒婦竟也來了榛泛?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤噩斟,失蹤者是張志新(化名)和其女友劉穎曹锨,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體剃允,經...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡沛简,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了硅急。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片覆享。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖营袜,靈堂內的尸體忽然破棺而出撒顿,到底是詐尸還是另有隱情,我是刑警寧澤荚板,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布凤壁,位于F島的核電站,受9級特大地震影響跪另,放射性物質發(fā)生泄漏拧抖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一免绿、第九天 我趴在偏房一處隱蔽的房頂上張望唧席。 院中可真熱鬧,春花似錦嘲驾、人聲如沸淌哟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽徒仓。三九已至,卻和暖如春誊垢,著一層夾襖步出監(jiān)牢的瞬間掉弛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工喂走, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留殃饿,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓缴啡,卻偏偏與公主長得像壁晒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內容