0

我正在开发带有 AdapterViewFlipper 的 Android 小部件。正如我们所知,AdapterViewFlipper 通过它的视图自动旋转。我的问题是,如何捕获视图在屏幕上显示的索引?我尝试在其Adapter中使用getViewAt()方法,但后来发现有问题。getViewAt() 不仅在每次显示视图时调用,而且每次 AppWidgetManager.notifyAppWidgetViewDataChanged() 时都会调用。所以很难区分这两个事件。

AdapterViewFlipper 或其适配器是否有任何侦听器,我们可以知道当前显示在屏幕上的视图的索引?

提前致谢。

4

1 回答 1

1

结合来自ViewFlipper 小部件翻转事件的 Listener的答案

安卓; 在 AdapterViewFlipper 上设置输入/输出动画:未知的动画师名称翻译

您可以在 AdapterViewFlipper 上设置一个Animator(注意这与 ViewFlipper 中使用的动画不同)然后您可以创建一个 AnimatorListener 并将其添加到“In Animation”中,它会在显示子项时触发,然后您可以调用getDisplayedChild() 返回索引。

示例代码

// Setup AdapterViewFlipper
mAdapterViewFlipper = (AdapterViewFlipper) findViewById(R.id.AdapterViewFlipper);
mAdapterViewFlipper.setFlipInterval(5000);

// Set Some Animations
mAdapterViewFlipper.setInAnimation(getBaseContext(), R.animator.left_in);
mAdapterViewFlipper.setOutAnimation(getBaseContext(), R.animator.right_out);

// Create a AnimatorListener
mAnimatorListener = new AnimatorListener() {
    public void onAnimationStart(Animator animator) {}

    public void onAnimationRepeat(Animator animator) {}

    public void onAnimationCancel(Animator animator) {}

    public void onAnimationEnd(Animator animator) {
        int displayedChild = mAdapterViewFlipper.getDisplayedChild();
        Log.w(TAG, "onAnimationEnd view index:" + displayedChild);
        int childCount = mAdapterViewFlipper.getCount();
        if (displayedChild == childCount - 1) {
           // Do what you want before wrapping to first view
           //mAdapterViewFlipper.stopFlipping();
        }
    }
};

// Add the Listener to the In animation
mAdapterViewFlipper.getInAnimation().addListener(mAnimatorListener);

// Set adaptor just before start so view with index 0 triggers Listener
mAdapterViewFlipper.setAdapter(adapter);

// Start Flipping
mAdapterViewFlipper.setAutoStart(true);

R.animator.left_in 和 R.animator.right_out 是“res/animator”目录中的文件,内容如下:-

<?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="x"
    android:valueType="floatType"
    android:valueFrom="-1500"
    android:valueTo="0"
    android:duration="600"/>

每次将视图翻转给您时,您都会在此示例中收到一个 Log 事件,例如:-

TAG onAnimationEnd view index:0
TAG onAnimationEnd view index:1
TAG onAnimationEnd view index:2
TAG onAnimationEnd view index:3
TAG onAnimationEnd view index:4
TAG onAnimationEnd view index:0
于 2019-09-01T23:09:58.277 回答