1

Я пытаюсь получить колесо номерного анимированного. Я нашел соответствующий вопрос здесь:Android NumberPicker анимировать колесо при использовании метода setValue

How to change NumberPicker's value with animation?

Но я не могу решить с suppposed ответы. Может кто-нибудь, пожалуйста, помогите мне?

При изменении значения numberPicker от let от 100 до 200, я хочу, чтобы колесо увеличивалось от старого значения до нового. Колесо должно скользить к новому значению. В ссылке passsy решила ее с отражением, но я не знаю, как ее использовать на практике.

ответ

0

Это действительно просто, если вы хотите увеличить значение на один.

просто позвоните changeValueByOne(myNumberPicker, true);, чтобы увеличить цифровую цифру на единицу с анимацией. (Ложно декремент)

приращение от 100-200 не представляется возможным с помощью этого метода

  /** 
      * using reflection to change the value because 
      * changeValueByOne is a private function and setValue 
      * doesn't call the onValueChange listener. 
      * 
      * @param higherPicker 
      *   the higher picker 
      * @param increment 
      *   the increment 
      */ 
      private void changeValueByOne(final NumberPicker higherPicker, final boolean increment) { 

      Method method; 
      try { 
       // refelction call for 
       // higherPicker.changeValueByOne(true); 
       method = higherPicker.getClass().getDeclaredMethod("changeValueByOne", boolean.class); 
       method.setAccessible(true); 
       method.invoke(higherPicker, increment); 

      } catch (final NoSuchMethodException e) { 
       e.printStackTrace(); 
      } catch (final IllegalArgumentException e) { 
       e.printStackTrace(); 
      } catch (final IllegalAccessException e) { 
       e.printStackTrace(); 
      } catch (final InvocationTargetException e) { 
       e.printStackTrace(); 
      } 
     } 
+0

Ok спасибо. Я попробовал его с каким-то циклом «за» от 100 до 200, но я не буду обновлять пользовательский интерфейс. Вы думаете, что это возможно с помощью этого метода или нет? – KelvinGradCelsius

+0

нет с этим методом. посмотрите на источник сборщика, чтобы посмотреть, как он работает. Но я думаю, вы должны использовать пользовательский сборщик. – passsy

+0

Ответ на вопрос. Спасибо за быструю поддержку! – KelvinGradCelsius

1

Спасибо @passsy. Вдохновленный его ответ: Это решение поддерживает несколько шагов приращения/уменьшения. Кроме того, может быть выполнен с стартовой задержкой и для несколько numberPickers (без дополнительного кодирования).

class IncreaseValue { 
    private int counter = 0; 
    private final NumberPicker picker; 
    private final int incrementValue; 
    private final boolean increment; 

    private final Handler handler = new Handler(); 
    private final Runnable fire = new Runnable() { @Override public void run() { fire(); } }; 

    /*public*/ IncreaseValue(final NumberPicker picker, final int incrementValue) { 
     this.picker = picker; 
     if (incrementValue > 0) { 
      increment = true; 
      this.incrementValue = incrementValue; 
     } else { 
      increment = false; 
      this.incrementValue = -incrementValue; 
     } 
    } 

    /*public*/ void run(final int startDelay) { 
     handler.postDelayed(fire, startDelay); // This will execute the runnable passed to it (fire) 
     // after [startDelay in milliseconds], ASYNCHRONOUSLY. 
    } 

    private void fire() { 
     ++counter; 
     if (counter > incrementValue) return; 

     try { 
      // refelction call for 
      // picker.changeValueByOne(true); 
      final Method method = picker.getClass().getDeclaredMethod("changeValueByOne", boolean.class); 
      method.setAccessible(true); 
      method.invoke(picker, increment); 

     } catch (final NoSuchMethodException | InvocationTargetException | 
       IllegalAccessException | IllegalArgumentException e) { 
      Log.d(TAG, "...", e); 
     } 

     handler.postDelayed(fire, 120); // This will execute the runnable passed to it (fire) 
     // after 120 milliseconds, ASYNCHRONOUSLY. Customize this value if necessary. 
    } 
} 

Использование:

// Suppose picker1 as a NumberPicker 
IncreaseValue increasePicker1 = new IncreaseValue(picker1, 10); // So picker1 will be increased 10 steps. 
increasePicker1.run(0); // Increase immediately. If you want to run it from onCreate(), onStart() or ... of your activity, you will probably need to pass a positive value to it (e.g. 100 milliseconds). 
Смежные вопросы