ฉันจะเปลี่ยนตำแหน่งการดูผ่านโค้ดได้อย่างไร เช่นเดียวกับการเปลี่ยนตำแหน่ง X, Y เป็นไปได้ไหม?
ฉันจะเปลี่ยนตำแหน่งการดูผ่านโค้ดได้อย่างไร เช่นเดียวกับการเปลี่ยนตำแหน่ง X, Y เป็นไปได้ไหม?
คำตอบ:
สำหรับอะไรด้านล่างรังผึ้ง (API ระดับ 11) setLayoutParams(...)
คุณจะต้องใช้
หากคุณสามารถ จำกัด การสนับสนุนของคุณเพื่อรังผึ้งขึ้นคุณสามารถใช้setX(...)
, setY(...)
, setLeft(...)
, setTop(...)
ฯลฯ
ได้คุณสามารถกำหนดตำแหน่งการมองเห็นแบบไดนามิกใน Android ได้ ในทำนองเดียวกันคุณมีImageView
ในLinearLayout
ของ XML ของคุณ file.So คุณสามารถกำหนดตำแหน่งผ่านLayoutParams
.But ให้แน่ใจว่าจะใช้LayoutParams
ตามรูปแบบการดำเนินการใน XML ของคุณ file.There จะแตกต่างกันLayoutParams
ตามรูปแบบที่นำมา
นี่คือรหัสที่จะตั้ง:
LayoutParams layoutParams=new LayoutParams(int width, int height);
layoutParams.setMargins(int left, int top, int right, int bottom);
imageView.setLayoutParams(layoutParams);
ฉันหวังว่าจะเป็นประโยชน์กับคุณในการกำหนดตำแหน่ง
มีคำตอบที่ถูกต้องแตกต่างกันอยู่แล้ว แต่ดูเหมือนจะไม่มีคำตอบที่ถูกต้องว่าจะใช้วิธีใดในกรณีใดยกเว้นข้อ จำกัด ระดับ API ที่เกี่ยวข้อง:
หากคุณสามารถรอรอบเค้าโครงและกลุ่มมุมมองหลักสนับสนุนMarginLayoutParams
(หรือคลาสย่อย) ให้ตั้งค่าmarginLeft
/ marginTop
ตามนั้น
หากคุณต้องการเปลี่ยนตำแหน่งทันทีและอย่างต่อเนื่อง (เช่นสำหรับจุดยึด 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 บางครั้งไม่อนุญาตให้ใช้ตัวเลข
setX()
และsetY()
ทำงานนอกระบบเค้าโครงและค่าที่เกี่ยวข้องจะถือว่าเป็นค่าชดเชยเพิ่มเติมสำหรับค่าซ้าย / บน / ล่าง / ขวาที่กำหนดโดยระบบเค้าโครงโดยจะเปลี่ยนมุมมองตามนั้น ดูเหมือนว่าจะถูกเพิ่มสำหรับภาพเคลื่อนไหว (ซึ่งจำเป็นต้องมีเอฟเฟกต์ทันทีโดยไม่ต้องผ่านวงจรเลย์เอาต์)
marginLeft
สามารถตั้งค่าได้โดยใช้setLayoutParams
กับnew FrameLayout.LayoutParams(width, height)
ที่คุณตั้งค่าmarginLeft
มีไลบรารีชื่อNineOldAndroidsซึ่งช่วยให้คุณใช้ไลบรารีแอนิเมชั่น Honeycomb ได้จนถึงเวอร์ชันหนึ่ง
ซึ่งหมายความว่าคุณสามารถกำหนดด้านซ้าย, ขวา, การแปล X / Y ด้วยอินเทอร์เฟซที่แตกต่างกันเล็กน้อย
นี่คือวิธีการทำงาน:
ViewHelper.setTranslationX(view, 50f);
คุณเพียงแค่ใช้วิธีการแบบคงที่จากคลาส ViewHelper ส่งผ่านมุมมองและค่าที่คุณต้องการตั้งค่า
ฉันอยากจะแนะนำให้ใช้ setTranslationX
และ setTranslationY
. ฉันเพิ่งเริ่มต้นด้วยตัวเอง แต่สิ่งเหล่านี้ดูเหมือนจะเป็นวิธีที่ปลอดภัยที่สุดและเป็นที่ต้องการในการย้ายมุมมอง ฉันเดาว่ามันขึ้นอยู่กับสิ่งที่คุณกำลังพยายามทำอยู่ แต่มันก็ใช้ได้ดีสำหรับฉันสำหรับแอนิเมชั่น 2 มิติ
คุณสามารถลองใช้วิธีการต่อไปนี้หากคุณใช้ HoneyComb Sdk (API ระดับ 11)
view.setX(float x);
พารามิเตอร์ x คือตำแหน่งภาพ x ของมุมมองนี้
view.setY(float y);
พารามิเตอร์ y คือตำแหน่งภาพ y ของมุมมองนี้
ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ :)
กำหนดตำแหน่งทางซ้ายของมุมมองนี้โดยสัมพันธ์กับระดับบนสุด:
view.setLeft(int leftPosition);
กำหนดตำแหน่งที่ถูกต้องของมุมมองนี้โดยสัมพันธ์กับระดับบนสุด:
view.setRight(int rightPosition);
กำหนดตำแหน่งบนสุดของมุมมองนี้โดยสัมพันธ์กับระดับบนสุด:
view.setTop(int topPosition);
กำหนดตำแหน่งด้านล่างของมุมมองนี้โดยสัมพันธ์กับระดับบนสุด:
view.setBottom(int bottomPositon);
วิธีการข้างต้นใช้เพื่อกำหนดตำแหน่งมุมมองที่เกี่ยวข้องกับระดับบนสุด
ใช้ LayoutParams หากคุณใช้ LinearLayout คุณต้องนำเข้า android.widget.LinearLayout.LayoutParams มิฉะนั้นจะนำเข้า 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) ได้ แต่จะไม่กำหนดตำแหน่งของส่วนประกอบมันจะกำหนดเฉพาะตำแหน่งของเส้นขอบด้านซ้ายของส่วนประกอบส่วนที่เหลือจะยังคงอยู่ในตำแหน่งเดิม .
ใช้RelativeLayout
วางมุมมองของคุณรับRelativeLayout.LayoutParams
วัตถุจากมุมมองของคุณและกำหนดระยะขอบตามที่คุณต้องการ จากนั้นเรียกrequestLayout()
ดูมุมมองของคุณ นี่เป็นวิธีเดียวที่ฉันรู้
ฉันพบว่า @Stefan Haustein ใกล้เคียงกับประสบการณ์ของฉันมาก แต่ไม่แน่ใจ 100% คำแนะนำของฉันคือ:
setLeft()
/ setRight()
/ setBottom()
/ ใช้setTop()
ไม่ได้ในบางครั้งsetX()
/setY()
แทน (คุณอาจต้องการค้นหาเพิ่มเติมในความแตกต่างsetLeft()
และsetX()
)สิ่งหนึ่งที่ควรคำนึงถึงในการวางตำแหน่งก็คือแต่ละมุมมองมีดัชนีที่สัมพันธ์กับมุมมองระดับบนสุด ดังนั้นหากคุณมีเค้าโครงเชิงเส้นที่มีมุมมองย่อยสามมุมมองย่อยแต่ละมุมมองจะมีดัชนี: 0, 1, 2 ในกรณีข้างต้น
สิ่งนี้ช่วยให้คุณสามารถเพิ่มมุมมองไปยังตำแหน่งสุดท้าย (หรือจุดสิ้นสุด) ในมุมมองระดับบนสุดโดยทำสิ่งนี้:
int childCount = parent.getChildCount();
parentView.addView(newView, childCount);
หรือคุณสามารถแทนที่มุมมองโดยใช้สิ่งต่อไปนี้:
int childIndex = parentView.indexOfChild(childView);
childView.setVisibility(View.GONE);
parentView.addView(newView, childIndex);
sets the top position of this view relative to its parent. This method is meant to be called by the layout system and should not generally be called otherwise, because the property may be changed at any time by the layout.
- นั่นอาจจะไม่ใช่ความคิดที่ดีนัก;)