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
是一个接口,因此在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