我正在尝试向片段添加自定义过渡。正如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的屏幕宽度!
答案 0 :(得分:2)
您需要将setXFraction
和getXFraction
方法公开给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);