2013-04-10 12 views
28

Sto usando objectAnimator per animare un pulsante dal basso verso l'alto in Android. Ora sto usando il codice qui sottoCome assegnare valori percentuali in ObjectAnimator in Android

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

Ho anche provato con il codice di esempio riportato di seguito. Ma ancora il problema esiste

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

Funziona bene in dispositivi a grande schermo. Ma quando si tratta di dispositivi con schermo piccolo, lo schermo si spegne. Voglio rimanere nella parte superiore dello schermo indipendentemente dalle diverse dimensioni dello schermo. Penso di dover dare valori in percentuale (diciamo dallo 0% al 100% o dallo 0 al 100% p). Quindi la mia domanda è come dare valori in percentuale in objectAnimator in Android. Ho notato anche una cosa che questo objectAnimator è stato introdotto solo in HoneyComb. Quindi ci sono eventuali librerie di compatibilità a ritroso per eseguirlo in versioni basse. Qualcuno potrebbe guidarmi a trovare una soluzione per questo.

Ho anche provato ad estendere View e scrivere getter e setter per la proprietà in offset(). Ancora non si muove completamente nella parte superiore dello schermo. Ecco il codice che ho usato.

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

Grazie inadvance

+1

Per coloro che cercano la risposta, [qui] (http://stackoverflow.com/a/11015834/1083957) è la soluzione alternativa. – azizbekian

risposta

7

Per utilizzare ObjectAnimator su dispositivi pre-Honeycomb Aggiungi NineOldAndroids biblioteca al progetto e cambiare le vostre importazioni da usare com.nineoldandroids.animation.ObjectAnimator.

di utilizzare valori percentuali in ObjectAnimator invece di getXFraction e setXFraction si deve aggiungere getYFraction e setYFraction metodi come questo

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

e quindi è possibile creare file XML project-folder/res/animator/move_bottom.xml come questo

<?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 creare animazione nel codice

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

infatti ho provato questo ... ma va ancora fuori dallo schermo .. e un'altra cosa diventa improvvisa alla parte superiore dello schermo e poi torna in fondo. Perché succede? esiste un metodo come setFillAfter = "true" nella classe objectAnimator per fermarlo nel punto finale e non tornare alla posizione originale. –

+0

Credo seriamente di aver commesso alcuni errori nel metodo di Float (target, propertyName, int, int); gli ultimi due parametri sono int, int. Questi parametri decidono il punto iniziale e finale dell'animazione. Ma in quale unità il metodo si aspetta i valori ... voglio dire se si aspetta pixel o in dp. perché non funziona quando ho trovato l'altezza dello schermo del dispositivo e ho passato il valore al metodo Float(). Comunque va oltre lo schermo. Perché? Fammi sapere i tuoi pensieri e suggerimenti. Sto facendo qualcosa di sbagliato? –

+0

Nel metodo 'ofFloat' gli ultimi due o più parametri sono float. Vedi documenti ufficiali [qui] (http://developer.android.com/reference/android/animation/ObjectAnimator.html#ofFloat%28java.lang.Object,%20java.lang.String,%20float...%29) – vasart

2

Se si desidera creare un'animazione dall'esterno dello schermo con ObjectAnimator. Puoi farlo con le dimensioni del display 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); 

    } 

Siamo spiacenti, se il mio suggerimento mancato il punto.

2

Provare a usare una proprietà personalizzata per ObjectAnimator, invece di creare visualizzazione personalizzata con proprietà personalizzata, è possibile creare una proprietà personalizzata che accetta un 'frazione':

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

che ho fatto in questo modo, ho speso troppo molto tempo ma ti farà risparmiare tempo.

Argomenti:

  1. Vista (Il vostro sostegno View)
  2. larghezza Parent (Root della vostra View)
  3. larghezza Bambino (su cui si desidera applicare Animazione)
  4. % (Quota percentuale e vuoi spostare il tuo oggetto o vista)

Non temere con Argomenti, sto spiegando qui con l'esempio.

XML e JAVA codice:

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; 

su 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(); 
     } 
    }); 

Metodo:

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(); 
    } 

Come per chiamare Metodo:

animateViewByPercentageOrProgrss(viewSuppot, parentWidth, childWidth, percentage); 

suo fare.

Problemi correlati