5

由于我在 Android 上使用 Mono,任何人都可以用 C# 向我解释这段 Java 代码吗?例如,我在 Mono for Android 中找不到 OnGlobalLayoutListener。

在 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 是什么?

4

2 回答 2

15

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 for Android 中,首选方法是使用事件代替侦听器接口。在这种情况下,它被暴露为GlobalLayout事件:

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

您可以像这样获取 ViewTreeObserver 的实例:

var contentView = activity.Window.DecorView.FindViewById(Android.Resource.Id.Content);
contentView.ViewTreeObserver.GlobalLayout += ViewTreeObserverOnGlobalLayout;
于 2013-01-04T14:35:46.973 回答
0

以下是来自 Android Developers 网站的信息:

addOnGlobalLayoutListener(ViewTreeObserver.OnGlobalLayoutListener 监听器)

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

这是您可以查看的链接:addOnGlobalLayoutListener。和这里的GlobalLayoutListener

于 2013-01-04T14:14:06.257 回答