OnGlobalLayoutListener in Mono for Android

本文关键字:Android for Mono in OnGlobalLayoutListener | 更新日期: 2023-09-27 17:50:50

谁能解释我这个Java代码在c#,因为我使用Mono Android?例如,我找不到OnGlobalLayoutListener在Mono Android。

在Android上是这样的:

vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
    int newWidth, newHeight, oldHeight, oldWidth;
    //the new width will fit the screen
    newWidth = metrics.widthPixels;
    //so we can scale proportionally
    oldHeight = iv.getDrawable().getIntrinsicHeight();
    oldWidth = iv.getDrawable().getIntrinsicWidth();
    newHeight = Math.floor((oldHeight * newWidth) / oldWidth);
    iv.setLayoutParams(new LinearLayout.LayoutParams(newWidth, newHeight));
    iv.setScaleType(ImageView.ScaleType.CENTER_CROP);
    //so this only happens once
    iv.getViewTreeObserver().removeGlobalOnLayoutListener(this);
    }
});

Android的Mono等效是什么?

OnGlobalLayoutListener in Mono for Android

OnGlobalLayoutListener是一个接口,因此在c#中它被暴露为ViewTreeObserver.IOnGlobalLayoutListener。由于c#不像Java中那样支持匿名类,因此您需要提供该接口的实现并将其传递给AddOnGlobalLayoutListener():

public class MyLayoutListener : Java.Lang.Object, ViewTreeObserver.IOnGlobalLayoutListener
{
    public void OnGlobalLayout()
    {
        // do stuff here
    }
}
vto.AddOnGlobalLayoutListener(new MyLayoutListener());

如果你愿意,你可以这样做,但在Mono中,Android的首选方式是使用事件来代替监听器接口。在本例中,它作为GlobalLayout事件公开:

vto.GlobalLayout += (sender, args) =>
    {
        // do stuff here
    };

你可以像这样获得ViewTreeObserver的实例:

var contentView = activity.Window.DecorView.FindViewById(Android.Resource.Id.Content);
contentView.ViewTreeObserver.GlobalLayout += ViewTreeObserverOnGlobalLayout;

这是来自Android开发者网站的信息:

addOnGlobalLayoutListener (ViewTreeObserver。OnGlobalLayoutListener侦听器)

注册一个回调,当全局布局状态或视图树内视图的可见性发生变化时调用

你可以看看这个链接:addOnGlobalLayoutListener。这里是onGlobalLayoutListener