Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: RajaReddy PolamReddyОтветов: 2

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

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

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

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

androidandroid-layoutandroid-canvas

Ответы

Ответ 1 · рейтинг 3 · btalb

Из того, что я понимаю, вы говорите, что у вас есть треугольник, нарисованный внутри 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(), если порядок обработки ваших касаний становится проблемой.

Ответ 2 · рейтинг 1 · Dharmendra

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы