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);
}
}
Как установить ту же позицию зрения, которая была до поворота изменилось?
Ответы
Ответ 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()
. Надеюсь, мой ответ поможет вам!