2013-10-14 1 views
2

android.support.v4.view.ViewPager 안에 achartengine GraphicalView 차트가 있습니다.aviewengine을 뷰 페이지 내에서 패닝합니다.

사용자가 손가락을 드래그 할 때 내 차트가 이동하려고하지만, 이제는 작은 드래그 동작 후에 이벤트가 ViewPager에 걸렸습니다.

가급적이면 사용자가 차트 끝으로 이동 한 다음 ViewPager에서 페이지 전환을 허용 할 수 있어야합니다. 다른 방법으로 ViewPager가 차트 내부에서 끌기 동작을 잡는 것을 막고 싶습니다.

아이디어가 있으십니까?

답변

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); 
} 
} 
+0

때때로이 문제는 ViewPager에서 꼬집을 때 예외가 발생했기 때문에 삭제해야했습니다. ViewPager가 이상한 "남은"이벤트를 포착하고 있었다고 생각합니다. –

+0

그동안 다른 해결책을 찾았습니까? 저는'GraphicalView'를 만질 때마다'requestDisallowInterceptTouchEvent'를 호출합니다. 당신이했던 것과 같은 방식으로 그 솔루션을 조정하려고 시도하고 싶었고 당신의 코멘트를 발견하려고했습니다 ... – prom85

+1

아니요 ... 제가 해결할 수 없었습니다. SDK에서 예외가 발생했기 때문입니다. 잠시 후 나는 그만 뒀다. 올바르게 호출 한 경우 팬 및 핀치 (확대/축소) 동작을 사용했기 때문에 충돌이 발생했습니다. 그래픽이 확대되지 않으면 어쩌면 작동 할 수도 있습니다. 구현하고자하는 것이 어쨌든 사용자를 혼란스럽게 만들었다 고 말할 수 있습니다. 때로는 그래픽으로 화면 이동하고, 다른 시각에서는 전체보기를 팬하는 것이 약간 무작위로 보였습니다. 한 번의 작업에 GraphicalView 영역을 사용하는 것이 더 간단합니다. 그래픽을 이동 (또는 확대/축소)하십시오. –

1

직접 ViewPager를 구현하고 Touch 이벤트를 직접 처리해야한다고 생각합니다.

은 어쩌면이 링크는 당신을 도와줍니다 : how to disable viewpager adapter on touching specific views?

+0

고마워요! 그것이 그것을 할 수있는 방법이기 때문에 나는 upvoted지만, 나는 그 해결책에 만족하지 않았다. requestDisallowInterceptTouchEvent를 사용하여 좋은 결과를 얻고 있습니다. 작업이 끝나면 솔루션을 게시합니다. –

+0

@TiagoA. : Upvote에 감사 드리며 귀하의 솔루션을 보게되어 기쁩니다 –