48 votes

Traduire par programme Voir Pre-Honeycomb

Comment puis-je traduire par programme l'arbitraire d'un point de vue, sans l'aide d'une animation (android.view.animation.*)?

API 11 introduites setTranslationX et setTranslationY, setX et setY, et getMatrix—tout ce qui peut être utilisé pour accomplir ce que je suis à la recherche pour. Je n'arrive pas à trouver un équivalent sur l'avant de l'API de niveau, cependant.

L' android.view.animation.TranslateAnimation utilise getMatrix dans sa mise en œuvre (d'aussi loin que l'API 4), mais c'est une API privée pendant tout ce temps.

Est-il possible de réaliser cela sans avoir recours à la réflexion?

14voto

Devunwired Points 27023

Ajoutés à vos favoris parce que j'aimerais avoir tort sur ce point, mais j'ai couru dans le même mur lors d'un Glisser-Déposer des enquêtes quelque temps auparavant.

Je suis sûr que vous êtes coincé avec offsetTopAndBottom() et offsetLeftAndRight() pour le déplacement d'un View autour de sans une animation au début de l'Api. Le gros inconvénient est que ces méthodes réellement modifier le haut/le bas/la gauche/la droite des valeurs, de sorte que vous avez à faire un peu assez lourd de suivi si vous voulez revenir à l'endroit où vous avez commencé à partir.

Une autre option serait d'utiliser un TranslateAnimation avec une durée TRÈS courte et mis à l' fillAfter...

D'autres exigent que le sous-classement, et ne sont toujours pas assez, comme la traduction de la Canvas le View s'appuie sur. Le problème ici est que vous devez créer un parent qui n'a pas de clip c'est les enfants, de sorte que la vue peut dessiner en dehors de ses propres limites.

11voto

Grishka Points 481

Oui, vous pouvez utiliser TranslateAnimation. Avec fillAfter défini sur true, votre vue restera traduite même après la fin de l'animation. Voici un exemple:

 TranslateAnimation anim=new TranslateAnimation(0, 0, 20, 20);
anim.setFillAfter(true);
anim.setDuration(0);
yourView.startAnimation(anim);
 

6voto

Matt Cosentino Points 216

La réponse de Grishka m'a beaucoup aidé et fonctionne parfaitement. Afin d'animer la traduction à l'aide de l'API Honeycomb avec nineoldandroids, j'ai configuré un FloatEvaluator pour la valeur de traduction, puis utilisé setTranslationX sur Honeycomb + ou la méthode TranslateAnimation. Voici mon code:

 public class TranslationXEvaluator extends FloatEvaluator {

private View view;

public TranslationXEvaluator(View view) {
    this.view = view;
}

@Override
public Float evaluate(float fraction, Number startValue, Number endValue) {
    float translationX = super.evaluate(fraction, startValue, endValue);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        view.setTranslationX(translationX);
    } else {
        TranslateAnimation anim = new TranslateAnimation(translationX, translationX, 0, 0);
        anim.setFillAfter(true);
        anim.setDuration(0);
        view.startAnimation(anim);
    }
    return translationX;
}

}
 

1voto

JLK Points 567

J'avais le même problème. J'ai pu réaliser la traduction en manipulant les paramètres de mise en page, en particulier les marges, des vues que je voulais traduire. Vous pouvez utiliser des valeurs négatives pour les marges btw.

1voto

nms Points 126

Une alternative à TranslateAnimation consiste à sous-classer une vue et à traduire le canevas sur dispatchDraw. Quelque chose comme:

  public class TranslateView extends View {

        private float mTranslationX = 0;
        private float mTranslationY = 0;
        private boolean mWillUseSDKTranslation = true;

        @Override
        protected void dispatchDraw(final Canvas canvas) {
            if (mWillUseSDKTranslation == false) {
                // keep track of the current state
                canvas.save(Canvas.MATRIX_SAVE_FLAG);
                // translate
                canvas.translate(mTranslationX, mTranslationY);
                // draw it
                super.dispatchDraw(canvas);
                // restore to the previous state
                canvas.restore();
            } else {
                super.dispatchDraw(canvas);
            }
        }

        public void setTranslationValue(final float aTranslationX, final float aTranslationY) {
            if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
                mWillUseSDKTranslation = false;
                mTranslationX = aTranslationX;
                mTranslationY = aTranslationY;
                invalidate();
            } else {
                setTranslationX(aTranslationX);
                setTranslationY(aTranslationY);
            }
        }

    }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X