เป็นไปได้ไหมที่จะหมุน drawable ในคำอธิบาย xml


102

ฉันกำลังสร้างแอปโดยมีทรัพยากรที่สามารถใช้ซ้ำได้ (เนื่องจากปุ่มต่างๆมักจะเหมือนกัน แต่จะเป็นมิเรอร์หรือหมุน) ฉันต้องการใช้ทรัพยากรเดียวกันดังนั้นฉันจึงไม่ต้องเพิ่มทรัพยากรอีก 3 รายการที่เหมือนกับต้นฉบับทุกประการ แต่ถูกหมุนเวียน แต่ฉันก็ไม่ต้องการผสมโค้ดกับสิ่งที่สามารถประกาศใน XML หรือทำการแปลงด้วยเมทริกซ์ที่จะเสียเวลาในการประมวลผล

ฉันมีปุ่มสถานะสองปุ่มที่ประกาศใน XML

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
          android:drawable="@drawable/and_card_details_button_down_left_onclick" /> <!-- pressed -->
    <item android:drawable="@drawable/and_card_details_button_down_left" /> <!-- default -->
</selector>

และฉันต้องการใช้ที่ดึงได้ซ้ำเพราะมันจะเหมือนเดิม แต่หมุน90ºและ45ºและฉันกำหนดให้ปุ่มเป็นแบบดึงได้

<Button android:id="@+id/Details_Buttons_Top_Left_Button"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@drawable/details_menu_large_button" />

ฉันรู้ว่าฉันสามารถหมุนได้ด้วย a RotateDrawableหรือด้วยMatrixแต่อย่างที่ฉันอธิบายไปแล้วว่าฉันไม่ชอบวิธีนั้น

เป็นไปได้หรือไม่ที่จะบรรลุสิ่งนั้นโดยตรงบน XML หรือสิ่งใดที่คุณคิดว่าจะเป็นวิธีที่ดีที่สุด? ใส่ทรัพยากรทั้งหมด แต่หมุนแล้วหมุนในรหัส?

- แก้ไข - คำตอบของ @dmaxi ใช้งานได้ดีนี่คือวิธีรวมเข้ากับรายการสินค้า :)

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true">
        <rotate 
        android:fromDegrees="90"
        android:toDegrees="90"
        android:pivotX="50%"
        android:pivotY="50%"
        android:drawable="@drawable/and_card_details_button_up_onclick"/>
    </item>

    <item>
        <rotate
        android:fromDegrees="90"
        android:toDegrees="90"
        android:pivotX="50%"
        android:pivotY="50%"
        android:drawable="@drawable/and_card_details_button_up_onclick"/>
    </item>

</selector>

4
ไม่จำเป็นต้องขอโทษภาษาอังกฤษของคุณก็ใช้ได้ และยินดีต้อนรับสู่ SO!
PeeHaa

ดูปัญหาเดียวกันในเธรดนี้stackoverflow.com/questions/14727426/…ข้อเสนอแนะใด ๆ จะดีมาก!
sukarno

Drawables ตามเวกเตอร์ช่วยให้เรื่องง่ายขึ้นมาก (คำตอบด้านล่าง)
samis

คำตอบ:


136

ฉันสามารถหมุนใน XML:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android" 
        android:fromDegrees="90"
        android:toDegrees="90"
        android:pivotX="50%"
        android:pivotY="50%"
        android:drawable="@drawable/mainmenu_background">
</rotate>

ที่fromDegreesสำคัญคือ

โดยทั่วไปนี่คือภาพเคลื่อนไหวแบบหมุนที่กำหนดใน XML เมื่อfromDegreesคุณกำหนดสถานะการหมุนเริ่มต้น toDegreesเป็นรัฐสุดท้ายของการหมุน drawable ในลำดับภาพเคลื่อนไหว แต่สามารถเป็นอะไรก็ได้ถ้าคุณไม่ต้องการที่จะใช้ภาพเคลื่อนไหว

ฉันไม่คิดว่ามันจัดสรรทรัพยากรสำหรับแอนิเมชั่นเพราะไม่ต้องโหลดเป็นแอนิเมชั่น ในฐานะที่เป็น drawable จะแสดงผลตามสถานะเริ่มต้นและควรใส่ไว้ในdrawableโฟลเดอร์ทรัพยากร หากต้องการใช้เป็นภาพเคลื่อนไหวคุณควรวางไว้ในanimโฟลเดอร์ทรัพยากรและสามารถเริ่มภาพเคลื่อนไหวเช่นนี้ได้ (เป็นเพียงตัวอย่าง):

Animation rotation = AnimationUtils.loadAnimation(this, R.anim.rotation);
rotation.setRepeatCount(Animation.INFINITE);
myView.startAnimation(rotation);

