单击按钮外部区域时激活按钮(Java / Blackberry App)

时间:2013-01-19 14:10:24

标签: java eclipse blackberry blackberry-simulator blackberry-eclipse-plugin

我一直在研究黑莓的应用程序,它在屏幕上有两个按钮(btn1btn2)。现在我添加了第三个,我遇到了一些困难(btn3)。

最初btn1btn2并排,点击按钮外部,但在它下方会激活按钮......设计缺陷但可能会被忽略。

但是,我需要在btn1下面添加一个按钮,当我这样做时,发生了两件奇怪的事情:首先是,即使我点击btn3下面的btn1,焦点也是如此转移到btn1并调用btn1。点击btn2会将焦点转移到btn3并激活它。

我不完全确定为什么会这样,但我正在玩下面粘贴的代码。感谢任何一点帮助。

    btn1 = new CustomButtonField("", Bitmap.getBitmapResource("button-disabled_1a.png"), Bitmap.getBitmapResource("button-normal_2.png"));      
    btn2 = new CustomButtonField("", Bitmap.getBitmapResource("button-disabled_3.png"), Bitmap.getBitmapResource("button-normal_4.png"));
    btn3 = new CustomButtonField("", Bitmap.getBitmapResource("button-disabled5.png"), Bitmap.getBitmapResource("button-normal_6.png"));

    Background bg = BackgroundFactory.createBitmapBackground(Bitmap.getBitmapResource("background.png"));

    HorizontalFieldManager vfm = new HorizontalFieldManager(){
        public int getPreferredHeight() {
            // TODO Auto-generated method stub
            return Display.getHeight();
        }

        public int getPreferredWidth() {
            // TODO Auto-generated method stub
            return Display.getWidth();
        }

        protected void sublayout(int maxWidth, int maxHeight) {
            // TODO Auto-generated method stub
            int count = getFieldCount();
            for(int i = 0 ; i < count ; i++ ){
                Field f = getField(i);

             if(f == btn1 ){
                 setPositionChild(f, (getPreferredWidth() >> 1) - f.getPreferredWidth(), getPreferredHeight()>>1);
                    layoutChild(f, getPreferredWidth(), getPreferredHeight());
                }else if (f == btn2 ){
                    setPositionChild(f, (getPreferredWidth() >> 1) +30, getPreferredHeight()>>1);
                    layoutChild(f, getPreferredWidth(), getPreferredHeight());
                }else if (f == lblName ){
                    setPositionChild(f, 30, getPreferredHeight()>>1 - btnLicense.getPreferredHeight());
                    layoutChild(f, ( getPreferredWidth() * 3 ) >> 2, getPreferredHeight());
                }else if (f == btn3 ){

                    setPositionChild(f, (getPreferredWidth() >> 1) - f.getPreferredWidth() -0 ,  getPreferredHeight()- getPreferredHeight()+280);
                    layoutChild(f, getPreferredWidth(), getPreferredHeight());
                }

            }
            setExtent(getPreferredWidth(),getPreferredHeight());
        }

        public void subpaint(Graphics graphics){
            int count = getFieldCount();
            for(int i = 0 ; i < count ; i++ ){
                net.rim.device.api.ui.Field f = getField(i);
                paintChild(graphics,f);
            }
        }

    };

自定义按钮字段

package com.app.ui.component;

import net.rim.device.api.system.Bitmap;
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.Graphics;

public class CustomButtonField extends Field {

    /** To set background image for button field */
    private Bitmap bkImage;

    /** To set Focus image for button field */
    private Bitmap bkFocusImage;

    /** int value for Field Width */
    private int fieldWidth;

    /** int value for Field Height */
    private int fieldHeight;

    /** Text to write on Button */
    private String text;

    /** Text Color on Button */
    private int textColor = Color.WHITE;

    /** Default Font for Button */
    private Font defaultFont = Font.getDefault();

