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  댓글주소  수정/삭제  댓글쓰기

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