1
ขอบคุณที่สมบูรณ์แบบ! ฉันรวมสิ่งนั้นกับรายการและสิ่งที่ฉันต้องการฉันต้องการโพสต์รหัสฉันไม่รู้ว่าจะแก้ไขคำตอบหรือคำถามของคุณได้ดีกว่ากันหรือไม่ ... และสำหรับการสะท้อนภาพฉันต้องเล่นกับ pivot x & y?
Goofyahead

ฉันดีใจที่สามารถช่วยแก้ไขคำตอบได้หากต้องการ pivotX และ pivotY กำหนดจุดศูนย์กลางของการหมุน สำหรับการทำมิเรอร์ฉันไม่มีความคิดเพราะ XML นี้สามารถกำหนดการหมุน 2 มิติเท่านั้น
dmaxi

1
@dmaxi นี่คือการหมุน drawable ผ่านภาพเคลื่อนไหวการหมุนไม่ใช่เหรอ? นั่นจะไม่มีประสิทธิภาพบ้างหรือ?
starkej2

ฉันทำสิ่งนี้ แต่จาก 0 ถึง 360 องศาเพราะฉันต้องการการหมุนเต็มรูปแบบปัญหาคือในหน้าจอเล็ก ๆ มันหมุนผิดรูปมีเงื่อนงำอะไรไหม
firetrap

1
มีข้อผิดพลาดใน Android M ที่ส่งผลต่อการหมุนที่แน่นอนนี้มันจะหายไปอย่างสมบูรณ์ดังนั้นหากคุณเลือกการละลายนี้มันจะเสียใน M. ได้รับการแก้ไขสำหรับ N
androidguy

35

ฉันสามารถหมุนลูกศรซ้ายไปทางขวาใน XML เป็น:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="180"
    android:toDegrees="0"
    android:drawable="@drawable/left">
</rotate>

ภาพที่แนบมาเพื่อการอ้างอิง

ใส่คำอธิบายภาพที่นี่


ฉันกำลังทำสิ่งนี้ แต่ฉันไม่สามารถตั้งค่าพื้นหลังเพื่อจัดวางแนวคิดใด ๆ ?
Mateen Chaudhry

18

หากใช้ drawables ที่ใช้เวกเตอร์ร่วมกับรายการImageViewสไตล์และสถานะสีปุ่มของคุณสามารถปรับโครงสร้างใหม่ได้ดังนี้:

หมายเหตุ: Vector drawables มีขนาดเล็กกว่ารูปภาพอย่างมากดังนั้นคำจำกัดความที่ชัดเจนและชัดเจนเป็นพิเศษจึงไม่ต้องเสียค่าใช้จ่ายมากนักและสร้างรหัสที่ชัดเจนและชัดเจน (แม้ว่าฉันจะอ่านว่าควรหลีกเลี่ยงการแก้ไขเนื้อหาเวกเตอร์ด้วยมือ แต่ฉันก็ควรจัดการด้วย ค่าใช้จ่ายในการอัปเดตสองไฟล์มากกว่าการแปลงไฟล์ในไฟล์เดียว):

หมายเหตุ: Android Studio เป็นแหล่งข้อมูลที่ดีเยี่ยมสำหรับเนื้อหาเวกเตอร์

res \ values ​​\ styles.xml

<!--ImageView-->
<style name="Details_Buttons_Top_Left_Button">
  <item name="android:layout_width">match_parent</item>
  <item name="android:layout_height">match_parent</item>    
  <item name="android:tint">@color/button_csl</item>    
</style>

res \ color \ button_csl.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">  
  <item android:state_enabled="false" android:color="@color/grey_disabled"/>
  <item android:state_pressed="true" android:color="@color/orange_hilite"/>
  <item android:color="@color/black"/>  
</selector>

details_menu_large_button.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_pressed="true"
        android:drawable="@drawable/and_card_details_button_down_left_onclick" /> <!-- pressed -->
  <item android:drawable="@drawable/and_card_details_button_down_left" /> <!-- default -->
</selector>

Details_Buttons_Top_Left_Button

<ImageView android:id="@+id/Details_Buttons_Top_Left_Button"
           style="@style/Details_Buttons_Top_Left_Button"
           android:src="@drawable/details_menu_large_button" />

and_card_details_button_down_left.xml (ic_play_arrow_black_24dp.xml)

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">  
  <path
        android:fillColor="#FF000000"
        android:pathData="M8,5v14l11,-7z"/>

</vector>

and_card_details_button_down_left_onclick.xml (แก้ไข ic_play_arrow_black_24dp.xml)

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0">
  <group android:name="rotationGroup"
         android:pivotX="12"
         android:pivotY="12"
         android:rotation="90" >
    <path
          android:fillColor="#FF000000"
          android:pathData="M8,5v14l11,-7z"/>
  </group>
</vector>

3
คำตอบที่ดีสำหรับrotationGroupแอตทริบิวต์มันหมุนเวกเตอร์ได้ดีมาก
blueware

0

หากคุณต้องการrotationdrawable ในxmlไฟล์แล้วง่ายเพิ่มandroid:rotation="180"ในImageView

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_dropdown"
    android:rotation="180"/>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.