2011-12-21 2 views
6

안드로이드 마켓 (ViewPager)에서와 같이 가로 스크롤 페이지가 있습니다.가로 스크롤 ViewPager 내부보기

내 문제는 일부 이미지가있는 가로 스크롤보기가 필요하다는 것입니다. 그럴 수 있습니까 ??

이제 내보기에서 작은 스크롤을 얻은 다음 전체 페이지가 스크롤됩니다.

시간 내 주셔서 감사합니다.

+0

시계 [이] (http://stackoverflow.com/questions/7774642/scroll-webview-horizontally-inside-a-viewpager) 답. 하지만 그 대답에서 사용자 지정 WebView 대신 HorizontalScrollingView를 확장해야 할 수도 있습니다. – grine4ka

답변

0
<Linearlayout> 
    <linearlayout> 
     <scrollView> 
      <ImageView1></ImageView> 
      <ImageView2></....> 
     </scrollView> 
    </Linearlayout> 
    <EditText> 
</Linearlayout> 

위의 경우, scrollVIew는 edittext가 아닌 두 이미지에만 적용됩니다. 다른 경우

:

<Linearlayout> 
    <linearlayout> 
     <scrollView> 
      here listVIew with Images using listView adapter 
     </scrollView> 
    </Linearlayout> 
    <EditText> 
</Linearlayout> 

여기있는 ScrollView는 목록보기에 적용됩니다.

18

HorizontalScrollView을 확장하고 터치 이벤트를 차단해야합니다. 대신 레이아웃 XML에 HorizontalScrollView를 사용하는이 사용자 정의보기를 사용해야합니다, 그리고

public class MyScrollView extends HorizontalScrollView { 

    public MyScrollView(Context p_context, AttributeSet p_attrs) 
    { 
     super(p_context, p_attrs); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent p_event) 
    { 
     return true; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent p_event) 
    { 
     if (p_event.getAction() == MotionEvent.ACTION_MOVE && getParent() != null) 
     { 
      getParent().requestDisallowInterceptTouchEvent(true); 
     } 

     return super.onTouchEvent(p_event); 
    } 
} 

: 무엇 나를 위해 일한 것은 다음 샘플이었다. 그것은 하나에 도달 할 때까지 HorizontalScrollView 스크롤됩니다

나 한테 무슨이 솔루션을 회복하는 것은 내가 솔루션을 재 작업 그리고 마지막으로 그것에게 그것의 Gmail에서 수행 된 것 같은 방법을 구현하는 매우 간단한 방법을 발견했습니다 this post

+0

그것은 나를 위해 작동, 다른 솔루션을하지 마! 하지만 그것은 사용자 정의 scrollview 내부의 버튼에 대한 클릭 처리를 비활성화하는 것 같습니다. 어떤 생각? – user1365836

+0

@ user1365836 예 ... 좀 지저분해질 수 있습니다 ... 내가 한 것은 getHitRect를 사용하여 정확한 버튼을 누른 다음 onClick 함수를 호출하는 것입니다. – Muzikant

+6

할 수있는 유일한 작업은 스크롤링을 허용하지만 사용자가 내부 요소를 클릭하면 onInterceptTouchEvent() 내부에서 모든 것을 제어 할 수 있습니다. https://gist.github.com/brandondenney/b8ddd655664eb295129d – Brandon

1

입니다 그것의 가장자리의. 그런 다음 다음 스크롤시 전체 페이지가 스크롤됩니다.

HorizontalScrollView를 재정 의하여 스크롤 방향과 가장자리를 검사하고 내용을 실제로 스크롤 할 수 있는지 확인해야했습니다.

@Override 
public boolean onTouchEvent(MotionEvent ev) 
{ 
    if (no_scrolling) 
     return false; 

    // Standard behavior 
    // 
    return super.onTouchEvent(ev); 
} 

boolean no_scrolling = false; 
float old_x, old_y; 
@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) 
{ 
    int action = ev.getActionMasked(); 
    Log.d(at_data.TAG, "HSV scroll intercept: " + String.format("0x%08x", action)); 

    if (action == MotionEvent.ACTION_DOWN) 
    { 
     old_x = ev.getX(); 
     old_y = ev.getY(); 
     no_scrolling = false; 

    } 
    else if (action == MotionEvent.ACTION_MOVE) 
    { 
     float dx = ev.getX() - old_x; 
     float dy = ev.getY() - old_y; 

     if (Math.abs(dx) > Math.abs(dy) && dx != 0) 
     { 
      View hsvChild = getChildAt(0); 
      int childW = hsvChild.getWidth(); 
      int W = getWidth(); 

      Log.d(at_data.TAG, "HSV " + childW + " > " + W + " ? dx = " + dx + " dy = " + dy); 
      if (childW > W) 
      { 
       int scrollx = getScrollX(); 
       if ((dx < 0 && scrollx + W >= childW) || (dx > 0 && scrollx <= 0)) 
       { 
        Log.d(at_data.TAG, "HSV Wider: on edge already"); 
        no_scrolling = true; 
        return false; 
       } 
       else 
       { 
        Log.d(at_data.TAG, "HSV Wider: can scroll"); 
        no_scrolling = false; 
       } 
      } 
      else 
      { 
       Log.d(at_data.TAG, "HSV cannot scroll in desired direction"); 
       no_scrolling = true; 
      } 
     } 
    } 

    // Standard behavior 
    // 
    return super.onInterceptTouchEvent(ev); 
}