2011-06-30 97 views

回答

93

對於Honeycomb(API Level 11)以下的任何內容,您必須使用setLayoutParams(...)

如果你可以限制你的支持蜂窩最多可以使用setX(...)setY(...)setLeft(...)setTop(...)

+29

http://developer.android.com/reference/android/view/View.html#setTop%28int%29:'設置此視圖的頂部位置相對於其父母。這種方法是由佈局系統調用,通常不應該被調用,否則,因爲該屬性可能隨時被佈局改變。「 - 所以也許這不是一個好主意;) – katzenhut

5

設置此視圖相對於其父的左側位置:

view.setLeft(int leftPosition); 

設置此視圖相對於其父的正確位置:

view.setRight(int rightPosition); 

設置此觀點相對的頂部位置到其父:

view.setTop(int topPosition); 

設置此視圖的底部位置相對於其父母nt:

view.setBottom(int bottomPositon); 

上述方法用於設置視圖與其父項相關的位置。

+0

對不起這些方法不可用。可以給我發送任何代碼嗎? – AB1209

+5

它是HoneyComb(11)+。 – Pijusn

+2

「這個方法意味着被佈局系統調用,通常不應該被另外調用,因爲這個屬性可能隨時被佈局改變。」 – GDanger

9

如果您使用的是HoneyComb Sdk(API Level 11),則可以嘗試使用以下方法。

​​

參數x是該視圖的視覺x位置。

view.setY(float y); 

參數y是該視圖的視覺y位置。

我希望這對你有幫助。 :)

+3

我正在2.2 Froyo上工作,這些方法不適用於它。 – AB1209

3

使用RelativeLayout,將您的視圖置於其中,從您的視圖中獲取RelativeLayout.LayoutParams對象,並根據需要設置邊距。然後在您的視圖上致電requestLayout()。這是我知道的唯一途徑。

36

是的,你可以在Android中動態設置視圖的位置。同樣,您的xml文件中有ImageView,LinearLayout。因此,您可以通過LayoutParams來設置其位置。但請務必根據xml文件中採用的佈局設置LayoutParams。根據所採用的佈局,有不同的LayoutParams

下面是設置代碼:

LayoutParams layoutParams=new LayoutParams(int width, int height); 
    layoutParams.setMargins(int left, int top, int right, int bottom); 
    imageView.setLayoutParams(layoutParams); 

我希望這將有助於您設置的位置。

+13

也注意到你必須導入android.widget.LinearLayout.LayoutParams;因爲默認值是來自setTop()的文檔的ViewGroup的LayoutParams –

12

我會建議使用setTranslationXsetTranslationY。我只是自己開始做這件事,但這些似乎是移動視圖的最安全和首選的方式。我想這很大程度上取決於你想要做什麼,但這對我來說適合2D動畫。

17

有一個名爲NineOldAndroids的庫,它允許您將Honeycomb動畫庫一直使用到版本1。

這意味着您可以使用略有不同的界面來定義左側,右側的translationX/Y。

這裏是它如何工作的:

ViewHelper.setTranslationX(view, 50f); 

你只需要使用從視圖助手類的靜態方法,通過圖以及曾經珍惜你要設置它。

3

使用LayoutParams。 如果你使用,你必須導入android.widget.LinearLayout.LayoutParams一個LinearLayout中,否則導入的LayoutParams的正確版本爲您所使用的佈局,否則會引起ClassCastException異常,則:

LayoutParams layoutParams=new LayoutParams(int width, int height); 
layoutParams.setMargins(int left, int top, int right, int bottom); 
imageView.setLayoutParams(layoutParams); 

注意:您也可以使用imageView.setLeft(int dim),但是這不會設置組件的位置,它只會設置組件的左邊框的位置,其餘的將保持在相同的位置。

+0

所以我們該如何移動在不影響原始視圖的情況下查看具體位置? – james

+0

我不確定我是否理解你的問題,因爲如果你想移動視圖,你會改變它,因爲你正在移動它。無論如何,如果你想獨立於另一個視圖移動一個視圖,你可能需要一個FrameLayout視圖來展現你的主佈局,然後在其內部,你可以放置你的獨立視圖(顯然,如果你希望它在你的主視圖下移動,必須在您的主要之前放置FrameLayout) –

2

對於所有的API級別的支持,你可以使用it這樣的:

ViewPropertyAnimator.animate(view).translationYBy(-yourY).translationXBy(-yourX).setDuration(0); 
+1

爲什麼downvote? – Orr

+0

因爲他想改變位置和以上的解決方案是更好的,不需要動畫 – FireZenk

+0

此外,翻譯可能會導致視圖(部分)離開屏幕 – mewa

12

有不同的有效答案了,但沒有一個似乎正確的建議方法(縣)在這種情況下使用的,除爲相應的API級別限制:

  • 如果您可以等待一個佈局週期和父視圖組支持MarginLayoutParams(或子類),設置marginLeft/marginTop艾科rdingly。

  • 如果您需要立即持續更改位置(例如對於PopupMenu錨點),請使用相同的座標另外調用layout(l, t, r, b)。這將搶佔佈局系統將在稍後確認的內容。

  • 對於直接(臨時)更改(例如動畫),請改爲使用setX()/setY()。如果父級大小不依賴於WRAP_CHILDREN,那麼專門使用setX()/setY()可能會很好。

  • 決不使用setLeft()/setRight()/setBottom()/setTop(),見下文。

背景: 的mLeft/mTop/mBottom/mRight字段獲得從對應的LayoutParams在佈局填充()。 Android視圖佈局系統隱式地和異步地調用佈局。因此,設置MarginLayoutParams似乎是永久設置該位置的最安全和最乾淨的方式。然而,在一些情況下,異步佈局滯後可能是個問題,例如,當使用視圖渲染遊標時,它應該被重新定位並同時用作PopupMenu錨點。在這種情況下,撥打layout()對我來說工作得很好。

setLeft()setTop()的問題是:

  • 稱他們單獨是不夠的 - 你還需要調用setRight()setBottom()避免拉伸或收縮的觀點。

  • 這些方法的實現看起來比較複雜(=做一些工作,以解決造成他們每個人的看法大小的變化)

  • 他們似乎會導致輸入字段奇怪的問題:EditText soft numeric keyboard sometimes does not allow digits

setX()setY()在佈局系統外部工作,相應的值被視爲佈局系統確定的左/上/下/右值的附加偏移,從而相應地移動視圖。它們似乎已添加爲動畫(即不需要通過佈局循環即可立即生效)。

+0

你好Stefan。您能否提供一些書籍或文章,以瞭解Android佈局系統的工作原理。我明白,onMeasure()onDraw()調用layout()的順序,但想知道更多細節。在此先感謝 –

+0

不幸的是我不能 - 最好的和最權威的參考似乎是實際的Android源代碼O :) –

相關問題