如何将每个触摸事件的onScroll()效果限制为一个方法调用

时间:2015-06-06 02:49:34

标签: android

这是我的第一个Android项目之一,所以请耐心等待一下。由于缺少更好的单词,我无法将onScroll()方法限制为一次迭代。正在发生的情况是,当我执行一个scrollX所在的滚动时,比如130,索引增加4而不是预期的1.我试图找到一种方法使索引每次刷卡事件增加1 ,无论距离X多大。我做了,if-else-if构造一直到240,增加40,但这似乎也不起作用。

以下是相关代码 - 我删除了GestureDetector.OnGestureListener的所有其他实现方法。

public class QuoteActivity extends ActionBarActivity implements
    GestureDetector.OnGestureListener,GestureDetector.OnDoubleTapListener{

private GestureDetectorCompat detect;
private TextView textQuote;
private String[] quotes;
private int index = 0;


protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.quote_main);

    textQuote = (TextView)findViewById(R.id.textView_quote);
    quotes = getResources().getStringArray(ProcessQuote.getArray());
    textQuote.setText(quotes[index]);

    detect = new GestureDetectorCompat(this,this);
    detect.setOnDoubleTapListener(this);
}


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



public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    if(distanceX > 40 && index < quotes.length-1){
        index++;
        textQuote.setText(quotes[index]);
    }else if(distanceX < -40 && index > 0) {
        index--;
        textQuote.setText(quotes[index]);
    }
    return false;
}

2 个答案:

答案 0 :(得分:1)

存储您的滚动偏移: float scrollstartX1, scrollStartY1;

然后仅在滚动评估后运行动作,但仅限于坐标不同。

public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
  if (scrollstartX1 != e1.getX() || scrollStartY1 != e1.getY()) {
    scrollstartX1 = e1.getX();
    scrollStartY1 = e1.getY();
    //Code here should only execute once per scroll
  }
}

基于this answer

答案 1 :(得分:0)

也许你想要onFling()而不是onScroll()......

@Override
public boolean onFling(MotionEvent event1, MotionEvent event2, 
        float velocityX, float velocityY) {
    Log.d(DEBUG_TAG, "onFling: " + event1.toString()+event2.toString());
    return true;
}