2012-09-21 3 views
5

Mam pionowy ScrollView (w rzeczywistości niestandardowy ScrollView, kod poniżej) w ViewFlipper. ViewFlipper działa dobrze, chyba że przesuniemy poziomo nad ScrollView, aby przełączyć do poprzedniego/następnego widoku. Sam ScrollView działa poprawnie.Nie można uzyskać poziomego rzutowania na ScrollView w ViewFlipper, aby uzyskać efekt bubble out

Oto wzór. Zielone pole to ScrollView, który powinien być pionowy.

enter image description here

Oto Scrollview:

public class SCScrollView extends ScrollView { 

    private float xDistance, yDistance, lastX, lastY; 

    GestureDetector gestureDetector = new GestureDetector(new MyGestureDetector()); 
    OnTouchListener gestureListener; 

    public SCScrollView(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     gestureListener = new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (gestureDetector.onTouchEvent(event)) { 
        return true; 
       } 
       return false; 
      }  
     }; 

    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     switch (ev.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       xDistance = yDistance = 0f; 
       lastX = ev.getX(); 
       lastY = ev.getY(); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       final float curX = ev.getX(); 
       final float curY = ev.getY(); 
       xDistance += Math.abs(curX - lastX); 
       yDistance += Math.abs(curY - lastY); 
       lastX = curX; 
       lastY = curY; 
       if(xDistance > yDistance) 
        return false; 
     } 

     return false; 
     //return super.onInterceptTouchEvent(ev); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     super.onTouchEvent(event); 
     return gestureDetector.onTouchEvent(event); 
    } 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent ev){ 
     gestureDetector.onTouchEvent(ev); 
     super.dispatchTouchEvent(ev); 
     return true; 
    } 

    /** GestureDetector used to swipe between classes */ 
    class MyGestureDetector extends GestureDetector.SimpleOnGestureListener { 
     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float  velocityY) { 
      return false; 
     } 
    } 

} 

Próbowałam oprzeć rozwiązanie na poradę tutaj HorizontalScrollView within ScrollView Touch Handling i tutaj Swipe/Fling tab-changing in conjunction with ScrollView? ale niezależnie od tego, co mam na powrót z wywołania zwrotne, nie mogę dostać ViewFlipper, aby zobaczyć fling na ScrollView i szczerze mówiąc, gubię się w łańcuchu dotykowych i gestowych słuchaczy.

Jakieś myśli?

Dzięki

+0

Próbowałeś dodać OnTouchListener do Scrollview z ViewFlipper, może można uzyskać w ten sposób potrzebne TouchEvents? – Artjom

+0

Witaj Artjom. Tak, to było to, co próbowałem najpierw, ale wygląda na to, że ScrollView pochłania poziome rzucanie, mimo że nie musi. Właśnie dlatego staram się przesłonić ScrollView, aby móc go zatrzymać i spopularyzować go do rodzica ViewFlipper, ale jak dotąd nie było to dobre :( – Simon

Odpowiedz

6

jak w udokumentowane że

http://developer.android.com/reference/android/widget/ScrollView.html

Scrollview obsługuje tylko pionowe przesuwanie. W przypadku przewijania w poziomie, użyj HorizontalScrollView.

Muszę zapytać, dlaczego naprawdę chciałeś użyć niestandardowego przewijania?

Jeśli tylko zamiar być w stanie przejść, to może nie trzeba go używać

tylko RelativeLayout.scrollBy (x, y); wystarczy

Można spojrzeć na ten link

Scrollview vertical and horizontal in android

EDIT

Ok, więc trzeba wykonać gest wykryć romans nad Scrollview.

Można zrobić go w swojej działalności bez zwyczaj Scrollview również

pierwsze, trzeba

implements OnGestureListener, OnTouchListener, GestureDetector.OnDoubleTapListener 

aw swojej klasie tworzyć gestureDetector

gd = new GestureDetector(this); 

i swój obiekt Scrollview, właśnie ogłosił

sv.setOnTouchListener(this); 

następnie w override onTouch metody

@Override 
public boolean onTouch(View v, MotionEvent event) { 
     onTouchEvent(event); // throw to onTouchEvent 

    return false; 
} 

aw metodzie onTouchEvent override

@Override 
public boolean onTouchEvent(MotionEvent me) 
{ 
    return gd.onTouchEvent(me); // gd = gesturedetector 
} 

teraz zastąpić metodę onFling jak ten

private static final int SWIPE_MIN_DISTANCE = 120; 
private static final int SWIPE_THRESHOLD_VELOCITY = 200; 

@Override 
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
     float velocityY) { 

    if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
     // "Left Swipe" 
     vf.showPrevious(); // vf = ViewFlipper 

    } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
     // "Right Swipe" 
     vf.showNext(); 
    } 

    return false; 
} 

