如何将旋转滚动侦听器附加到Android Wear numberPicker?

时间:2018-05-17 02:51:57

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

我已经在这工作了一天,但仍然无法弄明白。我正在为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;
                    }
                });

2 个答案:

答案 0 :(得分:0)

我认为你正在寻找这个:

Add custom rotary input scrolling

  

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

     

以下代码段显示了如何使用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中旋转事件的完整指南  磨损。

答案 1 :(得分:0)

文档有点令人困惑,但它就在那里,注意下一段:

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

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

    @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;
    }

这就是你的活动将收到所有旋转输入事件。