日历
«  2018 7  »
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
最新评论
网站统计
  • 建站时间: 2010/03/29
  • 日记:4142 篇
  • 照片:45 张
  • 话题:14 篇
  • 评论:1108 篇
  • 注册用户:14
  • 今日访问:669
  • 本周访问:7074
  • 本月访问:59161
  • 全部访问:6088597

解决lwuit程序在触摸屏中滚动条的方向与定位问题

2010/03/31  作者:耀耀   心情: sunny  Wednesday (16:30)

本来一直都在做Symbian,后来公司说多平台开发成本高,人力分散,要专注一个版本,于是被逼无奈来做j2me的开发。。
lwuit是sun公司的一套轻量级应用程序开发架构,里面的控件十分丰富,而且效果特别多,用这个开发应用程序开发周期十分的短。
我是菜鸟,对于这个里面所提到的系统架构到目前还是没有完全的弄清楚,也不好分析。只是就自己遇到的问题给各位分享下。
想必用lwuit的朋友在将其安装到触摸屏中都会遇到两个很不受用户欢迎的触摸滚动问题。如:用户在屏幕中拖拽滚动条时,其拖拽方向和滚动方向相反,其实这个是sun的工程师他们认为拖拽不应该是操作触摸屏而是操作整个form,但是我们用户使用Windows习惯了,都不会有什么感觉,所以大家都不会去改变这个习惯。其实该方向简单,一下子就可以找到。但是改精度就麻烦了。滚动条老是不会跟着用户的指针操作走,这个很让用户不爽,而我在找这个的时候也走了很多的弯路,最后终于发现——“蓦然回首,那人却在灯火阑珊处”。。废话不多说,贴出我改的函数,这个其实在com.sun.lwuit.component的pointerDragged函数,贴出源代码:

CODE:

/**
     * If this Component is focused, the pointer dragged event
     * will call this method
     *
     * @param x the pointer x coordinate
     * @param y the pointer y coordinate
     */
    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()) {
                //解决滚动条定位问题和方向问题-----begin
                int h = getHeight() - getStyle().getPadding(TOP) - getStyle().getPadding(BOTTOM);
                int scroll = getScrollY() - (beforeLastScrollY - axisValue)*getPreferredH()/h;
                //解决滚动条定位问题和方向问题-----end
                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);
            }
        }
    }
这个问题其实反映的挺多,在java.net的分版lwuit中我就至少看见有三篇说这个的,但是原作者好像不喜欢改他的代码,所以就只好在这里发出来。。。
希望可以帮助朋友解决问题。
关键字: lwuit 
引用地址: http://blogzdycserver/html/trackback.do?id=8&type=1 (复制地址)
j2me:LWUIT | 评论(168) | 阅读(42579) | Trackback(0) |