Có thể xoay một tệp có thể vẽ được trong mô tả xml không?


102

Tôi đang tạo một ứng dụng, với các tài nguyên có thể được sử dụng lại (vì các nút luôn giống nhau, nhưng được sao chép hoặc xoay). Tôi muốn sử dụng cùng một tài nguyên vì vậy tôi không phải thêm 3 tài nguyên khác giống hệt như ban đầu nhưng được xoay vòng. Nhưng tôi cũng không muốn trộn mã với những thứ có thể được khai báo trong XML hoặc thực hiện các phép biến đổi với ma trận sẽ tốn thời gian xử lý.

Tôi có một nút hai trạng thái được khai báo trong một 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>

và tôi muốn sử dụng lại cái có thể vẽ được vì nó sẽ giống nhau nhưng được xoay 90º và 45º và tôi gán cho nút là có thể vẽ được.

<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" />

Tôi biết rằng tôi có thể xoay nó bằng a RotateDrawablehoặc bằng a Matrixnhưng như tôi đã giải thích, tôi không thích cách tiếp cận đó.

Có thể đạt được điều đó trực tiếp trên XML không hay cách tốt nhất để làm điều đó là gì? Đặt tất cả các tài nguyên nhưng xoay vòng, xoay chúng trong mã?

--- EDIT --- Câu trả lời của @dmaxi hoạt động tuyệt vời, đây là cách kết hợp nó với một danh sách mục :)

<?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
Không cần phải xin lỗi tiếng anh của bạn là tốt. Và chào mừng đến với SO!
PeeHaa

xem xét vấn đề tương tự trên chuỗi này stackoverflow.com/questions/14727426/… bất kỳ đề xuất nào sẽ rất tuyệt!
sukarno

Các phép vẽ dựa trên vector đơn giản hóa vấn đề một cách đáng kể (câu trả lời bên dưới).
samis,

Câu trả lời:


136

Tôi có thể xoay vòng trong 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>

Điều fromDegreesquan trọng.

Về cơ bản đây là một hoạt ảnh xoay được định nghĩa trong XML. Với fromDegreesbạn xác định trạng thái xoay ban đầu. Đây toDegreeslà trạng thái được xoay cuối cùng của phần có thể vẽ trong chuỗi hoạt ảnh nhưng có thể là bất kỳ thứ gì nếu bạn không muốn sử dụng hoạt ảnh.

Tôi không nghĩ rằng nó phân bổ tài nguyên cho hoạt ảnh vì nó không phải được tải dưới dạng hoạt ảnh. Ở dạng có thể vẽ, nó được hiển thị như trạng thái ban đầu và nên được đặt trong drawablethư mục tài nguyên. Để sử dụng nó làm hoạt ảnh, bạn nên đặt nó vào animthư mục tài nguyên và có thể bắt đầu hoạt ảnh như thế này (chỉ là một ví dụ):

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

1
Cảm ơn, điều đó thật hoàn hảo! tôi đã kết hợp nó với mục và chính xác những gì tôi cần, tôi muốn đăng mã, tôi không biết liệu nó có tốt hơn để chỉnh sửa câu trả lời của bạn hay câu hỏi của tôi ... Và để phản chiếu hình ảnh, tôi phải chơi với pivot x & y?
Goofyahead

Chà, tôi rất vui vì tôi có thể trợ giúp, chỉnh sửa câu trả lời nếu bạn muốn. pivotX và pivotY xác định điểm trung tâm của vòng quay. Đối với phản chiếu, tôi không có ý kiến ​​vì XML này chỉ có thể xác định xoay 2D.
dmaxi

1
@dmaxi Đây là xoay có thể vẽ thông qua hoạt ảnh xoay phải không? Điều đó sẽ không phần nào kém hiệu quả?
starkej2

Tôi đã thực hiện điều này nhưng từ 0 đến 360 độ vì tôi muốn xoay toàn bộ, vấn đề là trong màn hình nhỏ nó xoay bị biến dạng, bất kỳ manh mối nào?
firetrap

1
Có một lỗi trong Android M ảnh hưởng drawable xoay chính xác này, nó biến mất hoàn toàn, vì vậy nếu bạn chọn sollution này sau đó nó sẽ bị phá vỡ trong M. Được cố định cho N.
androidguy

34

Tôi có thể xoay mũi tên trái sang phải trong XML như sau:

<?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>

Hình ảnh đính kèm để tham khảo.

nhập mô tả hình ảnh ở đây


tôi đang làm điều này nhưng tôi không thể thiết lập nền để bố trí bất kỳ ý tưởng nào?
Mateen Chaudhry

18

Nếu các đồ có thể kéo dựa trên vectơ được sử dụng, kết hợp với danh sách trạng thái màu, kiểu và màu của ImageView , nút của bạn có thể được cấu trúc lại như sau:

Ghi chú: Các tệp có thể kéo vectơ nhỏ hơn đáng kể so với hình ảnh, vì vậy các định nghĩa bổ sung, rõ ràng không phải chịu nhiều chi phí và tạo ra mã rõ ràng, rõ ràng (mặc dù tôi đã đọc rằng nên tránh sửa đổi thủ công nội dung vectơ, tôi muốn xử lý chi phí cập nhật một vài tệp hơn là phải chuyển đổi trên một tệp):

Ghi chú: Android Studio là một nguồn tuyệt vời cho nội dung vectơ.

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 đã được sửa đổi)

<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
Câu trả lời tuyệt vời cho rotationGroupthuộc tính, nó xoay vectơ rất tốt
blueware

0

Nếu bạn muốn rotationvẽ được trong xmltệp thì hãy thêm android:rotation="180"vào đơn giảnImageView

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_dropdown"
    android:rotation="180"/>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.