2015-10-20 48 views
0

我來自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()區域的優化。禁用剪切後,結果呈現爲預期的,但有一個問題:

illustration

加入了觸摸事件監聽器CIRCLE2返回一個虛假的觸摸矩形(標示爲紫色),而不是預期的一個(標在青色)應該是盯着圈2的負[X,Y]偏移量。結果矩形從'cont'的[0,0]開始,在[cont2X + circle2W,circle2Y + circle2H]處結束,就好像它在'cont'的[0,0]處截斷一樣。

我知道您可以通過不使用負座標來解決問題,但如果您從ActionScript移植到負座標完美無缺(如在任何現實世界座標系中)並且觸摸矩形是在DisplayObjectContainer類中正確計算。

那麼還有什麼其他解決方案?

  • 應該創建一個自定義的ViewGroup類,並且必須在那裏做什麼?

  • 是否有一個神奇的設置,可以允許觸摸矩形的兒童視圖不被剪裁在父ViewGroup的[0,0]?

  • 還有其他的東西嗎?

謝謝。

+0

這是關於android:clipchildren默認是false的嗎? –

+0

Derp,沒關係,設法掩蓋了部分問題 –

+0

當我做一個:Rect out = new Rect(); circle2.getHitRect(下); 「out」包含circle2的hitRect的正確值。 (即「左」和「上」)的不利值。看起來好像父ViewGroup不允許觸及負偏移量。 – lobolmart

回答

0

您可以使用View#scrollTo來移動原點,以便您的內容完全顯示在視圖的邊界矩形內。

Android UI工具包中的許多事情都依賴於視圖的測量和佈局範圍的準確性。一般來說,你不想在這裏反對穀物。

+0

謝謝。你的解決方案是有效的 - 所以我把它標記爲這樣。一旦scrollTo()被應用,觸摸命中矩形確實起作用,但副作用當然是ViewGroup的全部內容被移動(滾動)。所以爲了補償'cont'的[X,Y]也必須被調整。這對於我已經知道並且已經在OP中提到的解決方案之一(基於其較大孩子的大小並且不使用負座標)來定位'cont'來說複雜性接近於複雜性(LOC明智)。不幸的是,這樣的設計模式使得它更多地涉及最終開發者。 – lobolmart