화면을 손가락으로 터치하여 따라 움직이게 하고 싶을때는 아래와 같이 하면 된다.
이것은 내 작품중에 "지하철 어디있니" 라는 앱에서 배경을 스크롤 시킬때 사용하는 방식인데...
해당부분만 따로 보기 좋게 정리한것이다.
private LinearLayout mBgLayout;
private int mTouchDownX, mTouchDownY;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mBgLayout = (LinearLayout)findViewById(R.id.BgLayout);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
mBgLayout.scrollBy(mTouchDownX - (int)event.getX(), mTouchDownY - (int)event.getY());
break;
case MotionEvent.ACTION_MOVE:
mBgLayout.scrollBy(mTouchDownX - (int)event.getX(), mTouchDownY - (int)event.getY());
mTouchDownX = (int)event.getX();
mTouchDownY = (int)event.getY();
break;
case MotionEvent.ACTION_DOWN:
mTouchDownX = (int)event.getX();
mTouchDownY = (int)event.getY();
}
return true;
}
원리는 의외로 간단하다...
터치리스너로 화면에 손가락이 닿으면 좌표를 저장해 두었다가 손가락이 움직이면 움직인 현재좌표와 비교하여 움직인만큼 배경을 스크롤시키는것이다... 이때 다시 좌표를 저장해야 한다...
다만 리스트뷰가 있을때에는 터치이벤트가 잡히지 않으니 사용할수 없고
배경 layout의 다른뷰에서 리스너를 사용하고 있다면 그뷰의 터치리스너에도 위소스를 붙여넣어야 한다. 왜냐하면 배경 layout보다 자식뷰의 리스너가 더 우선되기 때문이다...
도움이 되셨기를 바래요~
'개발 > android' 카테고리의 다른 글
페이스북 안드로이드 sdk로 담벼락 글쓰기... 정리 2가지 (1) | 2014.01.09 |
---|---|
스레드에서 View 변경시 Only the original thread…. 에러 대처법 (0) | 2013.11.25 |
큰 배경이미지 사용시 OutOfMemoryError의 확실한 해결법 (12) | 2013.10.04 |
단말기 해상도에 관계없이 항상 같은 크기로 이미지를 보여주고 싶을때 (0) | 2013.08.29 |
페이스북앱이 설치되어 있을때 페이스북 api로 로그인이 안되는 문제 (21) | 2013.08.23 |