在Android小部件中,如何在AdapterViewFlipper中捕获屏幕上当前视图的索引?

时间:2013-10-17 08:21:48

标签: android widget

我正在使用内部的AdapterViewFlipper处理Android小部件。众所周知,AdapterViewFlipper会通过视图自动旋转。 我的问题是,如何捕获视图在屏幕上显示的索引? 我尝试在其适配器中使用getViewAt()方法,但后来发现存在一些问题。 getViewAt()不仅在每次显示视图时调用,而且每次都在AppWidgetManager.notifyAppWidgetViewDataChanged()时调用。因此很难区分这两个事件。

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

提前致谢。

1 个答案:

答案 0 :(得分:1)

结合Listener for ViewFlipper widget flipping events的答案

android; setting in/out animations on AdapterViewFlipper: Unknown animator name translate

您可以在AdapterViewFlipper上设置 Animator (请注意,这与ViewFlipper中使用的Animation不同) 然后,您可以创建一个AnimatorListener并将其添加到“动画中”,它将在显示子项时触发,然后可以调用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