如何使用Xamarin中的动画属性创建自定义视图

时间:2016-03-01 10:47:41

标签: android android-fragments xamarin android-custom-view android-transitions

我正在尝试向片段添加自定义过渡。正如Link建议的那样,正确的解决方案是创建一个自定义视图作为片段容器,然后通过动画新添加的属性,使片段的转换运行。但绝对是在java上。我在C#和Xamarin中实现了如下:

var images = {
  "Sports 1" :
    "http://lorempixel.com/50/50/sports/1",
  "Sports 2":
    "http://lorempixel.com/50/50/sports/2",
  "Sports 3":
    "http://lorempixel.com/50/50/sports/3",
};

var index, len;
var keys  = Object.keys(images);

for (index = 0, len = keys.length; index < len; index++) {
    var temp = keys[index];
    var newoption = new Option(temp, images[temp]);
    document.getElementById('imagelist').add(newoption);
}

正如您所看到的,首先我尝试实现与教程相同的内容(除了c#不支持只读局部变量作为&#34;最终&#34;替换!)  但是在objectAnimator中,属性没有正确调用。然后我想也许使用C#属性将解决问题。但它没有。

这是我的动画xml文件,名为&#34; from_right.xml&#34;:

class SmartFrameLayout : FrameLayout
{

    public SmartFrameLayout(Context context) : base(context) { }
    public SmartFrameLayout(Context context, IAttributeSet attrs) : base(context, attrs) { }
    public SmartFrameLayout(Context context, IAttributeSet attrs, int defStyleAttr) : base(context, attrs, defStyleAttr) { }
    public SmartFrameLayout(Context context, IAttributeSet attrs, int defStyleAttr, int defStyleRes) : base(context, attrs, defStyleAttr, defStyleRes) { }

    //public float getXFraction()
    //{
    //    if (Width == 0) return 0;
    //    return GetX() / Width;
    //}

    //public void setXFraction(float fraction)
    //{
    //    Log.Debug("Fraction", fraction.ToString());
    //    float xx = GetX();
    //    SetX(xx * fraction);
    //}

    //private float XFraction;


    public float XFraction
    {
        get {
            if (Width == 0) return 0;
            return GetX() / Width;
        }
        set {
            float xx = GetX();
            SetX(xx * value);
        }
    }

}

我将propertyName更改为&#34; XFraction&#34;甚至其他任何东西,但结果是一样的。

使用&#34; x&#34;作为propertyName和&#34; 1000&#34;作为价值,效果很好。

所以我想出主要问题是objectAnimator根本无法调用setXFraction!

请告诉我我做错了什么,或者是否有更好的解决方案来准确获取objectAnimator中valueFrom的屏幕宽度!

1 个答案:

答案 0 :(得分:2)

您需要将setXFractiongetXFraction方法公开给Java;它们目前仅在托管代码中,不可访问Java VM。

使用[Export]属性将这些方法公开给Java,以便动画师可以使用它们:

    [Export]
    public float getXFraction()
    {
        if (Width == 0) return 0;
        return GetX() / Width;
    }

    [Export]
    public void setXFraction(float fraction)
    {
        Log.Debug("Fraction", fraction.ToString());
        float xx = GetX();
        SetX(xx * fraction);
    }

这将导致在SmartFrameLayout s Android Callable Wrapper中生成以下Java代码:

public float getXFraction ()
{
    return n_getXFraction ();
}

private native float n_getXFraction ();


public void setXFraction (float p0)
{
    n_setXFraction (p0);
}

private native void n_setXFraction (float p0);