setPivotX在缩放视图上工作奇怪

时间:2013-01-19 13:53:14

标签: android view pivot scale

我发现setPivotX(也setPivotY)在Android中很奇怪。如果在视图的比例设置为1.00时设置了枢轴,则不会发生任何事情(只是枢轴更改)。但如果比例不等于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);
}
}

如何在枢轴更改之前设置视图的相同位置?

2 个答案:

答案 0 :(得分:8)

我解决了这个问题。这是工作代码:

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

主要问题是了解枢轴如何在缩放视图上工作,那么奇怪的枢轴行为应该没有任何问题。

答案 1 :(得分:1)

@aleien,我可以回答你的问题。设置新数据透视表时,将重新计算视图的属性。 Android使用新的数据透视表重新缩放原始视图,但导致新缩放视图的相同比例值在旧的缩放视图之间存在偏移。偏移量只是(getPivotX() - newX) * (1 - getScaleX()),为了抵消这种偏移,我们可以使用setTranslationX()。希望我的回答可以帮到你!