我创建了一个测试MvxFrameLayout派生类,我希望在0,0中绘制一个尺寸为24x24的子项:
public class MyCustomLayout : MvxFrameLayout
{
public MyCustomLayout(Context context, IAttributeSet attrs) : base(context, attrs)
{
}
public MyCustomLayout(Context context, IAttributeSet attrs, IMvxAdapterWithChangedEvent adapter) : base(context, attrs)
{
}
protected override void OnLayout(bool changed, int left, int top, int right, int bottom)
{
if (!changed)
{
return;
}
for (int i = 0; i < this.ChildCount; ++i)
{
var child = this.GetChildAt(i);
child.Layout(0, 0, 24, 24);
}
}
}
在活动布局(FirstView.axml)中使用的是这样的:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<hotspotappandroid.droid.views.MyCustomLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
local:MvxBind="ItemsSource Hotspots"
local:MvxItemTemplate="@layout/hotspot" />
</FrameLayout>
视图模型有一个项目:
public class FirstViewModel : MvxViewModel
{
public string[] Hotspots { get; private set; }
public FirstViewModel()
{
this.Hotspots = new string[] { "A" };
}
}
hotspot.xml是一个ImageView,其图像(circle.png)为24x24:
<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/circle" />
问题是没有绘制圆形图像。
如果在hotspot.xml中我将android:layout_width="fill_parent"
和android:layout_height="fill_parent
更改为wrap_content
,则会绘制图像,但不正确。
图像被画成两半。看起来图像被缩放到它的大小的两倍,它被裁剪了一半(可能是由于'child.Layout(0,0,24,24))。
我不确定发生了什么。我看到child
中的OnLayout
类型为cirrious.mvvmcross.binding.droid.views.MvxListItemView
,而不是'ImageView',因为我原本期望这样。也许这有事可做?
答案 0 :(得分:0)
MvxFrameLayout
通过为每个孩子为孩子MvxListItemView
充气来实现。 MvxListItemView
本身继承自FrameLayout
并具有默认布局参数。
根据文档 - http://developer.android.com/reference/android/widget/FrameLayout.html - 这意味着每个子FrameLayout都应该调整大小:
FrameLayout的大小是其最大子级(加填充)的大小,可见或不可见(如果FrameLayout的父级允许)
由于您在这里为fill_parent
内孙子指定ImageView
,我猜这就是导致您的内部视图为零的原因。
为了让您的子框架具有一定的尺寸,最好直接在内部子XML中提供ImageView
尺寸,而不是请求fill_parent
如果您确实希望直接返回ImageView
并将其用作Child - 没有中间MvxListItemView
,那么在最新的MvvmCross源代码中我相信您可以:
MyImageView
继承课程ImageView
并添加IMvxListItemView
实施MyImageView
- https://github.com/MvvmCross/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross.Binding.Droid/Views/MvxAdapter.cs#L287 CreateBindableView