2013-01-19 48 views
12

我发现,setPivotX(也setPivotY)在Android中奇怪的作品。如果在视图的比例设置为1.00时设置pivot,则不会发生任何事情(只是透视更改)。但是,如果比例不等于1.0f(例如setScaleX(0.9f))并且您设置了透视,则视图会相对(?)移动到新透视。这不奇怪吗?我知道水平和垂直位置(平移)与枢轴值无关,但为什么视图以1.0f以外的比例因子移动?setPivotX作品奇怪的缩放查看

请检查有无缩放部分。

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

如何设置视图的相同位置,该位置在透视改变之前?

回答

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

的主要问题是要了解支点作用于缩放视图,那么应该不会有奇怪枢行为的任何问题。

+5

这看起来像Android中的一个bug给我。通过转换到数据透视图,执行缩放并翻译回来完成关于枢轴点的缩放。 'setScale'操作应该这样做,View不应该跳过。缩放是一种不应该可视化翻译视图的操作。 –

+0

嗨,我偶然发现了同样的问题,并能够解决它与您的答案。但是,我仍然想知道,如何在缩放视图上工作。你能提供一些指导方针,或者可能是一个链接? 在此先感谢。 – aleien

+0

@aleien抱歉,我不能帮你,我不认为有任何关于使用枢轴点缩放视图的指导原则。 – tomrozb

0

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

+0

感谢您的编辑,@马里奥尼古拉斯! – Ryan