时间:2021-05-19
【问题描述】
我们常看到一些滚动显示的实例,比如UC浏览器中,显示网页的内容。当内容比较多时,采用滚动分页显示是合理的。在Canvas中绘图中,多余的内容被截断了。如何实现滚动分页显示呢?
【原理】
JavaMe中有一个坐标变换的功能。当触发相应的按键事件时,我们就让其显示相应的页,并且使滚动条滚动到相应的位置。
【代码清单】
ShowHelp.javapackage 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 滚动分页显示;\n" +"2 滚动分页显示;\n" +"3 滚动分页显示;\n" +"4 滚动分页显示;\n" +"5 滚动分页显示;\n" +"6 滚动分页显示;\n" +"7 滚动分页显示;\n" +"8 滚动分页显示;\n" +"9 滚动分页显示;\n" +"10 滚动分页显示;\n" +"11 滚动分页显示;\n" +"12 滚动分页显示;\n" +"13 滚动分页显示;\n" +"14 滚动分页显示;\n" +"15 滚动分页显示;\n" +"16 滚动分页显示;\n" +"17 滚动分页显示;\n" +"18 滚动分页显示;\n" +"19 滚动分页显示;\n" +"20 滚动分页显示;\n" +"21 滚动分页显示;\n" +"22 滚动分页显示;\n" +"23 滚动分页显示;\n" +"24 滚动分页显示;\n" +"25 滚动分页显示;\n" +"26 滚动分页显示;\n" +"27 滚动分页显示;\n" +"28 滚动分页显示;\n" +"29 滚动分页显示;\n" +"30 滚动分页显示;\n" +"31 滚动分页显示;\n" +"32 滚动分页显示;\n" +"33 滚动分页显示;\n" +"34 滚动分页显示;\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请参考JavaMe连载(3)-也说MVC设计模式,此处不再赘述。
【分析】
1 字符串拆分
String info_wrap1[] = StringDealMethod.format(info, width-15, ft);
具体请参考JavaMe连载(4)-绘制可自动换行文本
2 避免字截断
如何在指定的区域内绘制整行文本,而不会因为字体或屏幕高度的改变使文本出现截断的问题,使文本出现“半截字”的问题呢?
bodyHeight = ((int) (height-head.menuHeight-menu.menuHeight)/ft.getHeight())*ft.getHeight();
经过上述处理后,滚动区域的高度bodyHeight总会是字体高度的整数倍,这样就不会出现上述字截断的问题了。
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 坐标变换
graphics.clipRect(0, head.menuHeight+margin, width, bodyHeight); graphics.translate(0, dir*currentPageIndex*bodyHeight);文本绘制完成后,将坐标变换回来。
graphics.translate(0, -dir*currentPageIndex*bodyHeight);5 绘制滚动条
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 事件处理
当检测到按键事件后,进行翻页操作。
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; } } }本例方法能自适应的检测屏幕的宽度和长度,依据字体的大小,对文本进行分页,滚动显示,实现效果如图1所示:
图 滚动显示效果
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
直接为div指定overflow属性必须指定div的高度:复制代码代码如下:div设置滚动条显示:overflow:yesdiv设置滚动条自适应显示:overf
bootstrap是一款非常优秀的前端UI开发框架,特别在开发自适应网页应用广泛。然而bootstrap在windowsphone8中会出现整个屏幕变得很小的情
什么是自适应网站?指的是网页通过不同大小终端设备自适应显示,根据屏幕大小、宽度自动调整布局,自适应也可以叫响应式。自适应网站是HTML5的新技术。自适应网站的优
自适应网页设计(AdaptiveWebDesign)是指能使网页自适应显示在不同大小终端设备上新网页设计方式及技术。通俗的说,自适应网页设计也是响应式网站建设,
响应式设计简单来说是一个网站能够兼容多个终端,而不是为每个终端做一个特定的版本。自适应布局指能使网页自适应显示在不同大小终端设备上页设计方式及技术。对于自适应网