0

Field クラスを拡張して作成した 2 つのカスタム 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 のフィールドには「範囲」 (基本的には長方形) が与えられ、この領域に描画されます。画面に表示されると、このフィールドの範囲内のすべての「イベント」は、フレームワークによって自動的にそのフィールドに送信されます。Field に関する限り、エクステントは常に 0,0 から始まり、Field のピクセル数だけ拡張されます。実際、フィールドのサイズを定義するのはこの範囲です。

ペイント内で、各フィールドに好きなようにペイントできます (範囲内にいる限り)。したがって、たとえば 100 x 100 ピクセルの範囲を持つフィールドがある場合、次のようにして、フィールドの左側を赤く、右側を青くペイントします。

graphics.setColor(Color.Red);

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

graphics.setColor(Color.Blue);

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

これを行った場合、赤と青の領域など、別々に検出可能な領域が必要になる場合があります。これは可能であり、touchEvent() を使用して検出できますが、実際には 2 つのフィールド (1 つはすべて赤、もう 1 つはすべて青) を表示する方がはるかに簡単です。個別のフィールドにより、標準の BB メソッドの使用がはるかに簡単になり、さらに、トラックパッドを使用してさまざまなフィールドをスクロールすることも可能になります。非タッチ電話では touchevent() を使用できないことに注意してください。

とにかく、この追加情報を使用して、質問を明確にしていただけますか。異なるエリアを持つ 1 つのフィールドがありますか? 2 つの異なるフィールドがある場合は、各フィールドの範囲内でペイントしていることに注意してください。

于 2013-08-14T16:10:31.030 に答える