안녕하세요. ViewPager를 사용하여, 개발하는데 질문이 있습니다.
기기는 갤럭시플레이어, 갤럭시탭10.1인치로 개발중이며,
플랫폼은 안드로이드 아이스크림입니다.
첫번째페이지에서 왼쪽으로 플리킹을 시도하면, 화면이 움직이지 않고 (당연히 이전페이지가 없으므로) 가만히 있습니다.
제가 하고싶은건 Elastic Behavior 이라고 하나요??
터치다운~ 터치무브까지의 이벤트가 일어났을때, 첫번째페이지가 오른쪽으로 가다가 , 혹은 간 상태를 유지하다가
터치업이 일어났을때, 다시 정상위치로 돌아가는것을 하고싶습니다.
혹시 ViewPager에서 자체적으로 제공해주는 api가 있거나, 알고리즘을 알고계신분
비가 내리네요. 답변 기다리겠습니다.^^
첫페이지에서 이전페이지가 없어서 그런지 화면이 오른쪽으로 이동을 하지 못하네요..
이전페이지를 빈페이지로 하나 추가하고 해도.ㅠ
scrollto, scrollby 둘다 시도해보았는데 안되네요; smoothscroll은 viewpager에서 지원하지않는거같구요.
답변 감사합니다. 좀더 연구해봐야겠네요
ViewPager 코드를 보니
onTouchEvent() 에서 MotionEvent.ACTION_UP 일때, 현재 아이템 포지션을 왼쪽으로 가면 -1, 오른쪽으로가면 +1 해주는 코드가 잇더군요
case MotionEvent.ACTION_UP:
if(...){
if(...){
setCurrentItemInternal(mCurItem-1, true, true);
} else {
setCurrentItemInternal(mCurItem+1, true, true);
}
} else {
setCurrentItemInternal(mCurItem, true, true);
}
android-support-v4.jar 파일의 ViewPager를 수정하여 리빌드해서 사용하고 싶은데 가능한가요?
수정해서 리빌드하는 것은 차선책이고 상속받아서 재정의 해주시면 됩니다.
제가 그렇게 쓰고 있습니다.
@Override
public void scrollBy ( int x, int y ) {
mSavedX += x;
int currentItem = getCurrentItem();
Utils.logging( this, "x : " + x
+ "savedX : " + mSavedX
+ " curr : " + currentItem
+ " count : " + mCount
+ " width : " + getWidth());
if ( currentItem == 0 ){
if ( mSavedX < 0 ){
setCurrItem();
return;
}
}
if ( currentItem == mCount-1 ){
if ( mSavedX > 0 ){
setCurrItem();
return;
}
}
super.scrollBy( x, 0 );
if ( getWidth() - Math.abs( mSavedX ) < HORIZONTAL_ITEM_CHANGE_THRESHOLD ) {
if ( mSavedX < 0 ){
setPrevItem();
} else {
setNextItem();
}
}
}
public void setNextItem(){
mSavedX = 0;
setCurrentItem( getCurrentItem()+1 , true );
}
public void setPrevItem(){
mSavedX = 0;
setCurrentItem( getCurrentItem()-1 , true );
}
public void setCurrItem(){
mSavedX = 0;
setCurrentItem( getCurrentItem() , true );
}
set ~ item 류에서 true로 들어가는 인자가 smooth scroll 사용 여부에 대한 flag입니다.
viewpager에서 지원하는 api는 잘 모르겠고,
이렇게 구현하시면 되지 않을까 하네요.
ontouch를 오버라이드 하셔서, down시 이를 추적하고 계시다가 up 됐을때
첫 페이지라면 scrollto 였나 scrollby였나 메소드로 smooth scroll 옵션을 true로 해서 하면 될것 같습니다.