从 addOnPreDrawListener() 获取值

Getting values from addOnPreDrawListener()

我不明白如何从下面的方法中 return 值,我尝试 return int 但它显示了一个无法解决的奇怪错误。这是代码:

private void showTheEnemy() {

    ViewTreeObserver vto = radarImage.getViewTreeObserver();
    vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        public boolean onPreDraw() {
            radarImage.getViewTreeObserver().removeOnPreDrawListener(this);
            yradar_height = radarImage.getMeasuredHeight();
            xradar_width = radarImage.getMeasuredWidth();
            return true;
        }
    });
    coordinateText.setText(yradar_height + " " + xradar_width);
}

我了解到方法中的值没有更新,因为当我使用 setText() 方法时 int 值是 0。

你得到零是因为在你设置文本之前没有触发内部方法。这些值设置为您上次初始化它们时的值。

设置回调中的文本。

private TextView coordinateText;
private int xradar_width = 0;
private int yradar_height = 0;

private void showTheEnemy() {

    ViewTreeObserver vto = radarImage.getViewTreeObserver();
    vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        public boolean onPreDraw() {

            yradar_height = radarImage.getMeasuredHeight();
            xradar_width = radarImage.getMeasuredWidth();

            coordinateText.setText(String.format("%d %d", 
                yradar_height,
                xradar_width 
            ));

            radarImage.getViewTreeObserver().removeOnPreDrawListener(this);
            return true;
        }
    });

    // Your values are still 0 here

}

或者传递给另一个方法。

private TextView coordinateText;

private void showTheEnemy() {

    ViewTreeObserver vto = radarImage.getViewTreeObserver();
    vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        public boolean onPreDraw() {

         setCoordinate(coordinateText,  
                radarImage.getMeasuredHeight(),
                radarImage.getMeasuredWidth() ));
            radarImage.getViewTreeObserver().removeOnPreDrawListener(this);
            return true;
        }
    });

}

private static void setCoordinate(TextView tv, int xPos, int yPos) {
     tv.setText(String.format("%d %d", xPos, yPos));
}

获取雷达图像宽度和高度时设置值:

private void showTheEnemy() {
    ViewTreeObserver vto = radarImage.getViewTreeObserver();
    vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        public boolean onPreDraw() {
            radarImage.getViewTreeObserver().removeOnPreDrawListener(this);
            yradar_height = radarImage.getMeasuredHeight();
            xradar_width = radarImage.getMeasuredWidth();
            coordinateText.setText(yradar_height + " " + xradar_width);
            return true;
        }
    });
    coordinateText.setText(yradar_height + " " + xradar_width);
}

编辑: 创建 class 个字段,并在提供新值时将这些值传递到您需要的地方。