펌 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 | Posted by 덩치 2016. 3. 7. 16:56

Dialog 뒤의 뷰 터치 가능하게 하기

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO



mDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);


추가


응용 : 구글맵에서 CustomDialog가 떠 있는 상태에서 다른 마커를 터치시 바로 마커 터치이벤트가 발생

          해당 옵션이 없는 상태에서 마커를 터치하면 Dialog Outside터치이벤트가 발생하고 마커 터치이벤트 발생 X