JavaMe開(kāi)發(fā)自適應(yīng)滾動(dòng)顯示
【問(wèn)題描述】
我們??吹揭恍L動(dòng)顯示的實(shí)例,比如UC瀏覽器中,顯示網(wǎng)頁(yè)的內(nèi)容。當(dāng)內(nèi)容比較多時(shí),采用滾動(dòng)分頁(yè)顯示是合理的。在Canvas中繪圖中,多余的內(nèi)容被截?cái)嗔恕H绾螌?shí)現(xiàn)滾動(dòng)分頁(yè)顯示呢?
【原理】
JavaMe中有一個(gè)坐標(biāo)變換的功能。當(dāng)觸發(fā)相應(yīng)的按鍵事件時(shí),我們就讓其顯示相應(yīng)的頁(yè),并且使?jié)L動(dòng)條滾動(dòng)到相應(yīng)的位置。
【代碼清單】
ShowHelp.java package com.token.view; import javax.microedition.lcdui.Font; import javax.microedition.lcdui.Graphics; import javax.microedition.lcdui.game.GameCanvas; import com.token.util.StringDealMethod; import com.token.util.UIController; import com.token.view.components.*; public class ShowHelp extends GameCanvas { private UIController controller; private Graphics graphics; private Font ft; private int width; private int height; private Menu menu; private Head head; private BackGroud backGroud; private int page = 0; private int currentPageIndex = 0; private int bodyHeight; private int dir = 0; public ShowHelp(UIController control) { super(false); this.controller=control; setFullScreenMode(true); width = getWidth(); height = getHeight(); menu = new Menu(this); head = new Head(this); backGroud = new BackGroud(this); } public void show() { int margin = 0; graphics = getGraphics(); graphics.clipRect(0,0, width, height); backGroud.drawBackGroud(this, graphics); head.drawHead(this, graphics, "幫助"); menu.drawMenu(this, graphics, "","返回"); //flushGraphics(); ft = Font.getFont(Font.FACE_PROPORTIONAL,Font.STYLE_BOLD,Font.SIZE_MEDIUM); String info = "1 滾動(dòng)分頁(yè)顯示;\n" +"2 滾動(dòng)分頁(yè)顯示;\n" +"3 滾動(dòng)分頁(yè)顯示;\n" +"4 滾動(dòng)分頁(yè)顯示;\n" +"5 滾動(dòng)分頁(yè)顯示;\n" +"6 滾動(dòng)分頁(yè)顯示;\n" +"7 滾動(dòng)分頁(yè)顯示;\n" +"8 滾動(dòng)分頁(yè)顯示;\n" +"9 滾動(dòng)分頁(yè)顯示;\n" +"10 滾動(dòng)分頁(yè)顯示;\n" +"11 滾動(dòng)分頁(yè)顯示;\n" +"12 滾動(dòng)分頁(yè)顯示;\n" +"13 滾動(dòng)分頁(yè)顯示;\n" +"14 滾動(dòng)分頁(yè)顯示;\n" +"15 滾動(dòng)分頁(yè)顯示;\n" +"16 滾動(dòng)分頁(yè)顯示;\n" +"17 滾動(dòng)分頁(yè)顯示;\n" +"18 滾動(dòng)分頁(yè)顯示;\n" +"19 滾動(dòng)分頁(yè)顯示;\n" +"20 滾動(dòng)分頁(yè)顯示;\n" +"21 滾動(dòng)分頁(yè)顯示;\n" +"22 滾動(dòng)分頁(yè)顯示;\n" +"23 滾動(dòng)分頁(yè)顯示;\n" +"24 滾動(dòng)分頁(yè)顯示;\n" +"25 滾動(dòng)分頁(yè)顯示;\n" +"26 滾動(dòng)分頁(yè)顯示;\n" +"27 滾動(dòng)分頁(yè)顯示;\n" +"28 滾動(dòng)分頁(yè)顯示;\n" +"29 滾動(dòng)分頁(yè)顯示;\n" +"30 滾動(dòng)分頁(yè)顯示;\n" +"31 滾動(dòng)分頁(yè)顯示;\n" +"32 滾動(dòng)分頁(yè)顯示;\n" +"33 滾動(dòng)分頁(yè)顯示;\n" +"34 滾動(dòng)分頁(yè)顯示;\n"; String info_wrap1[] = StringDealMethod.format(info, width-15, ft); page = info_wrap1.length*ft.getHeight()/(height-head.menuHeight-menu.menuHeight-2*margin)+1; bodyHeight = ((int) (height-head.menuHeight-menu.menuHeight)/ft.getHeight())*ft.getHeight(); margin = (height-head.menuHeight-menu.menuHeight-bodyHeight)/2; graphics.setFont(ft); graphics.setColor(Color.text); graphics.clipRect(0, head.menuHeight+margin, width, bodyHeight); graphics.translate(0, dir*currentPageIndex*bodyHeight); for(int i=0; i<info_wrap1.length;i++) { graphics.drawString(info_wrap1[i],5, i * ft.getHeight()+head.menuHeight+margin, Graphics.TOP|Graphics.LEFT); } graphics.translate(0, -dir*currentPageIndex*bodyHeight); drawScrollBar(); flushGraphics(); //System.out.println(graphics.getTranslateY()); } private void drawScrollBar() { int barHeight = height-head.menuHeight-menu.menuHeight; graphics.setColor(Color.menuFrame); graphics.fillRect(width-3, head.menuHeight, 2, barHeight); graphics.setColor(Color.selectBg); graphics.fillRect(width-4, head.menuHeight+(currentPageIndex)*barHeight/page, 4, barHeight/page); } protected void keyPressed(int keyCode) { //System.out.println(keycode); switch(keyCode) { case KeyID.SOFT_RIGHT: { String flag = "0"; Object [] args = {flag,""}; controller.handleEvent(UIController.EventID.EVENT_MAIN_SCREEN,args); break; } default: ; } keyCode = getGameAction(keyCode); //System.out.println(page); switch(keyCode) { case UP: { dir = -1; if(currentPageIndex>0) { currentPageIndex--; } else { //dir = 0; } show(); break; } case DOWN: { dir = -1; if(currentPageIndex<page-1) { currentPageIndex++; } else { //dir = 0; } show(); break; } } } }
*UIController請(qǐng)參考JavaMe連載(3)-也說(shuō)MVC設(shè)計(jì)模式,此處不再贅述。
【分析】
1 字符串拆分
String info_wrap1[] = StringDealMethod.format(info, width-15, ft);
具體請(qǐng)參考JavaMe連載(4)-繪制可自動(dòng)換行文本
2 避免字截?cái)?/strong>
如何在指定的區(qū)域內(nèi)繪制整行文本,而不會(huì)因?yàn)樽煮w或屏幕高度的改變使文本出現(xiàn)截?cái)嗟膯?wèn)題,使文本出現(xiàn)“半截字”的問(wèn)題呢?
bodyHeight = ((int) (height-head.menuHeight-menu.menuHeight)/ft.getHeight())*ft.getHeight();
經(jīng)過(guò)上述處理后,滾動(dòng)區(qū)域的高度bodyHeight總會(huì)是字體高度的整數(shù)倍,這樣就不會(huì)出現(xiàn)上述字截?cái)嗟膯?wèn)題了。
3 繪制文本
for(int i=0; i<info_wrap1.length;i++) { graphics.drawString(info_wrap1[i],5, i * ft.getHeight()+head.menuHeight+margin, Graphics.TOP|Graphics.LEFT); }
4 坐標(biāo)變換
graphics.clipRect(0, head.menuHeight+margin, width, bodyHeight); graphics.translate(0, dir*currentPageIndex*bodyHeight);
文本繪制完成后,將坐標(biāo)變換回來(lái)。
graphics.translate(0, -dir*currentPageIndex*bodyHeight);
5 繪制滾動(dòng)條
private void drawScrollBar() { int barHeight = height-head.menuHeight-menu.menuHeight; graphics.setColor(Color.menuFrame); graphics.fillRect(width-3, head.menuHeight, 2, barHeight); graphics.setColor(Color.selectBg); graphics.fillRect(width-4, head.menuHeight+(currentPageIndex)*barHeight/page, 4, barHeight/page); }
6 事件處理
當(dāng)檢測(cè)到按鍵事件后,進(jìn)行翻頁(yè)操作。
protected void keyPressed(int keyCode) { //System.out.println(keycode); switch(keyCode) { case KeyID.SOFT_RIGHT: { String flag = "0"; Object [] args = {flag,""}; controller.handleEvent(UIController.EventID.EVENT_MAIN_SCREEN,args); break; } default: ; } keyCode = getGameAction(keyCode); //System.out.println(page); switch(keyCode) { case UP: { dir = -1; if(currentPageIndex>0) { currentPageIndex--; } else { //dir = 0; } show(); break; } case DOWN: { dir = -1; if(currentPageIndex<page-1) { currentPageIndex++; } else { //dir = 0; } show(); break; } } }
本例方法能自適應(yīng)的檢測(cè)屏幕的寬度和長(zhǎng)度,依據(jù)字體的大小,對(duì)文本進(jìn)行分頁(yè),滾動(dòng)顯示,實(shí)現(xiàn)效果如圖1所示:
圖 滾動(dòng)顯示效果
- Javascript實(shí)現(xiàn)的分頁(yè)函數(shù)
- Javascript實(shí)現(xiàn)的分頁(yè)函數(shù)
- javascript+xml技術(shù)實(shí)現(xiàn)分頁(yè)瀏覽
- javascript 支持頁(yè)碼格式的分頁(yè)類
- javascript 新聞標(biāo)題靜態(tài)分頁(yè)代碼 (無(wú)刷新)
- Jquery與JS兩種方法仿twitter/新浪微博 高度自適應(yīng)無(wú)縫滾動(dòng)實(shí)現(xiàn)代碼
- javascript分頁(yè)代碼(當(dāng)前頁(yè)碼居中)
- Java(基于Struts2) 分頁(yè)實(shí)現(xiàn)代碼
- java調(diào)用oracle分頁(yè)存儲(chǔ)過(guò)程示例
- Java web velocity分頁(yè)宏示例
- javascript實(shí)現(xiàn)簡(jiǎn)單的分頁(yè)特效
- 純javascript實(shí)現(xiàn)分頁(yè)(兩種方法)
- JavaMe開(kāi)發(fā)繪制可自動(dòng)換行文本
- JavaMe開(kāi)發(fā)繪制文本框TextEdit
相關(guān)文章
使用resty Quartz執(zhí)行定時(shí)任務(wù)的配置方法
這篇文章主要為大家介紹了使用resty?Quartz來(lái)執(zhí)行定時(shí)任務(wù)的配置方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03Java生成的隨機(jī)數(shù)靠譜嗎?多少次會(huì)重復(fù)?
今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著Java生成的隨機(jī)數(shù)靠不靠譜展開(kāi),文中有非常詳細(xì)的介紹,需要的朋友可以參考下2021-06-06spring MVC + bootstrap實(shí)現(xiàn)文件上傳示例(帶進(jìn)度條)
本篇文章主要介紹了spring MVC + bootstrap實(shí)現(xiàn)文件上傳示例(帶進(jìn)度條),非常具有使用價(jià)值,有需要的朋友可以了解一下。2017-03-03Spring Boot啟動(dòng)過(guò)程完全解析(一)
這篇文章主要介紹了Spring Boot啟動(dòng)過(guò)程完全解析(一),需要的朋友可以參考下2017-04-04img 加載網(wǎng)絡(luò)圖片失敗 顯示默認(rèn)圖片的方法
下面小編就為大家?guī)?lái)一篇img 加載網(wǎng)絡(luò)圖片失敗 顯示默認(rèn)圖片的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05Java+Swing實(shí)現(xiàn)經(jīng)典五子棋游戲
五子棋是世界智力運(yùn)動(dòng)會(huì)競(jìng)技項(xiàng)目之一,是一種兩人對(duì)弈的純策略型棋類游戲,是世界智力運(yùn)動(dòng)會(huì)競(jìng)技項(xiàng)目之一。本文將采用Java Swing實(shí)現(xiàn)這一經(jīng)典游戲,需要的可以參考一下2022-01-01java阻塞隊(duì)列BlockingQueue詳細(xì)解讀
這篇文章主要介紹了java阻塞隊(duì)列BlockingQueue詳細(xì)解讀,在新增的Concurrent包中,BlockingQueue很好的解決了多線程中,如何高效安全“傳輸”數(shù)據(jù)的問(wèn)題,通過(guò)這些高效并且線程安全的隊(duì)列類,為我們快速搭建高質(zhì)量的多線程程序帶來(lái)極大的便利,需要的朋友可以參考下2023-10-10