2

内に achartengine GraphicalView チャートがありandroid.support.v4.view.ViewPagerます。

ユーザーが指をドラッグしたときにグラフをパンしたいのですが、小さなドラッグ動作の後、ViewPager によってイベントがキャッチされています。

できれば、ユーザーがチャートの最後までパンできるようにしてから、ViewPager でページを切り替えられるようにしたいと考えています。別の方法として、少なくともViewPagerがチャート内のドラッグの動きをキャッチするのを止めたいと思います。

何か案は?

4

2 に答える 2

2

これが私の解決策です。

データが含まれている間、ユーザーはグラフをドラッグできます。その後、ドラッグ イベントは ViewPager によってキャッチされます。

私が言ったように、重要なのは、このソリューションがrequestDisallowInterceptTouchEvent関数であることです。

public class ParameterGraphicalView extends org.achartengine.GraphicalView {

// stores the data model size
private int mDataSize = 0;
// stores the first X position in the dataset
private long mDataStartX = 0;
// stores the last X position in the dataset
private long mDataEndX = 0;

// the ViewPager
private ViewParent mViewPager;
//(...)
@Override
public boolean onTouchEvent(MotionEvent event) {

    // save the position of the first touch so we can determine whether the user is dragging
    // left or right
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        mFirstTouchX = event.getX();
    }

    // when mViewPager.requestDisallowInterceptTouchEvent(true), the viewpager does not
    // intercept the events, and the drag events (pan, pinch) are caught by the GraphicalView

    // we want to keep the ViewPager from intercepting the event if:
    // 1- there are 2 or more touches, i.e. the pinch gesture
    // 2- the user is dragging to the left but there is no data to show to the right
    // 3- the user is dragging to the right but there is no data to show to the left
    if (event.getPointerCount() > 1
            || (event.getX() < mFirstTouchX && mDataSize > 0 && mRenderer.getXAxisMax() < mDataEndX)
            || (event.getX() > mFirstTouchX && mData.size() > 0 && mRenderer.getXAxisMin() > mDataStartX)) {
        mViewPager.requestDisallowInterceptTouchEvent(true);
    }
    else {
        mViewPager.requestDisallowInterceptTouchEvent(false);
    }

    return super.onTouchEvent(event);
}
}
于 2013-10-15T14:32:13.647 に答える
1

独自の ViewPager を実装し、Touch イベントを自分で処理する必要があると思います。

たぶん、このリンクが役立ちます:特定のビューに触れるときにviewpagerアダプターを無効にする方法は?

于 2013-10-14T12:01:37.480 に答える