본문 바로가기

Programming/android

스크롤상태를 확인가능한 ScrollView

스크롤뷰에서, 스크롤된 상태를 알수 없을 경우가 있기 때문에, 만든 커스텀 위젯입니다.
현재, HorizontalScrollView를 기준으로 만들었는데, 그냥 ScrollView도 다음과 같이 하시면 바로 적용가능하시겠네요.
스크롤뷰의 위치가 어디에 위치했는가를 알려줍니다.

상태는 세가지가 있습니다.
public static enum DIRECTION { LEFT, RIGHT, NONE }
스크롤이 움직이게 되면, 커스텀 위젯의, 
OnEdgeTouchListener 가 호출되고, 여기서 스크롤 위치를 계산하여
콜백을 날려주게 됩니다. 
이때, 위의 DIRECTION상태에 따라서, 원하시는 액션을 취해주시면 됩니다.

만든 방법은, 스크롤 될때마다 computeScroll을 호출하기 때문에, 이때마다 위치를 계산하여, 인터페이스를 등록한후 콜백을 날려주는 겁니다.

사용방법은 커스텀뷰 생성후에, 생성된 커스텀 뷰에
setOnEdgeTouchListener를 등록하여 사용하면 됩니다.
 

CustomHorizontalView.java

import android.content.Context;

import android.graphics.Path.Direction;

import android.util.AttributeSet;

import android.widget.HorizontalScrollView;


/**

 * 스크롤뷰가 가장자리에 다다랐는지 확인하기 위해 사용하는 커스텀 ScrollView

 * @author 이현정(g.littlepanda@gmail.com)

 */

public class CustomHorizontalScrollView extends HorizontalScrollView {

protected OnEdgeTouchListener onEdgeTouchListener;


public static enum DIRECTION { LEFT, RIGHT, NONE };

public CustomHorizontalScrollView(Context context) {

super(context);

}


public CustomHorizontalScrollView(Context context, AttributeSet attrs) {

super(context, attrs);

}


public CustomHorizontalScrollView(Context context, AttributeSet attrs,

int defStyle) {

super(context, attrs, defStyle);

}

 

public void setOnEdgeTouchListener(OnEdgeTouchListener l){

this.onEdgeTouchListener = l;

}


@Override

public void computeScroll() {

super.computeScroll();

if(onEdgeTouchListener != null){

if(getScrollX()==0){

onEdgeTouchListener.onEdgeTouch(DIRECTION.LEFT);

} else if((getScrollX() + getWidth())==computeHorizontalScrollRange()){

onEdgeTouchListener.onEdgeTouch(DIRECTION.RIGHT);

} else {

onEdgeTouchListener.onEdgeTouch(DIRECTION.NONE);

}

}

}

public interface OnEdgeTouchListener {

void onEdgeTouch(DIRECTION direction);

}

}

 

요런식으로 사용.
사용방법.java

listScrollView.setOnEdgeTouchListener(new CustomHorizontalScrollView.OnEdgeTouchListener() {

@Override

public void onEdgeTouch(DIRECTION direction) {

if(direction==DIRECTION.LEFT){

if(leftDirectionImg.getVisibility()==View.VISIBLE){

leftDirectionImg.setVisibility(View.INVISIBLE);

}

} else if(direction==DIRECTION.RIGHT){

if(rightDirectionImg.getVisibility()==View.VISIBLE){

rightDirectionImg.setVisibility(View.INVISIBLE);

}

} else if(direction==DIRECTION.NONE){

if(leftDirectionImg.getVisibility() != View.INVISIBLE){

leftDirectionImg.setVisibility(View.VISIBLE);

}

if(rightDirectionImg.getVisibility() != View.INVISIBLE){

rightDirectionImg.setVisibility(View.VISIBLE);

}

} else {

throw new IllegalArgumentException("Invalid direction. please check direction.!");

}

}

});


나름 열심히 만들었으니 불펌하지 말아주세요. 도움이 되셨다면 댓글 하나라도 남겨주시구요~
 
 
2012-05-07  덧붙입니다.. 

별거 아닌데, 다들 유용하게 사용하셨다니, 기분이 좋네요. 코멘트 남겨주신 분들 감사합니다.
다들 즐겁게 개발하시기를 빕니다.