ScrollView와 HorizontalScrollView를 이용해서 ImageView(화면크기를 넘어서는)를 스크롤 하려고 한다.



기본적으로 제공되는 아래와 같은 형태의 Layout으로는 가로스크롤 따로, 세로스크롤 따로 밖에 되지 않는다.

<ScrollView
..
>
<HorizontalScrollView
...
>
<ImageView
...
/>
</HorizontalScrollView>
</ScrollView> 

위와 같이 되어있는 레이아웃의 경우,
각 뷰에 대한 이벤트가 한번에 하나씩만 일어나기 때문에,
이미지뷰는 대각선으로 스크롤 되지 않는다.

이를 해결하기 위해 OnTouchListener로 이벤트를 직접 조작했다.
(horizontalscrollview, scrollview 둘중 하나에만 이벤트가 일어나도 가로챈다.)
이 방법은 
멤버변수 선언 메소드 구현 터치리스너 override 터치리스너 등록
4단계로 이루어진다.






1. 멤버변수 선언


2. 좌표처리 메소드 구현


3. OnTouchListener

4. touchListener 등록







화면 디스플레이 크기보다 큰 이미지를 넣고 해보면 확인 할 수 있다.

실제로 가로스크롤과 세로스크롤이 모두 한꺼번에 사용되는 걸 볼 수 있다.

Posted by croute

댓글을 달아 주세요

  1. 나그네 2011.07.20 11:35  댓글주소  수정/삭제  댓글쓰기

    이왕 올릴거면 코드를 제대로 올리기나 하지. 쓰레기 블로그...

    • Favicon of https://croute.me BlogIcon croute 2011.07.20 12:23 신고  댓글주소  수정/삭제

      감사합니다~ ^^
      예전에 공부할때 올렸던건데,
      저거 보고 이해 안되시다니...
      어쨋든 전 오래살겠군요~ ㅋ

      ------------------------------------------------

  2. righteous 2011.08.03 11:55  댓글주소  수정/삭제  댓글쓰기

    설명도 잘되있고 괜찮구만
    여기말고도 쓰레기 블러그가 얼마나 많은데 여기서 그딴 글을 남기시는지 이해가 안감

  3. righteous 2011.08.03 11:56  댓글주소  수정/삭제  댓글쓰기

    근데 여기서 자꾸 죽네요 nullpointexception 떠여 ㅋ
    Scroll_Vertical.setOnTouchListener((OnTouchListener)touchHandler);
    해결 방법좀 메일로 보내주세요~ ^^ ppelo@Naver.com

    • Favicon of https://croute.me BlogIcon croute 2011.08.03 12:01 신고  댓글주소  수정/삭제

      NullPointException 이 뜬다면,
      아마도 스크롤뷰들의 인스턴스와 레이아웃에 있는 뷰가 연결이 안되어있는것 같군요.

      xml 레이아웃이랑 매칭시켜서 뷰를 참조해줘야되요.
      예를들면
      XML 레이아웃에
      ScrollView하고 HorizontalScrollView를 만들어 두신 담에,
      아이디를 부여하시고

      이 녀석들을 자바코드에서 Scroll_Vertical / Scroll_Horizontal 과 연결을 해주어야 합니다.

  4. 안녕용 2011.08.24 11:33  댓글주소  수정/삭제  댓글쓰기

    ScrollTest 가 머져?? 이거 에러뜨네용 ㅠㅠ이거 import시키는거 따로있나여?? 컨트롤알트o눌러서 임포트 다했는데 왜 에러가 ㅠ

    • Favicon of https://croute.me BlogIcon croute 2011.08.24 13:27 신고  댓글주소  수정/삭제

      안드로이드 애플리케이션 개발은
      자바기반으로 합니다.

      자바는 객체지향 언어이지요.

      클래스이름.변수명 으로 접근하는건,

      클래스 내에서 접근할 수 있도록 접근제한자(가시성)이 설정되어 있는
      변수들에 한해서 가능하구요.

      쉽게 말하면, ScrollTest는 클래스 이름입니다.

  5. 안녕용 2011.08.24 14:02  댓글주소  수정/삭제  댓글쓰기

    package exam.MTBItest;

    import android.app.*;
    import android.os.*;
    import android.view.*;
    import android.view.View.OnTouchListener;
    import android.widget.*;

    public class Problem extends Activity implements OnTouchListener{
    private static HorizontalScrollView Scroll_Horizontal;
    private static ScrollView Scroll_Vertical;
    protected static int currentX = 0;
    protected static int currentY = 0;

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    // setContentView(R.layout.first);

    Scroll_Vertical = (ScrollView) findViewById(R.id.verticalScroll);
    Scroll_Vertical.setOnTouchListener(this);
    Scroll_Horizontal = (HorizontalScrollView) findViewById(R.id.horizontalScroll);
    Scroll_Horizontal.setOnTouchListener(this);
    }


    public static void scrollBy(int x, int y){
    Scroll_Horizontal.scrollBy(x, 0);
    Scroll_Vertical.scrollBy(0, y);
    }

    OnTouchListener touchHandler = new OnTouchListener()
    {
    public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()){
    case MotionEvent.ACTION_DOWN :
    currentX = (int)event.getRawX();
    currentY = (int)event.getRawY();
    break;
    case MotionEvent.ACTION_MOVE :
    int x2 = (int)event.getRawX();
    int y2 = (int)event.getRawY();
    scrollBy(currentX-x2, currentY-y2);
    currentX = x2;
    currentY = y2;
    break;
    case MotionEvent.ACTION_UP :
    break;
    default :
    currentX = (int)event.getRawX();
    currentY = (int)event.getRawY();
    break;
    }
    currentX = (int)event.getRawX();
    currentY = (int)event.getRawY();
    return false;
    }
    };

    @Override
    public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub
    return false;
    }

    }


    이거 보고 따라햇는데 안되는게 잘모르겟어여 제가 잘못한건가여 ㅎ

  6. Favicon of http://ryuhyunjin.com BlogIcon 커널제로 2012.02.02 17:01  댓글주소  수정/삭제  댓글쓰기

    잘되네요.

    xml상의 scrollview와 horizontalscrollview id를 findbyid로 잘 매칭해주면 되네여

  7. BlogIcon soogi 2012.08.17 15:59  댓글주소  수정/삭제  댓글쓰기

    정말 유용하게 잘 썼습니다..ㅎㅎ...감사해요..