lwuit -一些细节疑难杂症收拾笔记

lwuit ---一些细节疑难杂症整理笔记

转载:http://www.cnblogs.com/datong/archive/2009/07/22/1528325.html


1、textArea 显示文本内容,在部分手机上无法显示全部内容,每一行的最后几个字被挡住
琢磨了很久终于找了出来,解决方案如下:
  
TextArea txtContent = new TextArea(strContent, 12, 24);
  //添加这一句即可
  txtContent.setWidestChar('一');
 
2、若要对文本框中的内容设置补丁:
txtContent.getStyle().setPadding(Component.RIGHT, 10);
 
内容往右10像素。
3、如果list上不想要显示文字多余时的省略号
name.setEndsWith3Points(false);
 
4、重写Dialog要让标题与Form的样式一致
dialog.show(100, 100,100,100, true);

 
5、声音播放

try {
     InputStream is = getClass().getResourceAsStream(
       "/res/NewMailSound.wav");
     Player player = Manager.createPlayer(is, "audio/x-wav");
     player.start();
    } catch (Exception e) {
     e.printStackTrace();
    }

  
6、使得TextField也能够在触屏手机上点击时出现输入编辑
解决方法:
在TextField源码上 加上editString();函数:
public void pointerReleased(int x, int y) {

        // unlike text area the text field supports shifting the cursor with the touch screen
     editString();
        String text = getText();
        int textLength = text.length();
        int position = 0;
        Font f = getStyle().getFont();
        x -= getAbsoluteX();
        for(int iter = 0 ; iter < textLength ; iter++) {
            int width = f.substringWidth(text, 0, iter);
            if(x > width) {
                position = iter;
            } else {
                break;
            }
        }
        if(position == textLength - 1) {
            if(f.stringWidth(text) < x) {
                position = textLength;
            }
        }
        setCursorPosition(position);
        repaint();
    }

  
或者官方的解决方法:http://forums.java.net/jive/thread.jspa?threadID=52716
7、震动

 public void MakeVibrate() {
  new Thread() {
   public void run() {
    try {
     Display.getInstance().vibrate(2000);
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  }.start();
 }

  
8、导致内存激增的原因(可以用自动模拟器的内存检测器进行监测C:\WTK2.5.2\bin\prefs.exe将你要的设置勾选)
而lwuit里面的源码有两句是会导致内存一直占用,一个是TextField中的这段代码

  // public boolean animate() {
    // boolean ani = super.animate();
    // if (hasFocus()) {
    // long currentTime = System.currentTimeMillis();
    // if (drawCursor) {
    // if ((currentTime - cursorBlinkTime) > blinkOnTime) {
    // cursorBlinkTime = currentTime;
    // drawCursor = false;
    // return true;
    // }
    // } else {
    // if ((currentTime - cursorBlinkTime) > blinkOffTime) {
    // cursorBlinkTime = currentTime;
    // drawCursor = true;
    // return true;
    // }
    // }
    // if (pressedAndNotReleased) {
    // if (currentTime - pressTime >= getLongClickDuration()) {
    // longClick(pressedKeyCode);
    // }
    // } else {
    // if (pendingCommit && currentTime - releaseTime > commitTimeout) {
    // commitChange();
    // }
    // }
    // } else {
    // drawCursor = false;
    // }
    // return ani;
    // }
 
    // public boolean animate() {
    
// boolean ani = super.animate();
    
// if (hasFocus()) {
    
// long currentTime = System.currentTimeMillis();
    
// if (drawCursor) {
    
// if ((currentTime - cursorBlinkTime) > blinkOnTime) {
    
// cursorBlinkTime = currentTime;
    
// drawCursor = false;
    
// return true;
    
// }
    
// } else {
    
// if ((currentTime - cursorBlinkTime) > blinkOffTime) {
    
// cursorBlinkTime = currentTime;
    
// drawCursor = true;
    
// return true;
    
// }
    
// }
    
// if (pressedAndNotReleased) {
    
// if (currentTime - pressTime >= getLongClickDuration()) {
    
// longClick(pressedKeyCode);
    
// }
    
// } else {
    
// if (pendingCommit && currentTime - releaseTime > commitTimeout) {
    
// commitChange();
    
// }
    
// }
    
// } else {
    
// drawCursor = false;
    
// }
    
// return ani;
    
// }

一个是Display

lwuitGraphics.setGraphics(impl.getNativeGraphics());

 
这两个暂时还没有仔细去研究,但是确实吃内存的所在。
还有就是要巧用System.gc();进行内存回收,这样就会尽量的减少内存溢出的情况。
9、滚动条拖拽方向与内容显示相反,component中的代码修改如下

 public void pointerDragged(int x, int y) {
        if (isScrollable() && isSmoothScrolling()) {
            int axisValue;
            if (isScrollableY()) {
                axisValue = y;
            } else {
                axisValue = x;
            }

            if (!dragActivated) {
                dragActivated = true;
                beforeLastScrollY = axisValue;
                lastScrollY = axisValue;
                getComponentForm().setDraggedComponent(this);
            }
            //save time and locations to create velocity when the 
            //pointer is released
            long currentTime = System.currentTimeMillis();
            if (currentTime != lastTime[(pLastDragged + lastTime.length + 1) % lastTime.length]) {
                lastTime[pLastDragged] = System.currentTimeMillis();
                lastDragged[pLastDragged] = axisValue;
                pLastDragged = (++pLastDragged) % lastTime.length;
            }

            beforeLastScrollY = lastScrollY;
            lastScrollY = axisValue;

            // we drag inversly to get a feel of grabbing a physical screen
            // and pulling it in the reverse direction of the drag
            if (isScrollableY()) {
                int scroll = getScrollY() - (beforeLastScrollY - axisValue);
                if (scroll >= 0 && scroll < getPreferredH() - getHeight()) {
                    setScrollY(scroll);
                }
            } else {
                int scroll = getScrollX() - (beforeLastScrollY - axisValue);
                if (scroll >= 0 && scroll < getPreferredW() - getWidth()) {
                    setScrollX(scroll);
                }
            }
        } else {
            //try to find a scrollable element until you reach the Form
            Component parent = getParent();
            if (!(parent instanceof Form)) {
                parent.pointerDragged(x, y);
            }
        }
    }

 

10、开启wtk模拟器的触摸屏功能
打开\wtklib\devices\DefaultColorPhone目录下的DefaultColorPhone.properties文件(最好先安装一个UltraEdit之类的文本编辑器)。
然后找到touch_screen选项,修改为touch_screen=true

11、设置模拟器权限,以免开发过程中弹出烦人的提示
打开wtk模拟器。
选择Edit->Preferences->Security
然后将Security domain的选项设置为maximum。

12、内存和性能监视器
Edit->Preferences->Memory Monitor
Edit->Preferences->Profiler

13、出现安装后无法打开问题
有些Nokia手机会出现安装后无法打开,原因是安装包名称包含中文导致。

 




 

1 楼 superliu8 2010-04-14  
lwuit -一些细节疑难杂症收拾笔记 以后的手机发展趋势 是触屏么?