加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – addOnLayoutChangeListener和onLayout(已更改)之间的区

发布时间:2020-12-15 03:08:43 所属栏目:Java 来源:网络整理
导读:我上课了 public class FancyView extends View implements View.OnTouchListener { 我需要获得视图的高度/宽度. (它可能会随着设备旋转而改变.当然,在初始化时也不知道高度/宽度.) 你可以这样做… 所以,实际上在FancyView类中只是覆盖onLayout(已更改) @Ove
我上课了
public class FancyView extends View implements View.OnTouchListener {

我需要获得视图的高度/宽度.

(它可能会随着设备旋转而改变.当然,在初始化时也不知道高度/宽度.)

你可以这样做…

所以,实际上在FancyView类中只是覆盖onLayout(已更改)

@Override
protected void onLayout(boolean changed,int left,int top,int right,int bottom) {
    super.onLayout(changed,left,top,right,bottom);
    int hh = getHeight();
    Log.d("~","Using onLayout(changed),height is known: " +hh);
}

或者,你可以这样做……

在FancyView类中再次使用addOnLayoutChangeListener

private void init() {
    addOnLayoutChangeListener(new OnLayoutChangeListener() {
        @Override
        public void onLayoutChange(View v,int bottom,int oldLeft,int oldTop,int oldRight,int oldBottom) {
            Log.d("~","Using addOnLayoutChangeListener,height is known: " +hh);
        }
    });

}

(旁白:我猜init()是最好的地方.)

两者似乎运作良好.

(A)添加一个监听器和addOnLayoutChangeListener,还是(B)覆盖onLayout(布尔值改变了?)之间是否存在任何实际差异?

使用案例:在FancyView类中,我在图像上绘制了一些东西;所以我需要知道宽度/高度要绘制的大小.

脚注.我已经注意到问题在哪里讨论“Android,获取视图的宽度/高度”,通常建议使用onWindowFocusChanged 9,因为它“更容易”).当onLayout(已更改)可用时,我真的不明白为什么你会这样做;也许我错过了什么.

解决方法

方法addOnLayoutChangeListener是public,因此它允许添加外部更改侦听器. OTOH onLayout受到保护,因此仅供内部使用.

对于内部使用,我的理解是两种方法都提供相同的结果,但覆盖更清晰.

检查View的源代码我看到使用更改侦听器的方法是

public void layout(int l,int t,int r,int b)

此方法在内部调用onLayout并更改侦听器,确认两个方法都是等效的,因为它们以相同的方式触发.如果在任何情况下它们不会同时被调用,则可能是由控件实现中的错误引起的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读