JavaMe开发自适应滚动显示_java

【问题描述】

我们常看到一些滚动显示的实例,比如UC浏览器中,显示网页的内容。当内容比较多时,采用滚动分页显示是合理的。在Canvas中绘图中,多余的内容被截断了。如何实现滚动分页显示呢?

【原理】

JavaMe中有一个坐标变换的功能。当触发相应的按键事件时,我们就让其显示相应的页,并且使滚动条滚动到相应的位置。

【代码清单】

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 滚动分页显示;\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所示:

 

图 滚动显示效果

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索JavaMe开发
自适应滚动
div高度自适应 滚动条、滚动条自适应、自适应滚动、自适应多图左右滚动、自适应左右滚动,以便于您获取更多的相关知识。

时间: 2024-08-01 11:25:05

JavaMe开发自适应滚动显示_java的相关文章

JavaMe开发绘制可自动换行文本_java

[问题描述] JavaMe Graphics类中的drawString不支持文本换行,这样绘制比较长的字符串时,文本被绘制在同一行,超过屏幕部分的字符串被截断了.如何使绘制的文本能自动换行呢? [分析] drawString无法实现自动换行,但可以实现文本绘制的定位.因此可考虑,将文本拆分为多个子串,再对子串进行绘制.拆分的策略如下: 1 遇到换行符,进行拆分: 2 当字符串长度大于设定的长度(一般为屏幕的宽度),进行拆分. [步骤] 1 定义一个String和String []对象: priv

Javascript网页制作技巧:图片列表自适应宽度显示

文章简介:从事网页重构好几年了,Javascript能力一直比较菜,主要还是做得太少.为了提高这方面的能力,这段时间主动承担了一些这方面的工作,真心感到学习和积累的不易,不过时常伴随着一些解决问题之后的小小成就感又让人乐此不疲. 从事网页重构好几年了,Javascript能力一直比较菜,主要还是做得太少.为了提高这方面的能力,这段时间主动承担了一些这方面的工作,真心感到学习和积累的不易,不过时常伴随着一些解决问题之后的小小成就感又让人乐此不疲. 在近期一个项目中,遇到一个图片列表自适应宽度显示的

Android实现在TextView文字过长时省略部分或滚动显示的方法_Android

本文实例讲述了Android实现在TextView文字过长时省略部分或滚动显示的方法.分享给大家供大家参考,具体如下: TextView中有个ellipsize属性,作用是当文字过长时,该控件该如何显示,解释如下: 1.android:ellipsize="start"-–省略号显示在开头 2.android:ellipsize="end"--省略号显示在结尾 3.android:ellipsize="middle"--省略号显示在中间 4.an

Android编程实现大图滚动显示的方法_Android

本文实例讲述了Android编程实现大图滚动显示的方法.分享给大家供大家参考,具体如下: 问题: 我有一张比较大的图片,比如长宽都是屏幕的两倍大小,我想实现的功能是首先将图片居中显示,由于图片太大显然只能显示一部分,然后可以通过拖动,实现图片的平滑滚动(既看不出来滚动刷新痕迹). 就像google地图一样,如果用mapView这个控件,那么可以在屏幕上拖动整个地图,但是由于地图信息量太大,如果一次拖动过快,那么屏幕会暂时显示出一些刷新痕迹(灰白的格子). 想使用mapView来加载已有图片,但是

js实现仿微博滚动显示信息的效果_javascript技巧

相信大家空闲的时候都会上上微博,推特等社交网站,每次我登陆微博时,我都会留意一下它有什么变化,小的有一些布局的变化,大的有API接口的改变等. 在首页登陆微博时,我们可以看到一栏"大家正在说",它滚动显示着当前每个人发送的微博:刚看到这个效果觉得挺有趣的,所以我们将在接下来的文中介绍实现滚动显示微博信息的效果. 我们细细观察了微博的"大家正在说",它是通过由上往下滚动来实现不断显示微博的,而且每一天新微博都是通过淡入效果显示的. 图1 微博"大家正在说&q

JavaMe开发绘制文本框TextEdit_java

[问题描述] TextEdit是采用GameCanvas绘制的文本编辑器.本文结合实例给出实现的方法. [原理] 1 运用Graphics.GameCanvas绘制文本框和光标. 2 检测到输入事件时,跳转到 高级界面->TextBox .通过系统调用输入法完成输入. 3 将TextBox输入的值返回给TextEdit对象. [设计模式] 这个过程有点类似装饰模式,实际上,实现输入的还是TextBox,只是给TextBox装饰了一下,形成了一个漂亮的外观. [代码清单] TextEdit.jav

Android编程实现大图滚动显示的方法

本文实例讲述了Android编程实现大图滚动显示的方法.分享给大家供大家参考,具体如下: 问题: 我有一张比较大的图片,比如长宽都是屏幕的两倍大小,我想实现的功能是首先将图片居中显示,由于图片太大显然只能显示一部分,然后可以通过拖动,实现图片的平滑滚动(既看不出来滚动刷新痕迹). 就像google地图一样,如果用mapView这个控件,那么可以在屏幕上拖动整个地图,但是由于地图信息量太大,如果一次拖动过快,那么屏幕会暂时显示出一些刷新痕迹(灰白的格子). 想使用mapView来加载已有图片,但是

Android实现在TextView文字过长时省略部分或滚动显示的方法

本文实例讲述了Android实现在TextView文字过长时省略部分或滚动显示的方法.分享给大家供大家参考,具体如下: TextView中有个ellipsize属性,作用是当文字过长时,该控件该如何显示,解释如下: 1.android:ellipsize="start"-–省略号显示在开头 2.android:ellipsize="end"--省略号显示在结尾 3.android:ellipsize="middle"--省略号显示在中间 4.an

java类的问题-java开发时,显示图片总要在放大或所放窗口后才会显示出来

问题描述 java开发时,显示图片总要在放大或所放窗口后才会显示出来 怎么解决java开发时,显示图片总要在放大或所放窗口后才会显示出来