2014-01-17 4 views
1

Я пытаюсь использовать swing на Android с помощью OnGestureListener. Мне нужна вертикальная прокрутка текста, если она превышает высоту макета. Мне нужно, чтобы веритическая прокрутка и горизонтальный салфетки должны работать вместе. Код:Вертикальная прокрутка вместе с горизонтальным прокруткой в ​​Android

package com.example.gestures; 


import android.os.Bundle; 
import android.app.Activity; 
import android.util.Log; 
import android.view.GestureDetector; 
import android.view.GestureDetector.OnGestureListener; 
import android.view.Menu; 
import android.view.MotionEvent; 
import android.widget.TextView; 
import android.widget.Toast; 

public class Gestures extends Activity implements OnGestureListener { 
GestureDetector gDetector;TextView tv; 
private static final int SWIPE_MIN_DISTANCE = 120; 
private static final int SWIPE_MAX_OFF_PATH = 250; 
private static final int SWIPE_THRESHOLD_VELOCITY = 200; 
private static final int SWIPE_THRESHOLD = 100; 
private static final int SWIPE_VELOCITY_THRESHOLD = 100; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_gestures); 
     gDetector = new GestureDetector(this); 
     tv=(TextView)findViewById(R.id.tv); 

    } 







    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.gestures, menu); 
     return true; 
    } 

    @Override 
    public boolean onDown(MotionEvent arg0) { 
     // TODO Auto-generated method stub 
     Log.d("onDown","In OnDown"); 
     return true; 

    } 



    public void rightToLeft() { 

     //tv.setText("There are subclasses of LayoutParams for different subclasses of ViewGroup. For example, AbsoluteLayout has its own subclass of LayoutParams which adds an X and Y value."); 
    tv.setText("ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssALGIERS (Reuters) - Algerian President Abdelaziz Bouteflika, who suffered a stroke last year, has been in a Paris hospital since Monday for a long-planned check-up and he is making steady progress, the state news agency APS said on Tuesday.Algerians vote for a new president in April. Bouteflika, 76, has yet to announce whether he will run again after more than 10 years at the helm of the major North African oil producer.To complete his health assessment, started in Algiers, and under a routine medical control ... planned since June 2013, the President of the Republic Abdelaziz Bouteflika is staying at Val-de-Grace hospital, it said. The president's health is improving certainly and progressively.APS, citing a presidential statement, said Bouteflika would remain at the hospital until Friday.A veteran of Algeria's independence war against France, Bouteflika suffered a stroke in early 2013, forcing him to be rushed to hospital in France. He returned to Algeria in July to convalesce and has made only a few public appearances recently."); 
    } 
    public void lefttoRight() { 
     tv.setText("leftToRight LayoutParams are used by views to tell their parents how they want to be laid out. See ViewGroup Layout Attributes for a list of all child view attributes that this class supports. "); 
     } 

    @Override 
    public boolean onFling(MotionEvent start, MotionEvent finish, float velocityX, 
      float velocityY) { 
     // TODO Auto-generated method stub 
     //TextView t=(TextView)findViewById(R.id.tv); 
     /*if(start.getRawX() < finish.getRawX()) 
     { 
      Log.d("onFling","in inFling"); 
     } 
     else if(start.getRawX()>finish.getRawX()) 
     { 
      Log.d("onFLing","in onFling"); 
     }*/ 
     if (Math.abs(start.getY() - finish.getY()) > SWIPE_MAX_OFF_PATH) 
      return false; 
     // right to left swipe 

     if(start.getX() - finish.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 

     lefttoRight(); 

     } 
     else if (finish.getX() - start.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
    rightToLeft(); 
     } 
     return true; 
    } 


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

    @Override 
    public void onLongPress(MotionEvent arg0) { 
     // TODO Auto-generated method stub 
     Log.d("onLongPress","in onlongpress"); 
    } 



    @Override 
    public void onShowPress(MotionEvent arg0) { 
     // TODO Auto-generated method stub 
     Log.d("onShowPress","in onShowPress"); 

    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent arg0) { 
     // TODO Auto-generated method stub 
     Log.d("onSingleTapup","in onsingletapup"); 
     return true; 
    } 

    @Override 
    public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2, 
      float arg3) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

} 

и файл XML (activity_gestures.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" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".Gestures" > 



    <ScrollView 
     android:id="@+id/scrollView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 

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


     <TextView 
     android:id="@+id/tv" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/hello_world" /> 
     </LinearLayout> 

    </ScrollView> 

</RelativeLayout> 

проблема иногда прокрутки работает и салфетки не работает fine.Please, дайте мне знать, как решить эту issue.Thanks заранее ,

ответ

0

Создайте собственный ScrollView, расширив его и внедряйте dispatchTouchEvent.

Мы начинаем отслеживать касание (с положениями пикселей на sceen) в ACTION_DOWN. Когда мы видим, что это горизонтальное прокручивание, мы не вызываем super.dispatchTouchEvent(event), который будет выполнять по умолчанию onTouch-маршрутизацию, а также, чтобы определенные дочерние представления тоже потребляли горизонтальное прокручивание, но назовите onTouchEvent(event) вместо ACTION_MOVE, а также в ACTION_UP.

public class MyScrollView extends ScrollView { 

    private float mLastX; 
    private float mLastY; 
    private final int mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); 
    private float mStartX; 

    public ScrollView(Context context) { 
     super(context); 
    } 

    public ScrollView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public boolean dispatchTouchEvent(MotionEvent event) { 
    switch(event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      mLastX = event.getX(); 
      mLastY = event.getY(); 
      mStartX = event.getX(); 
      break; 
     case MotionEvent.ACTION_CANCEL: 
     case MotionEvent.ACTION_UP: 
      onTouchEvent(event); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      float x = event.getX(); 
      float y = event.getY(); 

      float xDelta = x - mLastX; 
      float xDeltaAbs = Math.abs(xDelta); 
      float yDeltaAbs = Math.abs(y - mLastY); 

      float xDeltaTotal = x - mStartX; 
      if(Math.abs(xDeltaTotal) > mTouchSlop) 
       if(xDeltaAbs > yDeltaAbs) 
        return onTouchEvent(event); 
     } 

     return super.dispatchTouchEvent(event); 
    } 
} 

Я попробовал только это с ViewPager вместо Scrollview, но в этом же положении, так что это должно работать

Смежные вопросы