2012-05-02 2 views
1

У меня есть два вида холста в рамке, один на другой, как стек.Framelayout, Взаимодействие с представлениями под другими видами

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

Оба холста, занимающие всю площадь и холст снизу, полностью покрыты холстом. Оба холста прозрачны, поэтому пользователь может видеть и холст (если у них есть какое-либо содержимое).

Позвольте пользователю нарисовать верхний холст, используя сенсорные взаимодействия.

Как отключить сенсорный прослушиватель для верхнего холста, чтобы пользователь теперь рисовал на холсте снизу, но верхнее полотно все еще видно. Верхний холст просто не взаимодействует с сенсорным вводом пользователем. И вместо этого нижний холст взаимодействует.

Я тестирую это с помощью кнопок, вместо холста, только верхняя кнопка реагирует на события щелчка. К тому же это будет иметь место для представлений холста.

Я думаю, что мне нужен какой-то тип dispatchTouchEvent(), как метод. В настоящее время он также не работает, или, может быть, я использую его неправильно.

ответ

2

Просто передайте событие касания к основному холсту.

Например:

canvas.setOnTouchListner(new View.OnTouchListener(){ 

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

Да, это произошло со мной, но нет другого пути. Я хочу просто отключить любой ввод для верхнего представления. и все события касания должны быть непосредственно взяты под просмотр под ним. –

2

сенсорных событий каскадом вниз древовидном пока сенсорный слушатель не возвращает true.

Поскольку один холст всегда «под другим», имеет смысл сделать холст верхнего уровня дочерним элементом нижнего уровня. Это означало бы, что нижний уровень должен быть какой-то настраиваемой 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

Это какой бы метод вы мне ни хотели. Он должен выполнить действие, когда пользователь коснется представления. Если определено, что действие касания пользователя не было тем, что искал View, а затем возвращает false, чтобы переместить сенсор даже в родительский вид. У вас также нет * have *, чтобы вернуть true. Вы можете выполнить действие, если пользователь коснется представления независимо от него, а затем вернет false, чтобы поддерживать связь даже при движении. – DeeV

Смежные вопросы