2012-05-02 5 views
1

스택과 같이 하나씩 또 다른 하나의 프레임보기에서 두 개의 캔버스보기가 있습니다.Framelayout, 다른보기 아래에있는보기와 상호 작용

<Framelayout> 
     <Canvas /> // Canvas underneath 
     <Canvas /> // Canvas available to user for interaction. 
</Framelayout> 

두 캔버스가 전체 영역을 차지하고 캔버스 밑이 캔버스 위를 완전히 덮습니다. 두 캔버스 모두 투명하므로 사용자는 두 캔버스 모두 볼 수 있습니다 (내용이있는 경우).

사용자가 터치 상호 작용을 사용하여 상단 캔버스에 그릴 수있게했습니다.

상단 캔버스에 터치 리스너를 사용하지 않도록 설정하여 사용자가 아래 캔버스에 그려 지지만 상단 캔버스가 계속 표시되도록하는 방법은 무엇입니까? 상단 캔버스는 사용자가 터치 입력과 상호 작용하지 않습니다. 그리고 대신에 낮은 캔버스가 상호 작용하고 있습니다.

캔버스가 아닌 버튼으로 테스트 중이며, 위쪽 버튼 만 클릭 이벤트에 응답합니다. 캔버스 뷰의 경우에도 확장이 동일합니다.

나는 dispatchTouchEvent()와 같은 메서드가 필요하다고 생각합니다. 현재 작동하지 않거나 잘못 사용하고있을 수도 있습니다.

답변

2

터치 이벤트를 기본 캔버스로 전달하기 만하면됩니다. 예를 들어

: 터치 리스너가 true 반환 될 때까지

canvas.setOnTouchListner(new View.OnTouchListener(){ 

onTouch(View view, MotionEvent event) 
    {  
     canvasUnder.onTouch(event); 
    } 
}); 
+0

그래, 그게 나에게 발생했지만, 다른 방법은 없습니다. 상단보기에 대한 입력을 비활성화하고 싶습니다. 모든 터치 이벤트는 바로 아래에서 볼 수 있습니다. –

2

터치 이벤트가보기 나무를 계단식.

하나의 캔버스는 항상 다른 하나의 "밑에"있기 때문에 최상위 수준의 캔버스를 하위 수준의 자식으로 만드는 것이 좋습니다. 이것은 하단 수준이 일종의 사용자 정의 ViewGroup이어야한다는 것을 의미합니다.

어느 쪽이든, 당신은 터치 이벤트를 처리하기 위해 최고 수준의 캔버스를하지 않으려는 경우, 바로 위에 캔버스를 위해 이런 일을 수행 할 바닥 캔버스에 그런

@Override 
public void onTouch(View view, MotionEvent event) { 
    if(touchHandled()) 
     return true; 
    else 
     return false; 
} 

뭔가를 :

@Override 
public void onTouch(View view, MotionEvent event) { 
    handleBottomLevelTouchEvent() 
} 
+0

touchHandled() 란 무엇입니까? –

+0

그것은 당신이 원하는 모든 방법입니다. 사용자가 뷰를 터치하면 액션이 수행됩니다. 사용자의 터치 동작이 뷰가 찾고자하는 동작이 아니라고 판단되면 false를 반환하여 터치를 상위 뷰까지 이동합니다. 당신은 또한 진실을 되 돌리는 * 것을 가지고 있지 않습니다. 사용자가 뷰에 아무런 영향을주지 않으면 액션을 수행 한 다음 false를 반환하여 계속 터치를 유지할 수 있습니다. – DeeV