Программно Перевести Просмотр Pre-Honeycomb - PullRequest
48 голосов
/ 05 января 2012

Как программно перевести произвольное представление без использования анимации (android.view.animation.*)?

API 11 представлен setTranslationX и setTranslationY, setX и setY и getMatrix- все из которых можно использовать для достижения того, что я ищу.Однако я не могу найти эквивалент на предыдущих уровнях API.

android.view.animation.TranslateAnimation использует getMatrix в своей реализации (еще в API 4), но это было частное API на протяжении всего этого времени.

Есть ли способ сделать это, не прибегая к рефлексии?

Ответы [ 7 ]

14 голосов
/ 05 января 2012

В избранное, потому что я бы хотел оказаться неправым в этом, но я столкнулся с подобной стеной, когда некоторое время назад проводил некоторые исследования Drag-n-Drop.

Я почти уверен, что вы застрялис offsetTopAndBottom() и offsetLeftAndRight() для перемещения View без анимации в ранних API.Большим недостатком здесь является то, что эти методы на самом деле изменяют верхние / нижние / левые / правые значения, поэтому вам нужно выполнить довольно тяжелое отслеживание, если вы хотите вернуться к тому, с чего начали.просто использовать TranslateAnimation с ОЧЕНЬ короткой продолжительностью и установить fillAfter ...

Другие варианты требуют создания подклассов, и все же они не такие красивые, как перевод Canvas в Viewопирается на.Проблема здесь в том, что вам также нужно создать родителя, который не обрезает своих детей, чтобы представление могло рисовать за пределами своих границ.

11 голосов
/ 05 января 2012

Да, вы можете использовать TranslateAnimation.Если для атрибута fillAfter установлено значение true, ваше представление останется переведенным даже после завершения анимации.Вот пример:

TranslateAnimation anim=new TranslateAnimation(0, 0, 20, 20);
anim.setFillAfter(true);
anim.setDuration(0);
yourView.startAnimation(anim);
6 голосов
/ 31 июля 2012

Ответ Гришки мне очень помог, отлично работает.Чтобы анимировать перевод с помощью Honeycomb API с девятью андроидами, я установил FloatEvaluator для значения перевода и затем использовал setTranslationX для Honeycomb + или метод TranslateAnimation.Вот мой код:

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

}
1 голос
/ 11 марта 2014

Одной альтернативой TranslateAnimation является создание подкласса View и перевод Canvas в dispatchDraw. Что-то вроде:

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

    }
1 голос
/ 19 апреля 2012

У меня была такая же проблема. Мне удалось добиться перевода путем манипулирования параметрами макета, в частности полями, представлений, которые я хотел перевести. Вы можете использовать отрицательные значения для полей между прочим.

0 голосов
/ 18 апреля 2015

Обходной путь, который я нашел, состоял в том, чтобы установить отрицательные поля, используя:

layoutParams.setMargins(left, top, right, bottom);
yourView.setLayoutParams(layoutParams);
0 голосов
/ 27 января 2014

Вы также можете попробовать этот код: https://github.com/BeyondAR/beyondar/blob/development/android/BeyondAR_Framework/src/com/beyondar/android/view/CustomLayout.java

Используйте метод setPosition.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...