    /**
     * Constructor with
     * @param text
     * @param image
     * @param focusImage
     */
    public CustomButtonField (String text, Bitmap image, Bitmap focusImage) {   
        this(text, image, focusImage, 0);
    }

    /**
     * Constructor with
     * @param text
     * @param image
     * @param focusImage
     * @param style
     */
    public CustomButtonField(String text, Bitmap image, Bitmap focusImage, long style) {
        super(Field.FOCUSABLE | style);
        this.text = text;
        bkImage = image;
        this.bkFocusImage = focusImage;
        fieldHeight = bkImage.getHeight();
        fieldWidth = bkImage.getWidth();
    }

    /**
     * To get the exact width needed by the field borderWidth - used to show the
     * width of focused rectangle around the button
     */
    public int getPreferredWidth() {
        return fieldWidth;
    }

    /**
     * To get the exact width needed by the field borderHeight - used to show
     * the height of focused rectangle around the button
     */
    public int getPreferredHeight() {
        return fieldHeight;
    }

    protected void layout(int width, int height) {
        setExtent(getPreferredWidth(), getPreferredHeight());
    }

    /**
     * To set the background according to focused state of the field
     */
    protected void drawFocus(Graphics graphics, boolean flag) {
        graphics.setFont(defaultFont);
        if (bkFocusImage != null) {
            graphics.drawBitmap((getPreferredWidth() - bkFocusImage.getWidth()) / 2,(getPreferredHeight() - bkFocusImage.getHeight()) / 2,
                    bkFocusImage.getWidth(), bkFocusImage.getHeight(),bkFocusImage, 0, 0);
        }
        graphics.setColor(Color.WHITE);
        int textWidth = defaultFont.getAdvance(text);
        graphics.drawText(text, (fieldWidth - textWidth) / 2,(fieldHeight - defaultFont.getHeight()) / 2);
    }

    protected void paint(Graphics graphics) {
        graphics.setFont(defaultFont);
        if (bkImage != null) {
            graphics.drawBitmap((getPreferredWidth() - bkImage.getWidth()) / 2,(getPreferredHeight() - bkImage.getHeight()) / 2,
                    bkImage.getWidth(), bkImage.getHeight(), bkImage, 0, 0);
        } 
        graphics.setColor(textColor);
        int color = (isEnabled())?Color.BLACK:Color.DARKGRAY;
        graphics.setColor(color);

        int textWidth = defaultFont.getAdvance(text);
        graphics.drawText(text, (fieldWidth - textWidth) / 2,(fieldHeight - defaultFont.getHeight()) / 2);
    }

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

1 个答案:

答案 0 :(得分:2)

当您第一次实施自定义BlackBerry按钮和字段时,这是一个非常简单的问题。首先,这里的问题是你的CustomButtonField类是一个从头开始写的按钮字段,它没有正确地确定哪个触摸事件(或导航事件)在其范围内(在田地里面。)

解决此问题的一种方法是修改navigationClick()方法,并实施touchEvent()方法:

   protected boolean touchEvent( TouchEvent message )    {
      int x = message.getX( 1 );        
      int y = message.getY( 1 );        
      if( x < 0 || y < 0 || x > getExtent().width || y > getExtent().height ) {
         // Outside the field            
         return false;       
      }        

      switch( message.getEvent() ) {                  
      case TouchEvent.UNCLICK:                
         fieldChangeNotify(0);               
         return true;        
      }        
      return super.touchEvent( message );    
   }

   protected boolean navigationClick(int status, int time) {
      if (status != 0) {        // you did not have this check
         fieldChangeNotify(0);
      }
      return true;
   }

我实际建议的另一个选择是用BlackBerry Advanced UI library

中的一个样本替换整个CustomButtonField课程

您可以使用BitmapButtonField及其扩展的BaseButtonField来实现相同的功能,并通过正确的触摸/点击处理。

当你在那里时,看一下该库中的其他一些UI类,因为你可能会发现它们非常有用。