어제도 계속 질문드렸는데 해결이 되지 않아 자꾸 도배성글 (같으내용은 아닙니다..)을 올리게 되어 죄송합니다.
질문은
xml의 ScrollView 안에 ImageView, LinearLayout 을 포함하였습니다. LinearLayout이 ImageView를 포함하고있진 않고 각각입니다.
ScrollView로 ImageView의 이미지를 컨트롤 하고 여기에 LinearLayout 을 두어 액티비티 클래스에서 LinearLayout에 view를 상속받은
Draw기능을 하는 View를 addView 해주었습니다.
여기서 문제가 생겼습니다. 예상된 문제이겠지만 LinearLayout을 영역으로 잡고있는 View 를 상속받은 Draw 클래스가
ScrollView의 터치 이벤트 영역에 포함이 되기때문에 Draw 를 위해 터치하는 순간 ScrollView의 상하 스크롤 기능을 하는 터치이벤트가 우선시되어 Draw를 할수가 없더군요..
이에.. 액티비티에서 ScrollView에 TouchListener를 두어 onTouch를 오버라이드 하여 true 값을 반환되게함으로써 ScrollView 영역의 터치 이벤트를 막았으나.. 이것은 단지 기능이 없을 뿐(상하 스크롤 하는 기능) 사실상의 터치 이벤트는 아직도 ScrollView 영역에서 우선시 되어 LinearLayout에 추가된 Draw 기능이 먹히질 않더군요...(스크롤 뷰가 상하 이벤트시의 이벤트를 훔쳐.. 실제로 Draw 기능의 좌우는 되는데 상하가 기능을 안합니다..)
※ 여기서 중요한점은 스크롤뷰 영역의 터치로 인한 스크롤 기능을 막은 것입니다. 상하 버튼을 두어 smoothScrollTo 으로 스크롤 기능을 대체하고있습니다.
그래서 (1)xml 단이나 액티비티 단에서 터치에 의한 스크롤 기능을 enable = flase 같은 거라던지..
아니면 (2)스크롤뷰영역의 터치 이벤트를 사용을 안하겟다던지..
(3)상하 버튼(스크롤 기능을 해주는)을 누를땐 스크롤 기능을 on 하여 스크롤되게하고 up이벤트가 일어나는 순간 스크롤 기능을 false 해준다던지 해서 스크롤 뷰영역의 LinearLayout에서 Draw 기능을 하게 해주고 싶습니다..
난해하고 복잡하고 이해가 잘안가는 질문이겟지만...
너무 절박하고 급하기에 자꾸 글을 올리고 도움을 청합니다..
관련 정보/지식/조언/참고 자료등에 대한 제공을 해주실수 있는분 .. 꼭좀 답변 부탁드립니다.
게시판 계속해서 보고있습니다. 도움을 주시고 싶은데 글에 대한 이해가 잘 안되시면 그것도 리플 주십시요 바로 답변 달겟습니다.
scrollview 안에 linearlayout 넣는 이유는 scrollview 안에있는 imageview 의 크기가 스크롤이 될만큼 길이가 깁니다.
그런데 말씀해주신것 처럼 분리를 해버리면 구현은 가능하나 linearlayout 의 Draw가 보이는 화면 에서만 액션을 합니다.
즉 스크롤기능으로 scrollview 안에 있는 imageview 의 이미지가 하단으로 상단으로 움직이던 말던 linearlayout 에 추가된 Draw영역은
화면에 보이는 곳 즉 처음 설정한 자리에서만 액션을 합니다.
그래서 scrollview 안에다 구지 linearlayout 를 넣어서 imageview 와 함께 스크롤 기능을 하려고 하는것입니다. 스크롤 뷰가 하단으로 내려가면
이미지도 하단으로 내려가고 linearlayout 영역도 같이 스크롤 되어 내려가서 안보이는 화면 즉 스크롤 해서 이동한 곳에서도 draw 기능을 하려는 것이지요.~
이게 이해가 잘 안가는게 잇는데요 정확히 멀 만드는건가요??
지금 말하신거대로라면 이미지가 아래로 이동하면 linearlayout 도 함께 이동해야한다고 하셨는데
스크롤 뷰안에 함꼐 넣어두면 linearlayout 은 이미지 아래를 보기위해 스크롤 하면 자연스럽게 위로 올라가져서 안보이게 되는데
함께 이동한다는게 가능한건지.. 어떤 기능을 구현하려고 이걸 만드시는건지 설명을 해주셔서 답변다실분들이 납득이 가야지
layout 재배치 라던지 답변을 줄수 있지 싶네요 ;;
장문 난독증이 있어서 글을 읽지 못했고
혹시 터치가 겹쳐서 특정 뷰에 스크롤이 안되는 것이라면
원하는 (터치된곳에 스크롤이 되어야 하는) 뷰를
커스텁으로 구현하신 뒤 이 소스를 넣어보세요
제 경우
다음 소스는 스크롤 뷰 안에 맵뷰가 있기 때문에
스크롤 뷰 때문에 맵뷰의 터치 이동이 안되는 문제 해결에 도움이 되었던 겁니다.
@Override
public boolean onTouchEvent(MotionEvent ev)
{
int action = ev.getAction();
switch (action)
{
case MotionEvent.ACTION_DOWN:
// Disallow ScrollView to intercept touch events.
this.getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_UP:
// Allow ScrollView to intercept touch events.
this.getParent().requestDisallowInterceptTouchEvent(false);
break;
}
super.onTouchEvent(ev);
return true;
}
밥아저씨 님께서 말씀하신 것 처럼 어제 제가 거의 같은 답을 해 드렸던 것 같네요..
조금 더 생각하셨으면 몇 분만에 해결될 문제였네요..
방금 급하게 코드짜서 첨부했습니다.
(참조하셔서 원하시는 코드대로 쉽게 바꾸실 수 있습니다.)
* 급한대로 커스텀뷰 아무거나 넣었는데.. 저기에 만드셨다는 커스텀 그림판을 넣으시면 됩니다.
*** 밥아저씨님의 코드를 참고하여 소스 수정해서 다시 올렸습니다.
좋은거 하나 배워가네요~ ㅎㅎ
아하 ㅎㅎ.. 이제서야 이해됫네요 이미지뷰와 리니어레이아웃을 겹쳐놓은 상태엿군여 ㅎㅎ
윗분들이 답변 다셨으니 ㅎㅎ.. 몇번 부딧혀보면 헤쳐나가실거라 생각됩니다 화이팅하세요 ㅎ
밥아저씨 께서 제공해주신 샘플 코드로 이리저리 적용해보다보니 성공했습니다 !!!!
스크롤뷰에 setOnTouchListener 를두고 거기에 제공해주신 샘플코드를 적용하려했더니 안먹혀서 절망했는데 그게아니라
linearlayout 에 추가한 view 클래스 즉, Draw 기능을 하는 클래스의 오버라이드된 온터치이벤트에서
this.getParent().requestDisallowInterceptTouchEvent(true);를 전부 걸었더니 스크롤뷰에 영향을 안받고 Draw 기능이 적용되더군요 ^^
아마 Draw 할때 this.getParent().requestDisallowInterceptTouchEvent(true);를 걸어버림으로써 내가 지금 터치할때 아무도 내 터치이벤트를
훔치지 말아라? 같은 코드 인것같아요 !!
해결됬습니다 정말 감사합니다. 신경써주신분들 감사드립니다. 복받으실거에요!!




전부다 읽진 않고 윗부분만 읽었는데요..
꼭 scrollview 안에다가 linearlayout 과 imageview를 같이 넣어야 하나요. ㅎㅎ
linearlayout + scrollview(imageview) 해서 나누면 그런문제 없지않나요 ㅎㅎ;
꼭 scrollview안에다가 넣어서 나누어야 하는건지 이유가 잇는건지 설계가 어떻게 되며, 어떤 구조의 어플인지 알아야 좀더 확실히 알것같네요