android onscroll手势探测器

时间:2012-12-11 11:19:22

标签: android gesture viewflipper

在我的Android应用程序中,我有一个ViewFlipper的Activity。在Viewflipper中,我有3个线性布局。

 <ViewFlipper
    android:id="@+id/viewFlipper"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginBottom="20dip"
            android:text="@string/publicas"
            android:textAppearance="?android:attr/textAppearanceLarge" />

        <ListView
            android:id="@+id/listViewDemandasPublicas"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginBottom="20dip"
            android:text="@string/pendientes"
            android:textAppearance="?android:attr/textAppearanceLarge" />

        <ListView
            android:id="@+id/listViewDemandasPendientes"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginBottom="20dip"
            android:text="@string/pendientes"
            android:textAppearance="?android:attr/textAppearanceLarge" />

        <ListView
            android:id="@+id/listViewDemandasFinalizadas"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

</ViewFlipper>

所以我想在我滚动水平时更改包含的ViewFlippers。所以我有一个手势探测器和一个手势监听器实现。即使我有一个ListView(我已经在另一个活动中完成),它工作正常。我的onScroll方法是下一个:

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
 ViewFlipper vf = (ViewFlipper) getWindow().findViewById(R.id.viewFlipper);
    View view = null;
    if ((e1.getX() < e2.getX()) && (distanceX < -20)) { // dedo a la derecha
        Log.i("ListaDemandas", "Muevo a la derecha SCROLL");
        if (esPendientes) {
            esPendientes = false;
            esEntrada = true;
            verPublicas(view);
            vf.setInAnimation(AnimationUtils.loadAnimation(getParent(), R.anim.push_right_in));
            vf.setOutAnimation(AnimationUtils.loadAnimation(getParent(), R.anim.push_right_out));
            vf.showPrevious();
        } else if (esFinalizadas) {
            esFinalizadas = false;
            esPendientes = true;
            verPendientes(view);
            vf.setInAnimation(AnimationUtils.loadAnimation(getParent(), R.anim.push_right_in));
            vf.setOutAnimation(AnimationUtils.loadAnimation(getParent(), R.anim.push_right_out));
            vf.showPrevious();
        }
    } else if ((e1.getX() > e2.getX()) && (distanceX > 20)) { 
        Log.i("ListaDemandas", "Muevo a la izquierda SCROLL");
        if (esPendientes) {
            esPendientes = false;
            esFinalizadas = true;
            verFinalizadas(view);
            vf.setInAnimation(AnimationUtils.loadAnimation(getParent(), R.anim.push_left_in));
            vf.setOutAnimation(AnimationUtils.loadAnimation(getParent(), .anim.push_left_out));
            vf.showNext();
        } else if (esEntrada) {
            esEntrada = false;
            esPendientes = true;
            verPendientes(view);
            vf.setInAnimation(AnimationUtils.loadAnimation(getParent(), R.anim.push_left_in));
            vf.setOutAnimation(AnimationUtils.loadAnimation(getParent(), .anim.push_left_out));
            vf.showNext();
        }
    }
    return true;
}

我的问题是每次滚动距离大于20时都会调用onScroll(当然)。因此,如果我进行长滚动,每次滚动运动大于20时,都会调用该方法。因此,如果我的Scroll的距离为50,则在21,22,23 ......中调用该方法。

如何管理此方法才能只调用一次方法?我一直在阅读API,我一直在尝试控制MotionEvent时间,但这不是一个好的解决方案,因为我可以制作两个快速滚动。我也见过addBatch方法。这是我的解决方案?有谁知道如何将所有通话批量合二为一?任何“手工”方式?

谢谢

=============================================== ================================================== ============

编辑:

我以手工方式解决了这个问题。使用true newScroll初始化的布尔值。因此,当我创建一个Scroll时,我把它设置为false而onDown()我再次将它设置为true。所以:

  @Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    ViewFlipper vf = (ViewFlipper) getWindow().findViewById(R.id.viewFlipper);
    if (scrollNuevo) {

        if ((e1.getX() < e2.getX()) && (distanceX < -20)) {                 
            Log.i("ListaDemandas", "Muevo a la derecha SCROLL");
            scrollNuevo = false; Log.i("ListaDemandas","ScrollNuevo=false");
            if (esPendientes) {
     ...

方法onDown:

@Override
public boolean onDown(MotionEvent e) {
    scrollNuevo = true;Log.i("ListaDemandas","ScrollNuevo=true");
    return true;
}

1 个答案:

答案 0 :(得分:1)

我以手工方式解决了这个问题。使用true newScroll初始化的布尔值。因此,当我创建一个Scroll时,我把它设置为false而onDown()我再次将它设置为true。所以:

  @Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    ViewFlipper vf = (ViewFlipper) getWindow().findViewById(R.id.viewFlipper);
    if (scrollNuevo) {

        if ((e1.getX() < e2.getX()) && (distanceX < -20)) {                 
            Log.i("ListaDemandas", "Muevo a la derecha SCROLL");
            scrollNuevo = false; Log.i("ListaDemandas","ScrollNuevo=false");
            if (esPendientes) {
     ...

方法onDown:

@Override
public boolean onDown(MotionEvent e) {
scrollNuevo = true;Log.i("ListaDemandas","ScrollNuevo=true");
return true;
}