在ViewFlipper的视图之间进行幻灯片动画

11
在一个Activity中,我有以下内容:
var flipper = FindViewById<ViewFlipper>(Resource.Id.flipper);
flipper.Touch += flipper_Touch;

基本的触摸处理程序的实现如下所示:
float oldTouchValue = 0;

void flipper_Touch(object sender, View.TouchEventArgs e)
{
    var flipper = sender as ViewFlipper;
    switch(e.Event.Action)
    {
        case MotionEventActions.Down:
            oldTouchValue = e.Event.GetX();
            break;

        case MotionEventActions.Up:
            float currentX = e.Event.GetX();
            if (oldTouchValue < currentX)
            {
                flipper.ShowNext();
            }
            else if (oldTouchValue > currentX)
            {
                flipper.ShowPrevious();
            }
            break;      
    }
}

这使我能够在不同的视图之间导航,但我想让它左右滑动。我看过一些Java示例,但没有直接将其转换为c#的方法。需要什么来使视图滑动,是否有一种方法来定义XML中的动画?我能够使用XML中定义的动画和对OverridePendingTransition的调用使活动滑入和滑出,但我不确定如何在这里应用这些知识。

@Aʌɐpɥɐuı 谢谢你的编辑...我其实不知道怎么这样突出单词,学到了新东西,谢谢 :) - TimothyP
2个回答

20

这使我能够在不同的视图之间导航,但我想让它左右滑动。

ViewFlipper 通过其 ViewAnimator 类具有一些方法来设置进入和退出动画,setInAnimation()setOutAnimation()。这些方法都在 Android SDK 中,但应该在 MonoDroid 中有对应物(不幸的是,我不熟悉 MonoDroid,所以可能有误)。为了获得所需的动画效果,只需使用上述两种方法设置所需的动画(无论是 XML 文件还是编程构建的 Animation),然后像当前所做的那样调用 showNext/Previous 方法即可。

你甚至可以在 Android SDK 中找到一些幻灯片动画,但我不知道它们是否存在于 MonoDroid 中。

更新:这些方法确实在 Monodroid 中可用,并且像这样公开:

//Using one of the built in animations:
flipper.setInAnimation(this, Android.Resource.Animation.SlideInLeft);
flipper.setOutAnimation(this, Android.Resource.Animation.SlideOutRight);

//Using custom animations defined in XML
flipper.setInAnimation(this, Resource.Animation.slide_in_right);
flipper.setOutAnimation(this, Resource.Animation.slide_out_left);

@Lukesprog,你的信息让我在Monodroid中找到了我需要的东西。我不想发布自己的答案,因为我想将你的标记为答案(不想从你这里偷走它),所以我编辑了你的答案,包括我在MonoDroid中发现的内容,希望你不介意。谢谢! - TimothyP
@Lukesprog 很棒的答案,根据我的上下文它起作用了。有一件事对我有点困惑,在 flipper OnClickListener 中我已经使用了 flipper.SetInAnimation(this, Android.Resource.Animation.Slide_In_Left); flipper.showNext(); 并且完美地工作了,现在我该怎么做才能实现 flipper.showPrevious();?我正在寻找不使用按钮的解决方案。提前感谢您。 - Zubair Ahmed
@ZubairAhmadKhan,我不确定我理解你的问题。如果你想要执行flipper.showPrevious(),那么从用户的角度来看,按钮是一种方式,就像你用一个按钮执行flipper.showNext()一样。否则,用户该如何返回? - user
5
еңЁJavaдёӯдҪҝз”Ёandroid.R.anim.slide_in_leftжқҘеҲӣе»әеҶ…зҪ®еҠЁз”»гҖӮ - Luciano Marqueto
@LucianoMarqueto 给出错误,说未知的动画师名称: translate,似乎它不能与碎片一起使用。 - hardik9850

4

如果你想通过 XML 布局文件控制 ViewFlipper 的动画,那么请将以下属性添加到 ViewFlipper 标签中-

    android:inAnimation="@android:anim/slide_out_right"
    android:outAnimation="@android:anim/slide_in_left"

这是一个基本示例,在其中ViewFlipper内部的子元素使用安卓提供的默认动画进行切换。

你还可以通过添加以下属性提供自己的动画文件,而不是使用上面提到的默认动画-

    android:inAnimation="@anim/slide_in_right"
    android:outAnimation="@anim/slide_in_left"

然后创建这些动画文件-

res/anim/slide_in_left.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/decelerate_interpolator" >
        <translate
            android:fromXDelta="0"
            android:toXDelta="-100%p"
            android:duration="500"/>
    </set>

res/anim/slide_in_right.xml 中:
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/decelerate_interpolator">
        <translate
            android:fromXDelta="100%p"
            android:toXDelta="0"
            android:duration="500"/>
    </set>

如果您想要自动启动此动画,则需要添加 -
    android:flipInterval="2000"
    android:autoStart="true"

这将自动开始动画,并在每2秒(2000ms)翻转图像(或视图)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接