펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO
ListView Adapter 내부 getView 메소드에서 아래와 같은 방식 적용
public View getView(int position, View convertView, ViewGroup parent) {
.
.
.
HorizontalScrollView mScrollView = (HorizontalScrollView) convertView.findViewById(R.id.rf_horizon_scroll);
mScrollView.setOnTouchListener(new ScrollViewOnTouchListener(mScrollView, position));
.
.
}
private class ScrollViewOnTouchListener implements View.OnTouchListener {
HorizontalScrollView view;
float historicX = Float.NaN;
static final int DELTA_ON_CLICK = 30; // 이동 허용 범위
long historicTime;
int position;
public ScrollViewOnTouchListener(HorizontalScrollView view, int position){
this.view = view;
this.position = position;
}
@Override
public boolean onTouch(View v, MotionEvent event)
{
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
v.setBackgroundColor(Color.parseColor("#D5D5D5")); // 터치된 리스트 아이템 색상 변경을 위한 코드
historicX = event.getX();
historicTime = System.currentTimeMillis();
break;
case MotionEvent.ACTION_UP:
if (Math.abs(event.getX() - historicX) < DELTA_ON_CLICK) {
// 아이템 터치시 작업할 내용
}
break;
case MotionEvent.ACTION_CANCEL:
v.setBackgroundColor(Color.parseColor("#00000000")); // UP or CANCEL 이벤트 발생 시 아이템 배경색 원상복구
break;
default: return false;
}
return true;
}
}
설명 : 리스트뷰 내부에 스크롤뷰 영역은 리스트뷰의 아이템 터치이벤트가 발생하지 않는다.
때문에 스크롤뷰에 클릭 리스너를 등록하여 최초 터지 지점(DOWN) 부터 UP 까지의 픽셀이 짧은 경우 스크롤링이 아닌
단순 터치로 판단하고 그에 따른 이벤트를 실행하는 방법이다.
경우에 따라 시간 필터를 추가로 적용 가능하다.
'Android > View' 카테고리의 다른 글
Dialog 뒤의 뷰 터치 가능하게 하기 (0) | 2016.03.07 |
---|---|
Drawable 폴더의 이미지를 Bitmap으로 만드는 방법(drawable resource to bitmap) (0) | 2015.01.29 |
해상도에 맞게 픽셀(px)값을 디피(dp)값으로 변경하기 (0) | 2015.01.19 |
TextView에 marquee 적용하기 (0) | 2014.04.24 |
간단한 얼럿다이얼로그 출력 (0) | 2014.04.15 |