Xamarin.Forms Android自定义动画即使在UWP上运行也无法正常工作。想法?

时间:2017-09-08 16:00:47

标签: android animation xamarin.ios xamarin.forms

我有一个自定义动画,可以扩展TableView中的Cell。我还会根据需要刷新动画之前/之后的tableView大小。这适用于UWP,我还没有Mac,所以我无法在IOS上测试它。

这在Android上根本不起作用。它不会刷新tableRoot来更新它的大小,也不会播放扩展的动画。

我说的是第二部分,因为当我将桌面视图锁定到完整尺寸时它不会播放。

动画本身非常简单:

    private void AnimateLinearRowAppear(VisualElement visual, double targetHeight = 40, TableRoot _tableRoot, bool visible)
    {
        visual.IsVisible = visible;
        TableRootRefresher(_tableRoot);
        Animation _animation;
        _animation = new Animation(
            (d) => visual.HeightRequest = d, 0, targetHeight);
        _animation.Commit(visual, "The Animation", 16, 250, Easing.Linear, (target, b) =>
        {
            _animation = null;
        });

    }

任何人都有任何关于它为什么不能在Android上运行的想法?

除非我误认为this用于跨平台开发。

我是否必须编写一个界面并以特定于平台的方式调用我的每个动画?

哦,这是Xamarin 2.3.4.270的最新版本。

提前感谢您的帮助!

我从特定选择器或开关等事件中调用动画。

  Switch.toggled += (sender, e) => 
 {
     AnimationChooser(celltochange,switch.toggle,  tableRootCellIsPartOf);
  }

AnimationChooser决定我们是否正在播放正在播放或消失的动画,并且工作正常。

private void AnimationChooser(Cell celltoChange, bool stateOfSwitch, TableRoot _tableRoot)
{
   var visual = (celltoChange as ViewCell).View
   if(visual.IsVisible && stateOfSwitch)
     { AnimateLinearRowDissappear(visual, 40 ,_tableRoot, stateOfSwitch);}
   else AnimateLinearRowAppear(visual,40,_tableRoot,stateOfSwitch);
}

 TableRootRefresher(TableRoot _tableRoot)
 {
     Var tempRoot = _tableRoot;
     _tableRoot = null;
     _tableRoot = tempRoot:
 }

XAML:

<TableView>
  <TableRoot x:Name="root">
   <TableSection>
    <SwitchCell x:Name="switch"/>
    <EntryCell x:Name="toAppear" HieghtRequest="0" IsVisible="False"/>
   </TableSection>
  </TableRoot>
 </TableView>

Here是一个示例项目。

1 个答案:

答案 0 :(得分:0)

我使用下面的代码片段动画对我来说很好。

//animate changed the opacity from 1 to 0.
            //XFtabbody is my UI elements
            var animation = new Animation(v => XFTabBody.Opacity = v, 1, 0);
            Action<double, bool> finished = animate;
            animation.Commit(XFTabBody, "aa", 0, 100, Easing.Linear, finished);
        void animate(double d, bool b)
        {
            XFTabBody.Children.Clear();
    }