有人可以用C#解释我这个Java代码,因为我使用Mono for Android吗?例如,我在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);
}
});
Mono for Android等价物是什么?
答案 0 :(得分:12)
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;
答案 1 :(得分:0)
以下是来自Android开发者网站的信息:
addOnGlobalLayoutListener(ViewTreeObserver.OnGlobalLayoutListener 听者)
注册视图树中全局布局状态或视图可见性更改时要调用的回调
以下是您可以查看的链接:addOnGlobalLayoutListener。在这里onGlobalLayoutListener