1

Я пытаюсь добавить пользовательский переход к фрагментам. Как предлагалось Link, правильным решением является создание пользовательского представления в виде контейнера фрагментов, а затем путем анимирования нового добавленного свойства, выполнения перехода фрагмента. но абсолютно его на java. Я реализовал, что, как показано ниже в C# и Xamarin:Как создать пользовательские представления со свойствами для анимации в 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# не поддерживает только для чтения локальной переменной как «окончательный» замена!) , но в объектеAnimator свойство не вызывалось должным образом. Тогда я думаю, что, возможно, использование свойства 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"/> 

Я изменил ИмениСвойства на «XFraction» или даже что-нибудь еще, но результаты были одинаковыми.

Использование «x» как propertyName и «1000» как valueFrom работает хорошо.

Итак, я выяснил, что основная проблема заключается в том, что objectAnimator не мог вызвать setXFraction вообще!

Пожалуйста, скажите мне, что я делаю неправильно, или если есть лучшее решение, чтобы получить ровно ширину экрана для valueFrom в objectAnimator!

ответ

2

Вам необходимо разоблачить методы Java: setXFraction и getXFraction; они в настоящее время находятся только в управляемом коде и не доступны для виртуальной машины Java.

Используйте атрибут [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); 
    } 

Это приведет в следующем коде Java генерируется в SmartFrameLayout s Android Callable Wrapper:

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); 
+2

Это был отличный момент. Tnx –

Смежные вопросы