gpt4 book ai didi

android - 如何使用 Xamarin 中的动画属性创建自定义 View

转载 作者:行者123 更新时间:2023-11-29 20:05:27 25 4
gpt4 key购买 nike

我正在尝试向 fragment 添加自定义过渡。作为Link建议,正确的解决方案是创建一个自定义 View 作为 fragment 容器,然后通过为新添加的属性设置动画,使 fragment 的过渡运行。但绝对是在 Java 上。我在 C# 和 Xamarin 中实现了如下所示:

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);
}
}

}

如您所见,首先我尝试实现与教程相同的功能(除了 c# 不支持只读局部变量作为“最终”替换!) 但在 objectAnimator 中,该属性未正确调用。然后我想也许使用 C# 属性可以解决问题。但它没有。

这是我的动画 xml 文件,名为“from_right.xml”:

<?xml version="1.0" encoding="utf-8" ?>
<objectAnimator
xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:propertyName="xFraction"
android:valueType="floatType"
android:valueFrom="1.0"
android:valueTo="0"
android:duration="500"/>

我将 propertyName 更改为“XFraction”或什至其他任何内容,但结果是一样的。

使用“x”作为 propertyName 和“1000”作为 valueFrom 效果很好。

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

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

最佳答案

您需要将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);
}

这将导致在 SmartFrameLayouts 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);

关于android - 如何使用 Xamarin 中的动画属性创建自定义 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35720863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com