i to jest cała kod

klasa ViewFlipperActivity

import android.os.Bundle; 
import android.app.Activity; 
import android.view.GestureDetector; 
import android.view.GestureDetector.OnGestureListener; 
import android.view.View.OnTouchListener; 
import android.view.MotionEvent; 
import android.view.View; 
import android.webkit.WebSettings; 
import android.webkit.WebView; 
import android.widget.HorizontalScrollView; 
import android.widget.ScrollView; 
import android.widget.TextView; 
import android.widget.Toast; 
import android.widget.ViewFlipper; 

public class ViewFlipperActivity extends Activity implements OnGestureListener, OnTouchListener, GestureDetector.OnDoubleTapListener 
{ 

    TextView tv; 
    GestureDetector gd; 
    ScrollView sv; 
    ViewFlipper vf; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     gd = new GestureDetector(this); 

     setContentView(R.layout.activity_viewflipper); 

     tv = (TextView)findViewById(R.id.textView1); 
     sv = (ScrollView)findViewById(R.id.scrollView1); 
     vf = (ViewFlipper)findViewById(R.id.viewFlipper1); 

     sv.setOnTouchListener(this); 

    } 

    @Override 
    public boolean onDoubleTap(MotionEvent arg0) { 
     tv.setText("double tap"); 
     return false; 
    } 

    @Override 
    public boolean onDoubleTapEvent(MotionEvent arg0) { 
     tv.setText("double tap event"); 
     return false; 
    } 

    @Override 
    public boolean onSingleTapConfirmed(MotionEvent arg0) { 
     tv.setText("single tap confirm"); 
     return false; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent me) 
    { 
     return gd.onTouchEvent(me); 
    } 

    @Override 
    public boolean onDown(MotionEvent arg0) { 
     tv.setText("down"); 
     return false; 
    } 

    private static final int SWIPE_MIN_DISTANCE = 120; 
    private static final int SWIPE_THRESHOLD_VELOCITY = 200; 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
      float velocityY) { 

     if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
      tv.setText("Left Swipe"); 
      vf.showPrevious(); 

     } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
      tv.setText("Right Swipe"); 
      vf.showNext(); 
     } 

     return false; 
    } 

    @Override 
    public void onLongPress(MotionEvent arg0) { 
     tv.setText("long press"); 

    } 

    @Override 
    public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2, 
      float arg3) { 
     tv.setText("scroll"); 
     return false; 
    } 

    @Override 
    public void onShowPress(MotionEvent arg0) { 
     tv.setText("show press"); 
    } 


    @Override 
    public boolean onSingleTapUp(MotionEvent arg0) { 
     tv.setText("single tab up"); 
     return false; 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     onTouchEvent(event); 

     return false; 
    } 
} 

i activity_viewflipper.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" 
     android:text="TextView" /> 

    <ViewFlipper 
     android:id="@+id/viewFlipper1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentRight="true" 
     android:layout_below="@+id/textView1" > 

     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" > 

      <ScrollView 
       android:id="@+id/scrollView1" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_above="@+id/textView3" 
       android:layout_alignParentLeft="true" 
       android:layout_alignParentTop="true" 
       android:layout_marginLeft="28dp" 
       android:layout_marginTop="63dp" 
       android:layout_toLeftOf="@+id/textView2" > 

       <ImageView 
        android:id="@+id/imageView1" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:scaleType="matrix" 
        android:src="@drawable/thailandmap" /> 

      </ScrollView> 

      <TextView 
       android:id="@+id/textView2" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignParentRight="true" 
       android:layout_alignTop="@+id/scrollView1" 
       android:layout_marginRight="30dp" 
       android:text="TextView" /> 

      <TextView 
       android:id="@+id/textView3" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_alignParentBottom="true" 
       android:layout_alignRight="@+id/scrollView1" 
       android:layout_marginBottom="250dp" 
       android:layout_marginRight="29dp" 
       android:text="TextView" /> 

     </RelativeLayout> 

     <ImageView 
      android:id="@+id/imageView2" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:scaleType="matrix" 
      android:src="@drawable/thwriting" /> 

    </ViewFlipper> 

</RelativeLayout> 
+0

Cześć i dziękuję za odpowiedź Nie próbuję uzyskać horyzontalnego ScrollView. próbuję uzyskać ViewFlipper rozpoznać horizantal swipe poprzek Scrollview które powinny przejść do poprzedniego lub następnego widoku. mam pytanie edytowane, aby to (mam nadzieję) wyraźniejszy. – Simon

+0

Ok, spójrz na moją redakcją odpowiedź. I” ve przetestowane i jest to praca. –

+0

Dzięki stary. postaram się to jutro i wrócić ... – Simon

Powiązane problemy