2

我在 UIImageView 中有一个 PNG,边缘有 alpha(比如说一个圆圈)。当我点击它时,如果我触摸不透明位,我希望它注册为圆圈的点击,但如果我触摸透明位,则点击后面的视图。

(顺便说一句:在另一个论坛上,有人说 PNG 会自动执行此操作,透明的 PNG 应该将点击传递到下面的视图,但我已经对其进行了测试,但它没有,至少在我的情况下不是。)

是否有一个我还没有翻转的标志,或者我是否需要创建某种公式:“如果点击 { 获取位置;计算距中心的距离;如果 < r { 触摸圆圈} 否则 { 传递它} }”?

-k。

4

2 回答 2

2

我不相信 PNG 会自动执行此操作,但找不到任何明确说明一种或另一种方式的参考资料。

您的半径计算可能更简单,但您也可以手动检查图像中触摸像素的 alpha 值,以确定是否将其计为命中。此代码针对 OS X 10.5+,但经过一些小的修改,它应该可以在 iPhone 上运行:Getting the pixel data from a CGImage object。以下是关于从 UIImage 检索数据的一些相关讨论:从 UIImage获取数据

于 2009-05-18T16:23:17.407 回答
-1

我想通了...... PNG,边界框透明度问题,并且能够点击到后面的另一个图像:

var hitTestPoint1:Boolean = false; var myHitTest1:Boolean = false; 变量对象:数组;

clip.addEventListener(MouseEvent.MOUSE_DOWN, doHitTest); clip.addEventListener(MouseEvent.MOUSE_UP, stopDragging); 剪辑.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;

剪辑.旋转 = 60;

函数 doHitTest(event:MouseEvent):void { objects = stage.getObjectsUnderPoint(new Point(event.stageX, event.stageY)); trace("哪一个:" + event.target.name); trace("重点是什么:" + objects); for(var i:int=0; 我

函数 stopDragging(event:MouseEvent):void { event.target.stopDrag(); }

function realHitTest(object:DisplayObject, point:Point):Boolean { /* 如果我们已经在处理 BitmapData 对象,那么我们只需使用该 BitmapData 的 hitTest * 方法。*/ if(object is BitmapData) { return (object as BitmapData).hitTest(new Point(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;
    }
}

}

于 2011-04-11T16:40:50.847 回答