web-dev-qa-db-fra.com

Comment donner des valeurs de pourcentage dans ObjectAnimator dans Android

J'utilise objectAnimator pour animer un bouton de bas en haut dans Android. Maintenant j'utilise le code ci-dessous

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

J'ai également essayé avec l'exemple de code ci-dessous. Mais le problème existe toujours

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

Cela fonctionne bien dans les appareils à grand écran. Mais quand il s'agit de petits appareils à écran, il disparaît de l'écran. Je veux le garder en haut de l'écran, indépendamment des différentes tailles d'écran. Je pense que je dois donner des valeurs en pourcentage (disons 0% à 100% ou 0 à 100% p). Ma question est donc de savoir comment donner des valeurs en pourcentage dans objectAnimator dans Android. J'ai également remarqué une chose que cet objetAnimator n'est introduit que dans HoneyComb. Il existe donc des bibliothèques de compatibilité descendante pour l'exécuter dans les versions basses. Quelqu'un pourrait-il me guider pour trouver une solution à cela.

J'ai également essayé d'étendre View et d'écrire getter et setter pour la propriété dans offset(). Pourtant, il ne se déplace pas complètement en haut de l'écran. Voici le code que j'ai utilisé.

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

Merci d'avance

29
Sanal Varghese

Pour utiliser ObjectAnimator sur les appareils pré-Honeycomb, ajoutez NineOldAndroids à votre projet et modifiez vos importations pour utiliser com.nineoldandroids.animation.ObjectAnimator.

Pour utiliser des valeurs de pourcentage dans ObjectAnimator au lieu de getXFraction et setXFraction, vous devez ajouter getYFraction et setYFraction des méthodes comme celle-ci

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

Et puis vous pouvez créer un fichier xml project-folder/res/animator/move_bottom.xml comme ça

<?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" />

Ou créez une animation dans le code

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

Essayez d'utiliser une propriété personnalisée pour ObjectAnimator, au lieu de créer une vue personnalisée avec une propriété personnalisée, vous pouvez créer une propriété personnalisée qui accepte une "fraction":

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);
2
droidfans.liu

Si vous souhaitez créer une animation depuis l'extérieur de l'écran avec ObjectAnimator. Vous pouvez le faire avec Android taille d'affichage.

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

    }

Désolé, si ma suggestion a manqué le point.

2
ataru

J'ai fait comme ça, j'ai passé trop de temps mais ça vous fera gagner du temps.

Arguments:

  1. Voir (Votre vue de support)
  2. Largeur parent (Racine de votre vue)
  3. largeur enfant (sur lequel vous souhaitez appliquer l'animation)
  4. % (Combien de pourcentage vous souhaitez déplacer votre objet ou vue)

N'ayez pas peur avec Arguments, j'explique ici par exemple.

XML et Java code:

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;

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

Méthode:

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

Comment appeler Méthode:

animateViewByPercentageOrProgrss(viewSuppot, parentWidth, childWidth, percentage);

C'est fait.

0
Hiren Patel