在黑莓中单独捕获两个字段上的事件

时间:2013-08-14 10:58:46

标签: blackberry

我想在我通过扩展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();
        }

    }

2 个答案:

答案 0 :(得分:1)

如果我理解你,你只需要覆盖这个方法:

protected boolean touchEvent(TouchEvent message)

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

答案 1 :(得分:1)

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

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

现在在绘画中,您可以为每个场绘制您喜欢的内容(只要您保持在其范围内)。因此,如果你有一个范围为100 x 100像素的Field,那么你可以通过这样的方式绘制Field红色的左侧和右侧的蓝色:

graphics.setColor(Color.Red);

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

graphics.setColor(Color.Blue);

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

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

无论如何,有了这些附加信息,请您澄清一下您的问题。你有一个不同区域的场地吗?如果您有两个不同的字段,请记住您在每个字段的范围内进行绘制。