代码之家  ›  专栏  ›  技术社区  ›  Maksym Gontar

BlackBerry LongClickListener实现

  •  0
  • Maksym Gontar  · 技术社区  · 15 年前

    我需要实施 OnLongClickListener 黑莓平台。
    它可以用于用户输入(例如电话键盘实现)或其他功能(导航、倒带控制、缩放控制等)。 有以下要求:

    • 要侦听的目标控件-自定义按钮字段
    • 它应该是4.5和4.6版本的编译器,因此没有触摸事件等。
    • 可配置的长点击时间

    您对概念和实现有什么建议吗?
    另外,在同一个字段中使用多个侦听器会遇到什么问题?

    谢谢您!

    2 回复  |  直到 15 年前
        1
  •  1
  •   Anthony Rizk    15 年前

    好吧,只是简单的建议。覆盖导航单击和导航松开-风暴将自动将屏幕上的按映射到这些事件。

    您必须使用一个单独的线程或计时器来实际计时单击-否则无法执行此操作(在两个事件中都有时间参数,但您希望在取消单击之前触发事件)。

    另外,如果用户说“松开”,然后在长时间单击间隔内再次单击,那么您必须小心发生什么。可能你想重新启动计时器。

    多个监听器不应该提供任何困难——假设任何类实现监听器都是行为良好的(在回调方法中不进行繁重的处理)。通常,BlackBerry UI组件一次最多可以有1个侦听器(这就是为什么存在setChangeListener而不是addChangeListener的原因)。除非有一个令人信服的理由使用多个监听器来执行Android路线,否则我只使用一个监听器——它将使实现变得更加简单,并且与BB范式保持一致。

        2
  •  2
  •   Maksym Gontar    15 年前

    我遵循了安东尼的建议,使用 TimerTask 和ButtonField。
    以某种方式,用“消费点击”的风格装车。 excludes navigationClick event .
    此外,我还使用了Bold 9000/8900模拟器,导航点击在跟踪轮启动后被触发。 未点击的 . 但样品在暴风雨中效果很好。

    接口:

    public interface LongClickListener {
        public void longClickEvent(Field field, int eventNumber);
    }
    

    控制本身:

    public class LongClickButtonField extends ButtonField { 
    
        boolean mContinuousMode = false;
        Timer mLongClickTimer = null;
    
        long mLongClickDelay = 1000;
        long mContinuousPeriod = 500;   
        LongClickListener mLongClickListener = null;
    
        public LongClickButtonField(String label) {
            super(label);
        }
    
        public LongClickButtonField(String label, boolean continuousMode) {
            this(label);
            mContinuousMode = continuousMode;
        }
    
        public void setLongClickListener(LongClickListener longClickListener) {
            mLongClickListener = longClickListener;
        }
    
        protected boolean navigationClick(int status, int time) {
            mLongClickTimer = new Timer();
            final Field eventArg = this;
            if(!mContinuousMode)
            {
            mLongClickTimer.schedule(new TimerTask() {public void run() {
                mLongClickListener.longClickEvent(eventArg, 0);
            }}, mLongClickDelay);
            }
            else
            {
                mLongClickTimer.schedule(new TimerTask(){
                    int eventNum= 0;
                    public void run() {             
                    mLongClickListener.longClickEvent(eventArg, eventNum);
                    eventNum++;
                }}, mLongClickDelay, mContinuousPeriod);
            }
            return true;
        }
    
        protected boolean navigationUnclick(int status, int time) {
            mLongClickTimer.cancel();
            return true;
        }
    }
    

    用途:

    public class Scr extends MainScreen implements LongClickListener {
        LabelField mStatusLabel = new LabelField("status") {
            protected void paint(Graphics graphics) {
                graphics.setColor(Color.BLACK);
                super.paint(graphics);
            };
        };
    
        public Scr() {
            LongClickButtonField button = new LongClickButtonField(
                    "click & hold 5 s");
            LongClickButtonField buttonContinuous = new LongClickButtonField(
                    "click & hold > 5 s", true);
            button.setLongClickListener(this);
            buttonContinuous.setLongClickListener(this);
            add(mStatusLabel);
            add(button);
            add(buttonContinuous);
        }
    
        public void longClickEvent(final Field field, final int eventNumber) {
            UiApplication.getUiApplication().invokeLater(new Runnable() {
                public void run() {
                    mStatusLabel.setText(  
                            ((ButtonField) field).getLabel()
                            + " event #"  
                            + String.valueOf(eventNumber));
                }
            });
    
        }
    }