Круг на холсте, занимающий все родительское пространство

Мое родительское представление — это RelativeLayout, я добавил к нему треугольник, расширяющий класс View. Я рисую треугольник, используя холст и краски. Проблема, с которой я столкнулся, заключается в том, что когда я касаюсь относительного макета, запускаются оба сенсорных слушателя, относительный макет и треугольник. Я просто хочу, чтобы треугольник занимал ровно столько места, сколько требуется. Как я могу ограничить свой пользовательский вид, треугольник в этом случае, чтобы он занимал место, а не занимал весь родительский макет.

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

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


person RajaReddy PolamReddy    schedule 16.07.2012    source источник
comment
Опубликуйте свой фрагмент кода. Невозможно дать ответы таким образом.   -  person Andro Selva    schedule 16.07.2012
comment
Давайте проверим этот пост --- -respect-the-l" title="просмотреть в Android на весь экран, как сказать холсту уважать l"> stackoverflow.com/questions/6686291/   -  person Kumar Shorav    schedule 16.07.2012
comment
Это также похоже на ваш запрос; надеюсь, что это будет полезно для вас --- stackoverflow.com/questions/10229121/   -  person Kumar Shorav    schedule 16.07.2012
comment
@AndroSelva обновил мой вопрос некоторым кодом...   -  person RajaReddy PolamReddy    schedule 16.07.2012


Ответы (2)


Из того, что я понимаю, вы говорите, что у вас есть треугольник, нарисованный внутри RelativeLayout в CustomView. Фактический размер View равен FILL_PARENT как по ширине, так и по высоте. Таким образом, квадрат, представляющий осязаемую область треугольника, совпадает с квадратом, представляющим осязаемую область родителя RelativeLayout.

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

Это не мешает вам манипулировать границами рисования и сенсорным фокусом, чтобы добиться того, что вы хотите.

Как это можно сделать

  1. Убедитесь, что ваш CustomView с треугольником всегда получает событие касания. Когда он получает событие касания, он выполняет базовые математические операции, чтобы выяснить, было ли касание в пределах области вашего треугольника (у вас должны быть границы треугольника, которые вы используете для рисования треугольника, сохраненные как глобальные переменные для CustomView).

  2. Затем простой условный оператор, чтобы определить, следует ли действовать и потреблять или передавать событие (вы вообще хотите, чтобы TouchEvent на вашем RelativeLayout что-то делало? Если нет, это делает это намного проще).

Пример скелета кода:

@Override
public boolean onTouchEvent(MotionEvent event) {
    boolean inTriangle = false;
    float x = event.getX();
    float y = event.getY();

    // This really depends on what behaviour you want, if a drag extends outside the
    // triangle bounds, do you want this to end the touch event? This code could be done
    // more efficiently depending on your choices / needs

    // Do maths to figure out if the point is actually inside the triangle. Once again,
    // many solutions and some much easier than others depending on type of triangle

    // This flow will only register events in the triangle, and do nothing when outside
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        if (inTriangle) {
            // Do whatever it is you want to do

            return true; // to say you consumed the event if necessary
        } else {
            return false; // parent RelativeLayout should now get touch event

    }
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
    if (inTriangle) {
        // Do whatever it is you want

        return true;
    } else {
        // Do nothing
        return true; // So is stil consumed
    }
}

return true;

}

Честно говоря, вопрос слишком открытый / неясный, чтобы дать что-то более конкретное. Но именно так вы бы выполнили то, о чем просили. Просто примените его к вашему конкретному сценарию.

Примечание. Я столкнулся с проблемами при передаче TouchEvent, поэтому, если вы действительно хотите передать их в определенные места, вам, возможно, придется исследовать игру с View.dispatchTouchEvent(), если порядок обработки ваших касаний становится проблемой.

person btalb    schedule 23.07.2012
comment
Спасибо за ответ. На самом деле мое требование: у меня есть один относительный макет в макете, я динамически добавляю некоторые пользовательские представления. у них есть сенсорные прослушиватели для перетаскивания точек в треугольнике, но они занимают полный экран моего родительского представления, из-за этого я не могу запускать сенсорные прослушиватели отдельно для родительского и дочернего представлений. Тем не менее, вы не ясно об этом, дайте мне знать . - person RajaReddy PolamReddy; 23.07.2012
comment
Такая информация действительно должна быть в вопросе ;) Подобные вещи действительно применимы, вам просто нужно очень контролировать порядок, в котором ваши TouchEvent отправляются в представления. Или даже используйте свой RelativeLayout в качестве управляющего представления и заставьте все остальные не принимать TouchEvents, а просто сохранять свои границы как читаемые переменные-члены. Затем просто выполните математику и соответствующие действия перетаскивания в контроллере onTouchEvent RelativeLayout. Гораздо проще и чище, особенно если у вас динамически много просмотров. - person btalb; 23.07.2012
comment
я обновил свой вопрос, из-за этой проблемы я не могу узнать, какой пользователь просмотра был выбран для изменения цвета фона или некоторых дополнительных функций. - person RajaReddy PolamReddy; 23.07.2012
comment
Я все еще не совсем понимаю точный вопрос. Пожалуйста, отправьте код или хороший четкий скриншот того, что вы хотите выполнить, и я буду более чем счастлив помочь. Основываясь на моем текущем понимании того, что вы хотите (что, как мне кажется, может быть неправильным), я бы поспорил, нужны ли вам даже пользовательские представления - person btalb; 25.07.2012
comment
он же Если вам просто нужен вид, в котором нарисован треугольник, и вы перетаскиваете углы, чтобы изменить размер треугольника, это можно сделать НАМНОГО проще. Я просто не уверен, что именно вы хотите еще. - person btalb; 25.07.2012
comment
посмотрите на это изображение dl.dropbox.com/u/38493970/Custom_view.png я создаю это пользовательское представление, используя этот код.pastebin.com/X3XyxevX. Мое требование: я хочу реализовать долгое нажатие на пользовательское представление для выбора этого представления. но когда я нажимаю на относительную компоновку, также запускаются прослушиватели касания пользовательского представления. если у меня есть больше настраиваемых представлений в относительном макете, я хочу выбрать конкретное представление, когда хочу его удалить. я думаю, это происходит из-за того, что эти пользовательские представления занимают всю ширину и полную высоту родительского представления. если он контролирует ширину и высоту обертывания содержимого, этот prb решит. - person RajaReddy PolamReddy; 25.07.2012

У вас есть проблема с обработкой сенсорных событий треугольника, потому что вы касаетесь как представления RalativeLayout, так и вашего пользовательского представления.

Чтобы решить эту проблему, вам нужно внести некоторые изменения в onTouchEvent пользовательского представления. Если вы касаетесь пользовательского представления и хотите обработать событие, то из onTouchEvent вам придется возвращать true вместо false, чтобы ваше родительское представление не получало события касания.

person Dharmendra    schedule 16.07.2012