Прикосновения к прозрачным PNG - PullRequest
2 голосов
/ 18 мая 2009

У меня есть PNG в UIImageView с альфа по краям (скажем, круг). Когда я нажимаю на него, я хочу, чтобы он регистрировался как касание для круга, если я касаюсь непрозрачного бита, но касание для вида сзади, если я касаюсь прозрачного бита.

(Кстати: на другом форуме кто-то сказал, что PNG автоматически делают это, и прозрачный PNG должен передать щелчок мышью представлению ниже, но я проверил это, и это не так, по крайней мере, в моем случае. )

Есть ли флаг, который я только что не перевернул, или мне нужно создать какую-то формулу: "если коснулся {получить местоположение; вычислить расстояние от центра; если

-k.

Ответы [ 2 ]

2 голосов
/ 18 мая 2009

Я не верю, что PNG автоматически делают это, но не могу найти никаких ссылок, которые однозначно говорят так или иначе.

Ваш расчет радиуса, возможно, проще, но вы также можете вручную проверить альфа-значение пикселя, которого вы коснулись, на своем изображении, чтобы определить, следует ли считать его попаданием. Этот код предназначен для OS X 10.5+, но с некоторыми незначительными изменениями он должен работать на iPhone: Получение данных пикселей из объекта CGImage . Вот некоторые связанные обсуждения по извлечению данных из UIImage: Получение данных из UIImage .

0 голосов
/ 11 апреля 2011

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

var hitTestPoint1: Boolean = false; var myHitTest1: Boolean = false; объекты var: Array;

clip.addEventListener (MouseEvent.MOUSE_DOWN, doHitTest); clip.addEventListener (MouseEvent.MOUSE_UP, stopDragging); clip.buttonMode = true; clip.mouseEnabled = true; clip.mouseChildren = true;

clip2.addEventListener (MouseEvent.MOUSE_DOWN, doHitTest); clip2.addEventListener (MouseEvent.MOUSE_UP, stopDragging); clip2.buttonMode = true; clip2.mouseEnabled = true; clip2.mouseChildren = true;

clip.rotation = 60;

функция doHitTest (событие: MouseEvent): пустота { objects = stage.getObjectsUnderPoint (новая точка (event.stageX, event.stageY)); trace ("Какой:" + event.target.name); трассировка («Что находится под точкой:» + объекты); для (var i: int = 0; i

функция stopDragging (событие: MouseEvent): пусто { event.target.stopDrag (); }

функция realHitTest (объект: DisplayObject, точка: точка): логическое значение { / * Если мы уже имеем дело с объектом BitmapData, тогда мы просто используем hitTest * метод этого BitmapData. * / if (объект - BitmapData) { return (объект как BitmapData) .hitTest (новая точка (0,0), 0, object.globalToLocal (point)); } еще {

    /* First we check if the hitTestPoint method returns false. If it does, that
     * means that we definitely do not have a hit, so we return false. But if this
     * returns true, we still don't know 100% that we have a hit because it might
     * be a transparent part of the image. 
     */
    if(!object.hitTestPoint(point.x, point.y, true)) 
    {
        return false;
    }
    else {
        /* So now we make a new BitmapData object and draw the pixels of our object
         * in there. Then we use the hitTest method of that BitmapData object to
         * really find out of we have a hit or not.
         */
        var bmapData:BitmapData = new BitmapData(object.width, object.height, true, 0x00000000);
        bmapData.draw(object, new Matrix());

        var returnVal:Boolean = bmapData.hitTest(new Point(0,0), 0, object.globalToLocal(point));

        bmapData.dispose();

        return returnVal;
    }
}

}

...