Apakah mungkin untuk merotasi drawable dalam deskripsi xml?

102

Saya membuat aplikasi, dengan sumber daya yang dapat digunakan kembali (karena tombol selalu sama, tetapi dicerminkan atau diputar). Saya ingin menggunakan sumber daya yang sama jadi saya tidak perlu menambahkan 3 sumber daya lagi yang persis seperti aslinya tetapi dirotasi. Tetapi saya juga tidak ingin mencampurkan kode dengan hal-hal yang dapat dideklarasikan dalam XML atau membuat transformasi dengan matriks yang akan memakan waktu pemrosesan.

Saya memiliki tombol dua status yang dideklarasikan dalam 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>

dan saya ingin menggunakan kembali drawable karena akan sama tetapi diputar 90º dan 45º dan saya tetapkan ke tombol sebagai drawable.

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

Saya tahu bahwa saya dapat memutarnya dengan a RotateDrawableatau dengan a Matrixtetapi seperti yang sudah saya jelaskan, saya tidak suka pendekatan itu.

Apakah mungkin untuk mencapai itu secara langsung di XML atau menurut Anda apa yang akan menjadi cara terbaik untuk melakukannya? Taruh semua sumber daya kecuali dirotasi, putar dalam kode?

--- EDIT --- Jawaban @dmaxi berfungsi dengan baik, ini adalah cara menggabungkannya dengan daftar item :)

<?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>
Goofyahead
sumber
4
Tidak perlu meminta maaf bahasa Inggris Anda baik-baik saja. Dan selamat datang di SO!
PeeHaa
lihat masalah yang sama di utas ini stackoverflow.com/questions/14727426/… saran apa pun akan bagus!
sukarno
Drawable berbasis vektor sangat menyederhanakan masalah (jawaban di bawah).
samis

Jawaban:

136

Saya bisa memutar dalam 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>

Itu fromDegreespenting.

Pada dasarnya ini adalah animasi putar yang didefinisikan dalam XML. Dengan fromDegreesAnda menentukan status rotasi awal. Ini toDegreesadalah status pemutaran terakhir drawable dalam urutan animasi, tetapi bisa berupa apa saja jika Anda tidak ingin menggunakan animasi.

Saya tidak berpikir itu mengalokasikan sumber daya untuk animasi karena tidak harus dimuat sebagai animasi. Sebagai drawable, ia dirender sebagai keadaan awalnya dan harus diletakkan di drawablefolder sumber daya. Untuk menggunakannya sebagai animasi, Anda harus meletakkannya di animfolder resource dan dapat memulai animasi seperti ini (hanya contoh):

Animation rotation = AnimationUtils.loadAnimation(this, R.anim.rotation);
rotation.setRepeatCount(Animation.INFINITE);
myView.startAnimation(rotation);
dmaxi
sumber
1
Terima kasih, itu sempurna! saya menggabungkannya dengan item dan apa yang saya butuhkan, saya ingin memposting kode, saya tidak tahu apakah lebih baik mengedit jawaban atau pertanyaan saya ... Dan untuk mencerminkan gambar apakah saya harus bermain dengan pivot x & y?
Goofyahead
Baiklah, saya senang bisa membantu, edit jawabannya jika Anda mau. pivotX dan pivotY mendefinisikan titik tengah rotasi. Untuk pencerminan saya tidak tahu karena XML ini hanya dapat menentukan rotasi 2D.
dmaxi
1
@dmaxi Ini memutar drawable melalui animasi rotasi bukan? Bukankah itu agak tidak efisien?
starkej2
Saya membuat ini tetapi dari 0 hingga 360 derajat karena saya ingin rotasi penuh, masalahnya ada di layar kecil itu berputar berubah bentuk, ada petunjuk?
firetrap
1
Ada bug di Android M yang memengaruhi drawable putar yang tepat ini, bug itu hilang sepenuhnya, jadi jika Anda memilih solusi ini, maka bug itu akan rusak di M.
Diperbaiki
34

Saya bisa memutar panah kiri ke kanan dalam XML sebagai:

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

Gambar terlampir untuk referensi.

masukkan deskripsi gambar di sini

amko0l
sumber
saya melakukan ini tetapi saya tidak dapat mengatur latar belakang ke tata letak ada ide?
Mateen Chaudhry
18

Jika drawable berbasis vektor digunakan, terkait dengan ImageView , gaya, dan daftar status warna, tombol Anda dapat difaktor ulang sebagai berikut:

Catatan: Vector drawable secara signifikan lebih kecil daripada gambar, jadi definisi ekstra eksplisit tidak menimbulkan banyak overhead, dan membuat kode yang jelas dan eksplisit (meskipun saya telah membaca bahwa memodifikasi tangan aset vektor harus dihindari, saya lebih suka berurusan dengan overhead memperbarui beberapa file daripada memiliki transformasi pada satu):

Catatan: Android Studio adalah sumber yang bagus untuk aset vektor.

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 diubah)

<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>
Sam adalah
sumber
3
Jawaban yang bagus untuk rotationGroupatributnya, ini memutar vektor dengan sangat baik
blueware
0

Jika Anda ingin rotationberlaku untuk masa xmlberkas add kemudian sederhana android:rotation="180"diImageView

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_dropdown"
    android:rotation="180"/>
Dinesh
sumber