Подтвердить что ты не робот

SetPivotX работает странно при масштабированном представлении

Я узнал, что setPivotX (также setPivotY) работает странно в Android. Если вы установите точку поворота, когда масштаб просмотра установлен на 1.00f, ничего не происходит (только изменения поворота). Но если масштаб не равен 1.0f (например, setScaleX(0.9f)), и вы устанавливаете точку поворота, вид перемещается относительно (?) На новый опорный стержень. Разве это не странно? Я знаю, что горизонтальные и вертикальные положения (переводы) не связаны со значением поворота, но почему вид движется с масштабным коэффициентом, чем другие 1.0f?

Пожалуйста, проверьте это с помощью и без масштабирующей части.

public class ScaleView extends View {

private final ScaleGestureDetector mScaleGestureDetector;

public ScaleView(Context context, AttributeSet attrs) {
    super(context, attrs);


    //setScaleX(0.9f);
    //setScaleY(0.9f);

    mScaleGestureDetector = new ScaleGestureDetector(context, new ScaleGestureDetector.OnScaleGestureListener() {

        @Override
        public void onScaleEnd(ScaleGestureDetector detector) {
            // does nothing intentionally
        }

        @Override
        public boolean onScaleBegin(ScaleGestureDetector detector) {
            setPivotX(detector.getFocusX());
            setPivotY(detector.getFocusY());
            return true;
        }

        @Override
        public boolean onScale(ScaleGestureDetector detector) {
            return false;
        }
    });
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    mScaleGestureDetector.onTouchEvent(event);
    return super.onTouchEvent(event);
}
}

Как установить ту же позицию зрения, которая была до поворота изменилось?

4b9b3361

Ответ 1

Я решил проблему. Вот рабочий код:

@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
    float newX = detector.getFocusX();
    float newY = detector.getFocusY();
    setTranslationX(getTranslationX() + (getPivotX() - newX) * (1 - getScaleX()));
    setTranslationY(getTranslationY() + (getPivotY() - newY) * (1 - getScaleY()));
    setPivotX(newX);
    setPivotY(newY);
    return true;
}

Основная проблема заключается в том, чтобы понять, как pivot работает с масштабированными представлениями, тогда не должно быть никаких проблем со странным поворотным поведением.

Ответ 2

@aleien, я могу ответить на ваш вопрос. При установке нового шарнира, вид свойства будут пересчитаны. Android перетаскивает исходное представление с помощью нового поворота, но такое же значение шкалы, которое приводит к новому масштабированному представлению, имеет смещение между старым масштабированным представлением. Смещение составляет всего (getPivotX() - newX) * (1 - getScaleX()), чтобы противодействовать этому смещению, мы можем использовать setTranslationX(). Надеюсь, мой ответ поможет вам!