터치한 뷰 밖으로 손을 드래그 하였을 때 처리 (Focus, clicked, pressed)

조회수 3069회

셀랙터 를 사용할 때, focus, press 말고 더 있었나는 기억이 안나지만,

focus의 정확한 쓰임새를 잘 모르겠습니다 ㅠ

버튼 같은 경우는 터치를 한 상태에서 드래그를 하여 그 버튼의 범위를 한번이라도 넘어가면 버튼 이벤트의 실행이 취소되는데(정확히는 시작도 안한 거지만) 다른 뷰(저는 listview 자체에 주었습니다. 아이템이 아닌) 에서는 누른 상태에서 그 범위를 넘어가도 실행이 되더군요....

listview.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_UP:
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                startActivity(intent);
                break;
        }
        return false;
    }
});

OnClickListener를 사용하면 OnItemClickListener를 사용하라고 하면서 애러가 나서 OnTouchListener를 사용하였는데요. 이것 때문 일지....

뷰 밖으로 손가락을 드래그 해서 이동시켰을 때 취소 처리는 어떻게해야하나요...

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • focus는 안드로이드 키보드 모드(dpad혹은 트랙볼)에서 커서가 해당 아이템에 올라가 있을 때의 상태입니다. 일반적으로는 잘 안쓰이긴 합니다만, ImageView의 contentDiscription처럼 완성도를 올리고 싶을 때 같이 정의해주면 좋을 것 같습니다 알 수 없는 사용자 2016.4.15 17:39

2 답변

  • 제가 잘 이해한 건지는 모르겠지만, onClickListener()를 이용하면 클릭 후 (action_down) 클릭한 걸 취소하려고 뷰 밖으로 포인트를 이동한 후 손을 때면(action_up) onClickListener 안의 onClick은 실행되지 않습니다. ListView는 아이템자체를 클릭할 수 있으므로

    list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Log.d("TEST", "position:" + position);
                }
            });
    

    listView에 setOnItemClickListener를 달면 동일한 동작을 얻을 수 있습니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
  • focus 는 예전 트랙볼의 잔재(?)라고 할 수 있을것 같네요.

    처음 트랙볼을 달고 HTC 에서 디바이스가 나왔을때는, 트랙볼로 각 위젯을 이동 할 수 있었습니다. 트랙볼을 굴려 리스트의 아이템을 이동한다거나 하는 등으로요.

    이렇게 트랙볼로 이동을 하면, click 하거나 touch 하지 않아도 그 위젯이 활성화 된 상태가 되죠. 이상태가 state_focused 가 true 인 상태입니다.

    간혹가다 안드로이드 에뮬레이터나 지니모션등의 시뮬레이터에서 컴퓨터의 방향키로 움직이곤 할때가 있는데 이때도 focus 상태를 사용하게 됩니다.

    트랙볼이 있는 디바이스가 멸종되고, 이후에는 잘 쓰이지 않았죠.

    기본적으로 터치를 사용할때는 focus 상태를 표시하지 않습니다.

    (EditText 에서는 입력할 수 있는 상태를 표시할때 state_focused 를 사용합니다.)

    (어제 Google developer summit 에서 커니님이 발표한 MultiWindows 관련된 내용보니, focus 상태에 대한 얘기가 있었는데 Activity 에 대한 focus 였는지 Widget 에 대한 focus 였는지 정확히 기억이 안나네요.)

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)