如何让拨轮滚动所有方向?

时间:2012-08-01 10:54:46

标签: blackberry gridview

这是我的navigationMovement()

protected boolean navigationMovement(int dx, int dy, int status, int time) {

        int focusIndex = getFieldWithFocusIndex();

        while (dy > 0) {
            if (focusIndex >= getFieldCount()) {
                return false;
            } else {
                Field f = getField(focusIndex);
                if (f.isFocusable()) {
                    f.setFocus();
                    dy--;
                }
            }
        }

        while (dy < 0) {
            if (focusIndex < 0) {
                return false;
            } else {
                Field f = getField(focusIndex);

                if (f.isFocusable()) {
                    f.setFocus();
                    dy++;
                }
            }
        }

        while (dx > 0) {
            focusIndex++;

            if (focusIndex >= getFieldCount()) {
                return false;
            } else {
                Field f = getField(focusIndex);

                if (f.isFocusable()) {
                    f.setFocus();
                    dx--;
                }
            }
        }

        while (dx < 0) {
            focusIndex--;

            if (focusIndex < 0) {
                return false;
            } else {
                Field f = getField(focusIndex);

                if (f.isFocusable()) {
                    f.setFocus();
                    dx++;
                }
            }
        }

        return true;
}

这只允许履带轮左右滚动,但我想要上,下,左,右。

我的布局是this

这是一排3行×4列。

此代码正在检查getField(0->10),这就是为什么它不能从0到4。

我希望它可以向各个方向移动。如何实现?

更新

protected void sublayout(int width, int height) {
        int y = 0;

        Field[] fields = new Field[columnWidths.length];
        int currentColumn = 0;
        int rowHeight = 0;

        for (int i = 0; i < getFieldCount(); i++) {
            fields[currentColumn] = getField(i);
            fields[currentColumn]
                    .setChangeListener(new FieldChangeListener() {
                        public void fieldChanged(Field field, int context) {
                            final int focusIndex = getFieldWithFocusIndex();
                            if (focusIndex == position) {
                                Main.getUiApplication().popScreen(
                                        mainscreen);
                            } else {
                                Main.getUiApplication().popScreen(
                                        mainscreen);
                                Main.getUiApplication().pushScreen(
                                        new Custom_LoadingScreen(1));
                                Main.getUiApplication().invokeLater(
                                        new Runnable() {
                                            public void run() {
                                                if (focusIndex == 0)
                                                    Main.getUiApplication()
                                                            .pushScreen(
                                                                    new Main_AllLatestNews());
                                                else
                                                    Main.getUiApplication()
                                                            .pushScreen(
                                                                    new Main_ParticularCategoryAllNews(
                                                                            catnewsid[focusIndex],
                                                                            focusIndex,
                                                                            cattitle[focusIndex]));
                                            }
                                        }, 1 * 1000, false);
                            }
                        }
                    });
            layoutChild(fields[currentColumn], columnWidths[currentColumn],
                    height - y);

            if (fields[currentColumn].getHeight() > rowHeight) {
                rowHeight = fields[currentColumn].getHeight() + 10;
            }

            currentColumn++;

            if ((currentColumn == columnWidths.length)
                    || (i == (getFieldCount() - 1))) {
                int x = 0;

                if (this.allRowHeight >= 0) {
                    rowHeight = this.allRowHeight;
                }

                for (int c = 0; c < currentColumn; c++) {
                    long fieldStyle = fields[c].getStyle();
                    int fieldXOffset = 0;
                    long fieldHalign = fieldStyle & Field.FIELD_HALIGN_MASK;

                    if (fieldHalign == Field.FIELD_RIGHT) {
                        fieldXOffset = columnWidths[c]
                                - fields[c].getWidth();
                    } else if (fieldHalign == Field.FIELD_HCENTER) {
                        fieldXOffset = (columnWidths[c] - fields[c]
                                .getWidth()) / 2;
                    }

                    int fieldYOffset = 0;
                    long fieldValign = fieldStyle & Field.FIELD_VALIGN_MASK;

                    if (fieldValign == Field.FIELD_BOTTOM) {
                        fieldYOffset = rowHeight - fields[c].getHeight();
                    } else if (fieldValign == Field.FIELD_VCENTER) {
                        fieldYOffset = (rowHeight - fields[c].getHeight()) / 2;
                    }

                    setPositionChild(fields[c], x + fieldXOffset, y
                            + fieldYOffset);
                    x += columnWidths[c];
                }

                currentColumn = 0;
                y += rowHeight;
            }

            if (y >= height) {
                break;
            }
        }

        int totalWidth = 0;

        for (int i = 0; i < columnWidths.length; i++) {
            totalWidth += columnWidths[i];
        }

        if (position > -1) {
            Field f = getField(position);
            f.setFocus();
        }

        setExtent(totalWidth, Math.min(y, height));
    }
}

2 个答案:

答案 0 :(得分:1)

您的代码以同样的方式处理dx和dy的问题。您需要以不同的方式计算下一个上一个索引,具体取决于它是水平滚动还是垂直滚动。

不,你用过什么经理? FlowFieldManager?因为我认为它应该在默认的navigationMovement实现中按预期工作。

答案 1 :(得分:0)

navigationMovement默认会关注所有可聚焦组件。 它只关系你使用的布局和放大器。你是如何安排这些经理的。你有行,列式结构,所以如果你使用水平管理器一行,它的元素将获得焦点和&amp;完成所有元素后,重点将放在第二个水平管理器上。