视图焦点问题


ViewTreeObserver详解

1. 在使用时为防止多次计算焦点视图的长宽造成的焦点问题,应该判断焦点视图是否是第一次计算长宽,如果不是第一次,记得remove掉, 具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (firstCalc && focusView.getWidth() == 0 && focusView.getHeight() == 0)
{
/**
* recalc focus view width and height
*/
final ViewTreeObserver observer = focusView.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
focusView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
//回调自身的方法,false代表firstCalc不是首次计算
mySelfView(focusView, moveView, scale, false);
}
});
return;
}

2. 具体方法详解

(1)interface ViewTreeObserver.OnGlobalLayoutListener

  • 当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时,所要调用的回调函数的接口类

    (2)

    /**注册一个回调函数,当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时调用这个回调函数。
    • *参数 listener 将要被添加的回调函数
    • *异常 IllegalStateException 如果isAlive() 返回false

*/

  •   public void addOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener listener)

    (3)

    /**移除之前已经注册的全局布局回调函数。
  •    *参数 victim 将要被移除的回调函数
  •    异常 IllegalStateException 如果isAlive() 返回false   /
  •   public void removeGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)