1

私の Android アプリでは、ViewFlipper を使用したアクティビティがあります。Viewflipper の内部には、3 つの Linear Layouts があります。

 <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 を超えるたびにメソッドが呼び出されます。したがって、スクロールの距離が 50 の場合、メソッドは 21、22、23.... で呼び出されます。

これを管理して、メソッドが一度だけ呼び出されるようにするにはどうすればよいですか? 私は API を読んでおり、MotionEvent の時間を制御しようとしていますが、2 つの高速スクロールを行うことができるため、良い解決策ではありません。addBatch メソッドも見ました。これは私の解決策ですか?すべての呼び出しを 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;
}
4

1 に答える 1

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;
}
于 2012-12-12T11:18:37.477 に答える