用于Animate TopMargin的ObjectAnimator代理无法找到设置/获取

时间:2013-11-29 16:59:33

标签: c# android xamarin.android xamarin

我们正在尝试使用objectanimator代理为Android(Xamarin)中的TopMargin属性设置动画。

但是,我们收到此错误:

  

[PropertyValuesHolder]找不到属性的setter / getter   TopMargin,值类型为float

注意:我们尝试过TopMargin,topMargin,GetTopMargin,getTopMargin等,认为它可能是Java和C#之间的套管转换问题,但看起来并非如此。

我们在开始动画的Activity中的代码:

translation = new int[] {0, 300};
var anim2 = ObjectAnimator.OfInt( new MarginProxyAnimator(myview), "TopMargin",translation);
anim2.SetDuration(500);
anim2.Start(); 

我们的代理类:

public class MarginProxyAnimator : Java.Lang.Object 
{
///... other code...
    public int getTopMargin() {
    var lp = (ViewGroup.MarginLayoutParams)mView.LayoutParameters;
    return lp.TopMargin;
    }

    public void setTopMargin(int margin) {
    var lp = (ViewGroup.MarginLayoutParams)mView.LayoutParameters;
        lp.SetMargins(lp.LeftMargin, margin, lp.RightMargin, lp.BottomMargin);
    mView.RequestLayout();
    }
}

有什么建议吗?使用代理指向工作Xamarin样本的指针会很有帮助。

感谢。

2 个答案:

答案 0 :(得分:4)

您需要将[Export]属性添加到getTopMargin和setTopMargin方法中。 E.G。

[Export]
public int getTopMargin()
{
  var lp = (ViewGroup.MarginLayoutParams)mView.LayoutParameters;
  return lp.TopMargin;
}

[Export]
public void setTopMargin(int margin)
{
  var lp = (ViewGroup.MarginLayoutParams)mView.LayoutParameters;
  lp.SetMargins(lp.LeftMargin, margin, lp.RightMargin, lp.BottomMargin);
  mView.RequestLayout();
}

[Export]属性还要求您添加对Mono.Android.Export程序集的引用。

文档:

http://androidapi.xamarin.com/?link=T%3aJava.Interop.ExportAttribute

答案 1 :(得分:2)

作为@ wdavo答案的替代方案,您还可以在C#属性上使用[Export]属性。因此,他的答案中的代码可以被制作成如此属性:

public int TopMargin
{
    [Export("getTopMargin")]
    get { 
        var lp = (ViewGroup.MarginLayoutParams)mView.LayoutParameters;
        return lp.TopMargin;
    }

    [Export("setTopMargin")]
    set {
        var lp = (ViewGroup.MarginLayoutParams)mView.LayoutParameters;
        lp.SetMargins(lp.LeftMargin, value, lp.RightMargin, lp.BottomMargin);
        mView.RequestLayout();
    }
}