我來自ActionScript/Flash/AIR背景,我是Android View層次結構的新手。鑑於此,我發現ViewGroup和它的座標系統非常奇怪。Android:ViewGroup中的負座標和觸摸矩形
比方說,我們有主要活動視圖延伸RelativeView(或基本上是一些組佈局,使絕對座標和縮放)內的以下父/子關係:
circle1 = new ImageView(context);
circle1.setImageBitmap(...);
circle2 = new ImageView(context);
circle2.setImageBitmap(...);
cont = new RelativeView(context);
cont.addView(circle1);
cont.addView(circle2);
this.addView(cont);
的想法是創建一個容器它以主視圖爲中心並將容器中的兩個圓圈居中。這允許容器被動畫,將兩個圓圈分組。
cont.setX(getWidth()/2);
cont.setY(getHeight()/2);
circle1.setX(-circle1.getWidth()/2);
circle1.setY(-circle1.getHeight()/2);
circle2.setX(-circle2.getWidth()/2);
circle2.setY(-circle2.getHeight()/2);
做一個內部的ViewGroup負座標,我立即注意到,「續」剪輯他們在[0,0]的座標和cont.setClipChildren(假);必須被調用。我猜這是一個壞主意,因爲它看起來像對invalidate()區域的優化。禁用剪切後,結果呈現爲預期的,但有一個問題:
加入了觸摸事件監聽器CIRCLE2返回一個虛假的觸摸矩形(標示爲紫色),而不是預期的一個(標在青色)應該是盯着圈2的負[X,Y]偏移量。結果矩形從'cont'的[0,0]開始,在[cont2X + circle2W,circle2Y + circle2H]處結束,就好像它在'cont'的[0,0]處截斷一樣。
我知道您可以通過不使用負座標來解決問題,但如果您從ActionScript移植到負座標完美無缺(如在任何現實世界座標系中)並且觸摸矩形是在DisplayObjectContainer類中正確計算。
那麼還有什麼其他解決方案?
應該創建一個自定義的ViewGroup類,並且必須在那裏做什麼?
是否有一個神奇的設置,可以允許觸摸矩形的兒童視圖不被剪裁在父ViewGroup的[0,0]?
還有其他的東西嗎?
謝謝。
這是關於android:clipchildren默認是false的嗎? –
Derp,沒關係,設法掩蓋了部分問題 –
當我做一個:Rect out = new Rect(); circle2.getHitRect(下); 「out」包含circle2的hitRect的正確值。 (即「左」和「上」)的不利值。看起來好像父ViewGroup不允許觸及負偏移量。 – lobolmart