2012-02-29 2 views
3

저는 Android 개발에 익숙하지 않고 순간적으로 제스처 입력을 제어 할 위치를 결정해야합니다. 그러나 터치 입력을 가져올 위치와 장단점을 알지 못합니다. 나는 두 가지 대안을 받았다. 어느 쪽이든 찬반 양론을 나에게 설명해 주시겠습니까?어디서 Android onTouchListener를 구현해야합니까?

보기의 수신기 설정; 구현 방법 :

faceView.setOnTouchListener(new OnTouchListener(){ 
    public boolean onTouch(View arg0, MotionEvent arg1){ 
    return false; 
    } 
); 

또는 개인적으로 리스너를 사용하는 것이

public boolean onTouchEvent(MotionEvent event){ 
    return false; 
} 

답변

2

접근법 1 : 익명 내부 유형.

faceView.setOnTouchListener(new OnTouchListener(){ 
    public boolean onTouch(View arg0, MotionEvent arg1){ 
    return false; 
    } 
); 

이것은 이름이없는 선언이므로 익명입니다. OnTouchListener mytouch =이 없으며 new OnTouchListener() 선언 만 있습니다. 이 클래스는 다른 클래스 안에 있기 때문에 내부 클래스이며, 이는 인터페이스 구현이므로 하나의 유형입니다.

좋습니다. 이 접근법은 개발자에게 더 편리합니다. 기능은 격리되어 있으며 (일반적으로 청취 가능 선언) 쉽게 관리 할 수 ​​있습니다. 그러나 이러한 편의성에는 비용이 따릅니다. 10 개의 onClickListener가있는 버튼이 있다고 가정합니다. 이 방법을 사용하면 새 익명 내부 유형마다 가비지 수집 대기열이 빠르게 채워집니다.

하지만 상관이 있습니까? 그렇지 않아. 시스템에서 1 마이크로 초의 성능을 얻으려고한다면이 방법을 사용하지 마십시오. 그러나 일반적으로, 이것은 실행 가능합니다.

접근법 2 : 단일 상속

public boolean onTouchEvent(MotionEvent event){ 
    return false; 
} 

위 읽어 가정은,이 방법은 생성 및 정리를위한 훨씬 낮은 비용을 가지고있다. 인스턴스화 된 추가 클래스는 1 개 뿐이며 GC 큐에 추가 된 객체는 1 개뿐입니다.

이것은 내가 사용하는 접근 방식이며 잠시 동안 사용했습니다. 또한 Google의 샘플 소스 코드에서 볼 수 있습니다.

하지만 완벽하지는 않습니다! onTouchEvent의 구현은 다음과 같은보고 끝날 것 :

public void onTouch(Event e){ 
if (e.equals(View1)){ 
}else if (e.equals(View2)){ 
}else if (e.equals(View 3)){ 
...} 

는 SO

는 솔직히, 그건 문제가되지 않습니다. 가능한 한 최고의 성능을 원한다면 정적 onTouchEvent 리스너를 사용하면 위에 언급 한 비용을 지불 할 필요가 없지만 대부분 비용이 많이 들지는 않습니다.

0

보기 내

재정의 방법은, 당신의에서 onCreate 방법, 지금

0

에 대한 괜찮을 것을 사용 대부분의 경우, setOnTouchListener를 사용하는 것이 더 유연 할 것이고 일반적인 Java 패턴을 따를 것이다. 일반적으로 onTouchEvent를 오버라이드하는 것은 뷰 내에서 항상 발생하는 이벤트와 변경되지 않는 이벤트에 대해서만 사용됩니다. onTouchEvent를 재정의하려면 View 클래스를 정의해야합니다. 버튼과 같은 것을 사용할 때 클릭 이벤트를 처리하기 위해 자신 만의 버튼 클래스를 구현해야하는 것은 당연합니다!

faceView.setOnTouchListener

프로

  • 쉽게 사용자 정의 할 수 있습니다

단점이

  • 을 초래할 수있는 일반적으로 인정 된 자바 패턴을 따릅니다 동작이 변경되지 않으면 불필요한 setter.

오버라이드 프로

  • 기본 클래스

단점의 기능을 캡슐화 onTouchEvent

  • 사용자 정의를 허용하지 않습니다
관련 문제