2013-04-10 33 views
28

Używam objectAnimator do animowania przycisku od dołu do góry w systemie Android. Teraz używam poniższy kodJak podać wartości procentowe w ObjectAnimatorze w Androidzie

ObjectAnimator transAnimation = ObjectAnimator.ofFloat(button,"translationY",0,440); 
     transAnimation.setDuration(440); 
     transAnimation.start(); 

Próbowałem również z przykładowym kodem poniżej. Jednak nadal istnieje problem

ObjectAnimator transAnimation = ObjectAnimator.ofFloat(loginLayout, "translationY",0f,0.8f); 
        transAnimation.setDuration(480); 
        transAnimation.start(); 

To działa dobrze w dużych urządzeniach z ekranem. Ale jeśli chodzi o urządzenia z małym ekranem, wychodzi z ekranu. Chcę pozostać w górnej części ekranu niezależnie od różnych rozmiarów ekranu. Myślę, że muszę podać wartości w procentach (powiedzmy 0% do 100% lub 0 do 100% p). Moje pytanie brzmi: jak podawać wartości w procentach w ObjectAnimator w systemie Android. Zauważyłem też jedną rzecz, że obiektAnimator jest wprowadzany tylko w HoneyComb. Czy istnieją też biblioteki kompatybilności wstecznej do uruchamiania w niskich wersjach. Czy ktoś mógłby mnie poprowadzić, aby znaleźć rozwiązanie tego problemu?

Próbowałem również rozszerzać widok i zapisywanie gettera i setera dla właściwości w offset(). Nadal nie przenosi się całkowicie na górę ekranu. Oto kod, którego użyłem.

@SuppressLint("NewApi") public float getXFraction() 
    { 
     int width = context.getWindowManager().getDefaultDisplay().getHeight(); 
     return (width == 0) ? 0 : (getY()); 
    } 

    @SuppressLint("NewApi") public void setXFraction(float xFraction) { 
     int width = context.getWindowManager().getDefaultDisplay().getWidth(); 
     setY((width > 0) ? (width) : 0); 
    } 

Dzięki inadvance

+1

Dla tych, którzy szukają odpowiedzi, [tutaj] (http://stackoverflow.com/a/11015834/1083957) jest obejściem problemu. – azizbekian

Odpowiedz

7

Aby użyć ObjectAnimator na urządzeniach pre-Honeycomb dodać NineOldAndroids bibliotekę do projektu i zmienić swoje importu do korzystania com.nineoldandroids.animation.ObjectAnimator.

Aby użyć wartości procentowe w ObjectAnimator zamiast getXFraction i setXFraction trzeba dodać getYFraction i setYFraction metody jak ten

public float getYFraction() { 
    final WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE); 
    int height = wm.getDefaultDisplay().getHeight(); 
    return (height == 0) ? 0 : getY()/(float) height; 
} 

public void setYFraction(float yFraction) { 
    final WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE); 
    int height = wm.getDefaultDisplay().getHeight(); 
    setY((height > 0) ? (yFraction * height) : 0); 
} 

a następnie można utworzyć plik xml project-folder/res/animator/move_bottom.xml jak ten

<?xml version="1.0" encoding="utf-8"?> 
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" 
    android:duration="500" 
    android:propertyName="yFraction" 
    android:valueFrom="0" 
    android:valueTo="0.8" 
    android:valueType="floatType" /> 

Or utwórz animację w kodzie

final LoginLayout loginLayout = (LoginLayout) findViewById(R.id.login_layout); 
final ObjectAnimator oa = ObjectAnimator.ofFloat(loginLayout, "yFraction", 0f, 0.8f); 
oa.start(); 
+0

Rzeczywiście próbowałem tego ... ale nadal wychodzi z ekranu .. i jeszcze jedna rzecz, która przechodzi nagle do góry ekranu, a następnie wraca na dół. Dlaczego tak się dzieje? czy istnieje jakakolwiek metoda taka jak setFillAfter = "true" w klasie objectAnimator, aby zatrzymać ją w punkcie końcowym i nie powrócić do pierwotnej pozycji. –

+0

Poważnie myślę, że popełniłem kilka błędów w metodzie float (target, propertyName, int, int); ostatnie dwa parametry to int, int. Te parametry decydują o początkowym i końcowym punkcie animacji. Ale w jakiej jednostce metoda oczekuje wartości ... mam na myśli to, czy oczekuje pikseli czy dp. dlaczego nie działa, gdy dowiedziałem się o wysokości ekranu urządzenia i przekazałem wartość do metody ofFloat(). Wciąż wychodzi poza ekran. Dlaczego? Proszę, daj mi znać swoje przemyślenia i sugestie. Czy robię coś złego? –

