【问题标题】:How to attach a rotary scroll listener to Android Wear numberPicker?如何将旋转滚动监听器附加到 Android Wear numberPicker?
【发布时间】:2018-05-17 02:51:57
【问题描述】:

我已经为此工作了一天,但仍然无法弄清楚。我正在为 Android Wear 设备制作一个 Android 应用程序,但我不知道如何检测设备上的转轮以获取滚动事件。我知道默认情况下,旋转轮被分配给 ScrollViews 和 Listviews 等,我已经让它工作了,但我不能让它在一个简单的 NumberPicker 上工作。正如 Google API 所建议的那样,我使用了 OnGenericMotionListener,虽然它没有抛出任何错误,但它仍然没有拾取任何东西。

我希望 NumberPicker 使用转轮滚动。我的代码如下。 logcat 中没有显示任何错误的内容:

                MyActivity.this.setContentView(R.layout.number_picker);
                NumberPicker numberPicker = (NumberPicker) findViewById(R.id.numberPicker1);
                numberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
                numberPicker.setMaxValue(100);       
                numberPicker.setMinValue(0);   
                numberPicker.setWrapSelectorWheel(true);
                numberPicker.setOnValueChangedListener( new NumberPicker.
                    OnValueChangeListener() {
                    public void onValueChange(NumberPicker picker, int
                        oldVal, int newVal) {

                    }          
                });
                numberPicker.setOnGenericMotionListener(new OnGenericMotionListener() {
                    @Override
                    public boolean onGenericMotion(View v, MotionEvent event) {

                        Log.i(TAG, "Received scroll event:" + event.getAction());
                        switch (event.getAction()) {
                        case MotionEvent.ACTION_SCROLL:             

                        }
                        return false;
                    }
                });

【问题讨论】:

    标签: android wear-os android-wear-2.0


    【解决方案1】:

    我想你正在寻找这个:

    Add custom rotary input scrolling:

    如果您的可滚动视图本身不支持旋转输入 滚动,或者如果您想做除滚动之外的其他操作 响应旋转输入事件(放大/缩小、转盘等),您 可以使用可穿戴支持库中的 RotaryEncoder 方法。

    以下代码sn-p展示了如何使用RotaryEncoder添加 在您的应用视图中自定义滚动:

    myView.setOnGenericMotionListener(new View.OnGenericMotionListener() {
        @Override
        public boolean onGenericMotion(View v, MotionEvent ev) {
            if (ev.getAction() == MotionEvent.ACTION_SCROLL && RotaryEncoder.isFromRotaryEncoder(ev)) {
                // Don't forget the negation here
                float delta = -RotaryEncoder.getRotaryAxisValue(ev) * RotaryEncoder.getScaledScrollFactor(
                getContext());
    
                // Swap these axes if you want to do horizontal scrolling instead
                scrollBy(0, Math.round(delta));
    
                return true;
            }
    
            return false;
        }
    });
    

    无论如何,您都可以查看有关 android 中旋转事件的完整指南 穿。

    【讨论】:

    • 这基本上是我已经在使用的代码(除了使用 float 和 scrollBy 项目)。问题是代码根本没有接收到 MotionEvents。
    • @steven 好吧。 Kindley 检查在清单中设置权限是否启用此“运动”事件,如SO post 中所述。
    【解决方案2】:

    文档有点混乱,但都在那里,注意下一段:

    • 旋转输入事件仅发送到焦点视图。这些事件 不要冒泡视图层次结构。如果没有焦点视图,或者 如果焦点视图从 View.onGenericMotionEvent 返回 false, 然后(并且只有那时)事件被发送到 Activity.onGenericMotionEvent。

    基本上,您所要做的就是在您的Activity 上覆盖onGenericMotionEvent,如下所示:

        @Override
        public boolean onGenericMotion(View v, MotionEvent ev) {
            if (ev.getAction() == MotionEvent.ACTION_SCROLL && RotaryEncoder.isFromRotaryEncoder(ev)) {
                // Don't forget the negation here
                float delta = -RotaryEncoder.getRotaryAxisValue(ev) * RotaryEncoder.getScaledScrollFactor(
                getContext());
    
                // Swap these axes if you want to do horizontal scrolling instead
                scrollBy(0, Math.round(delta));
    
                return true;
            }
    
            return false;
        }
    

    就是这样,您的 Activity 将接收所有旋转输入事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多