2016-02-25 12 views
8

Nie wiem dlaczego, ale ja dostaję ten dziwny błąd, gdy używam operatora potrójny na tym przykładzie:Dziwne zachowanie przy użyciu potrójny operator Java na Android

Screenshot of the strange behavior of setInterpolator

myślę, że to związane ze sposobem Java przekazuje wynik od operatora, ale dzieje się tak tylko w niektórych szczególnych przypadkach.

Dzięki za wszelkie wyjaśnienia.

Uwaga: Szukałem jednego, ale mogłem znaleźć tylko odpowiedzi związane z NPE.

-Edit-

Aplikacja korzysta:

  • compileSdkVersion 23
  • buildToolsVersion '23 .0.2'
  • minSdkVersion 14
  • targetSdkVersion 23
  • Android Pomoc Biblioteka 23.2. 0

Test wykonany na Androidzie Studio 2.0 Beta 5 z odpowiednią wersją stopniową

+2

których poziom API nie można ustawić dla swojej aplikacji? ponieważ 'LinearInterpolator' rozszerza' BaseInterpolator', który [wymaga poziomu api 22] (http://developer.android.com/reference/android/view/animation/BaseInterpolator.html) –

+0

Zmień minSdkVersion na 22 ... – brso05

+0

to defenetly chcą ustawiłeś wersję min api na 22., ponieważ publiczna nieważna setInterpolator (wartość TimeInterpolator), ale ustawiłeś linearinterpolator, który rozszerza interpolator bazowy –

Odpowiedz

11

Przyczyną jest sposób pracy operatorów trójskładnikowych.

Zawsze rzuca zarówno Obiekty do niego najbliżej Super typ wspólne dla obu obiektów. W twoim przypadku jest to BaseInterpolator, ponieważ twoja wersja targetSDK jest ustawiona na 23.

Ale ponieważ minSDK to 14, rzutowanie nie działa na wszystkich urządzeniach. Stąd błąd.

Aby naprawić, można dodać jawną obsadkę TimeInterpolator do obu obiektów.

0

to naprawić kodem następująco:

public class MyDecelerateInterpolator implements Interpolator { 

    private DecelerateInterpolator interpolator = null; 

    public MyDecelerateInterpolator() { 
     interpolator = new DecelerateInterpolator(); 
    } 

    public MyDecelerateInterpolator(float factor) { 
     interpolator = new DecelerateInterpolator(factor); 
    } 

    @Override 
    public float getInterpolation(float input) { 
     return interpolator.getInterpolation(input); 
    } 
} 
+0

Dodaj wyjaśnienie w odpowiedzi na pytanie, w jaki sposób ta odpowiedź pomaga OP w naprawianiu bieżącego problemu. –

+0

Przeczytałem kod DeccelerateInterpolator. Implementuje BaseInterpolator i implementuje Interpolator. BaseInterpolator nie dodał żadnej abstrakcyjnej metody. Oznacza to, że te dwie klasy mają tę samą abstrakcyjną metodę o nazwie getInterpolation (wejście float). Nie wiem, dlaczego błąd został pokazany, ale dopóki metoda abstrakcyjna jest taka sama, możemy zdefiniować klasę, która implementuje interpolator i opakowuje DecelerateInterpolator. Tak więc nie widać więcej błędów. –

Powiązane problemy