+0

W metodzie 'ofFloat' ostatnie dwa lub więcej parametrów są zmiennoprzecinkowe. Zobacz oficjalne dokumenty [tutaj] (http://developer.android.com/reference/android/animation/ObjectAnimator.html#ofFloat%28java.lang.Object,%20java.lang.String,%20float...%29) – vasart

2

Jeśli chcesz utworzyć animację spoza ekranu za pomocą ObjectAnimatora. Możesz to zrobić z rozmiarem ekranu Android.

@Override 
    public void onCreate(Bundle savedInstanceState) { 

     ... 

     sampleImage = BitmapFactory.decodeResource(getResources(), R.drawable.sample); 

     myImage = (ImageView) findViewById(R.id.image_view); 
     myImage.setImageBitmap(sampleImage); 

     //In case API Level is 14 above. 
     Display display = getWindowManager().getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 
     float displayWidth = size.x; 

     //In case API Level is 13 below.  
     //WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); 
     //Display display = wm.getDefaultDisplay(); 
     //displayWidth = display.getWidth(); 

     animator = ObjectAnimator.ofFloat(myImage, "translationX", displayWidth, 0); 
     animator.setDuration(500); 

    } 

Przepraszam, jeśli moja sugestia minęła kwestię.

2

Spróbuj użyć właściwość niestandardową dla ObjectAnimator, zamiast tworzyć własny widok z niestandardowego obiektu, można utworzyć właściwość niestandardową, która akceptuje „ułamek”:

Property<View, Float> property = new Property<View, Float>(Float.TYPE, "translation_x_fraction") { 
     @Override public Float get(View view) { 
      return view.getWidth() <= 0 ? 0 : view.getTranslationX()/view.getWidth(); 
     } 

     @Override public void set(View view, Float value) { 
      view.setTranslationX(view.getWidth() * value); 
     } 
} 

ObjectAnimator.ofFloat(view, property, 0f, 1f); 
0

zrobiłem w ten sposób, spędziłem zbyt dużo czasu, ale zaoszczędzi to twój czas.

Argumenty:

  1. Zobacz (Twoje wsparcie View)
  2. nadrzędna szerokość (korzeń swojego zobaczyć)
  3. szerokość Dziecko (na którym chcesz zastosować animację)
  4. % (Ile procent e chcesz przenieść swój obiekt lub widok)

Nie obawiaj się z Argumentami, wyjaśniam tutaj na przykładzie.

XML i JAVA Kod:

activity_main.xml:

<LinearLayout 
    android:id="@+id/llProgressParent" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_margin="5dp" 
    android:layout_gravity="center" 
    android:orientation="horizontal" 
    android:weightSum="1" > 

    <View 
     android:id="@+id/viewSuppot" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="0" > 
    </View> 

    <ImageView 
     android:id="@+id/ivProgressChild" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:src="@drawable/ic_launcher" /> 

</LinearLayout> 

MainActivity.java:

private LinearLayout llProgressParent; 
private View viewSuppot; 
private ImageView ivProgressChild; 
private int childWidth, parentWidth; 
private int percentage = 75; 

na onCreate():

viewSuppot = findViewById(R.id.viewSuppot); 

llProgressParent = (LinearLayout)findViewById(R.id.llProgressParent); 
llProgressParent.post(new Runnable() { 
     @Override 
     public void run() { 
      parentWidth = llProgressParent.getMeasuredWidth(); 
     } 
    }); 


ivProgressChild = (ImageView)findViewById(R.id.ivProgressChild); 
ivProgressChild.post(new Runnable() { 
     @Override 
     public void run() { 
      childWidth = ivProgressChild.getMeasuredWidth(); 
     } 
    }); 

Metoda:

private void animateViewByPercentageOrProgrss(final View view, int parentWidth, int childWidth, int percentage){ 
     try { 
      Thread.sleep(2000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     ValueAnimator anim = ValueAnimator.ofInt(view.getMeasuredWidth(), (int) (((float) percentage * parentWidth)/100)-(childWidth/2)); 
     anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
      @Override 
      public void onAnimationUpdate(ValueAnimator valueAnimator) { 
       int val = (Integer) valueAnimator.getAnimatedValue(); 
       ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); 
       layoutParams.width = val; 
       view.setLayoutParams(layoutParams); 
      } 
     }); 
     anim.setDuration(2000); 
     anim.start(); 
    } 

Jak zadzwonić Metoda:

animateViewByPercentageOrProgrss(viewSuppot, parentWidth, childWidth, percentage); 

Jego Sporządzono.