0

我想在通过扩展 Field 类创建的两个自定义字段上捕获事件。事件应该只是触摸事件。

一个领域使用graphics.drawRect(10,10,20,20)和其他领域使用graphics.drawRect(50,50,20,20)

(我不会使用硬编码的值,但在这里写它们只是为了举例)。

我应该能够单独捕获事件;这意味着不同领域的不同事件。

我的代码如下所示: 主屏幕类:

     package mypackage;

import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FieldChangeListener;
import net.rim.device.api.ui.container.MainScreen;


    public final class MyScreen extends MainScreen
    {
    CustomFieldManager cfm;

        public MyScreen()
        {
           cfm=new CustomFieldManager(); 
           CustomButtonField cb=new CustomButtonField(Field.FOCUSABLE,20,20,40,40);

           CustomButtonField cb1=new CustomButtonField(Field.FOCUSABLE,70,70,40,40);

           new CustomButtonField(cb,cb1);
           cfm.add(cb); 
           cfm.add(cb1);
           add(cfm);

        }

}


Field class:

package mypackage;

import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FieldChangeListener;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.component.Dialog;

public class CustomButtonField extends Field {
    int a,b,c,d;
    CustomButtonField c1,c2;

    public CustomButtonField(long style,int a,int b,int c,int d){
        super(style);
        this.a=a;
        this.b=b;
        this.c=c;
        this.d=d;
    }
    public CustomButtonField(Object o1,Object o2){
        c1=(CustomButtonField)o1;
        c2=(CustomButtonField)o2;

    }
    public void movefirst(){
        Dialog.alert("god");
    }
protected void drawFocus(Graphics graphics, boolean on) {
}

    protected void layout(int width, int height)     {
setExtent(200, 200);

    }


    protected void paint(Graphics graphics) {

        graphics.drawRect(a, b, c, d);
    }

    protected boolean navigationClick(int status, int time) {
        fieldChangeNotify(0);
        return true;

    }
}


    and manager class :

        package mypackage;

    import net.rim.device.api.system.Bitmap;
    import net.rim.device.api.ui.Field;
    import net.rim.device.api.ui.FieldChangeListener;
    import net.rim.device.api.ui.Manager;
    import net.rim.device.api.ui.component.Dialog;

    public class CustomFieldManager extends Manager {

        CustomButtonField first, second;

        public CustomFieldManager() {
            super(Manager.NO_HORIZONTAL_SCROLL | Manager.NO_VERTICAL_SCROLL);

        }

        protected void sublayout(int arg0, int arg1) {

            int numberOfFields = getFieldCount();

            for (int i = 0; i < numberOfFields; i++) {
                // Get the field.
                first = (CustomButtonField) getField(i);

                setPositionChild(first, 0, 0);

                layoutChild(first, 110, 110);
            }

            setExtent(200, 200);
        }


            setPositionChild(first, 50, 50);
            invalidate();
        }

    }
4

2 回答 2

1

我认为我们需要澄清一下。

BlackBerry Java 中的字段被赋予一个“范围” - 基本上是一个矩形 - 并且它绘制到这个区域。当显示在屏幕上时,该字段范围内的所有“事件”都应由框架自动定向到该字段。就字段而言,范围始终从 0,0 开始,并扩展字段所具有的像素数。事实上,正是这个范围定义了字段的大小。

现在在绘画中,您可以为每个字段绘制您喜欢的内容(只要您保持在其范围内)。因此,如果您有一个范围为 100 x 100 像素的字段,那么您可以通过执行以下操作将字段的左侧涂成红色,将右侧涂成蓝色:

graphics.setColor(Color.Red);

graphics.drawRect(0,0,50,100);

graphics.setColor(Color.Blue);

graohics.drawRect(50,0,100,100);

现在,如果您这样做了,您可能需要单独检测的区域——比如红色和蓝色区域。虽然这是可能的并且您可以使用 touchEvent() 来检测它,但您会发现实际显示两个字段要容易得多,一个全红,一个全蓝。单独的字段使使用标准 BB 方法变得更加容易,此外,还可以使用触控板滚动不同的字段。请记住,您不能在非触控手机上使用 touchevent()。

无论如何,有了这些附加信息,您能否澄清您的问题。你有一个不同领域的领域吗?如果您有两个不同的领域,请记住您在每个领域的范围内进行绘画。

于 2013-08-14T16:10:31.030 回答
1

如果我理解正确,您只需要覆盖此方法:

protected boolean touchEvent(TouchEvent message)

在两个自定义字段类中。并实现您想要的功能。

于 2013-08-14T16:02:54.677 回答