Xml açıklamasında bir çekmeceyi döndürmek mümkün mü?


102

Yeniden kullanılabilen kaynaklarla bir uygulama oluşturuyorum (çünkü düğmeler her zaman aynıdır, ancak yansıtılmış veya döndürülmüş). Aynı kaynağı kullanmak istiyorum, bu nedenle tam olarak orijinaline benzeyen ancak döndürülmüş 3 kaynak daha eklemem gerekmiyor. Ancak, kodu XML'de bildirilebilecek şeylerle karıştırmak veya işlem süresine mal olacak bir matrisle dönüşümler yapmak istemiyorum.

XML'de beyan edilmiş iki durumlu bir düğme var.

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

ve ben çekilebilir olanı yeniden kullanmak istiyorum çünkü aynı olacak ama 90º ve 45º döndürülecek ve butona çekilebilir olarak atıyorum.

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

Bunu a RotateDrawableveya a ile döndürebileceğimi biliyorum Matrixama daha önce açıkladığım gibi bu yaklaşımı sevmiyorum.

Bunu doğrudan XML üzerinden başarmak mümkün mü veya sizce bunu yapmanın en iyi yolu nedir? Tüm kaynakları koyun ama döndürün, kodda döndürmek mi?

--- DÜZENLE --- @ dmaxi'nin cevabı harika çalışıyor, bu onu bir öğe listesiyle nasıl birleştireceğiniz :)

<?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
Özür dilemene gerek yok, ingilizcen gayet iyi. Ve SO'ya hoş geldiniz!
PeeHaa

Stackoverflow.com/questions/14727426/… bu iş parçacığında aynı soruna bakın, herhangi bir öneri harika olurdu!
sukarno

Vektör tabanlı çekmeceler, konuları büyük ölçüde basitleştirir (aşağıdaki yanıt).
samis

Yanıtlar:


136

Ben olabilir döndürmek 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>

Bu fromDegreesönemlidir.

Temel olarak bu, XML'de tanımlanan bir döndürme animasyonudur. İle fromDegreesilk döndürülmüş durumu tanımlayın. toDegreesAnimasyon dizisindeki çekilebilir son döndürülmüş halidir ama animasyonu kullanmak istemiyorsanız herhangi bir şey olabilir.

Animasyon olarak yüklenmesi gerekmediğinden animasyon için kaynak ayırdığını sanmıyorum. Bir çekilebilir olarak, başlangıç ​​durumu olarak işlenir ve drawablekaynak klasörüne yerleştirilmelidir. Bunu bir animasyon olarak kullanmak için animkaynak klasörüne koymalısınız ve animasyonu şu şekilde başlatabilirsiniz (sadece bir örnek):

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

1
Teşekkürler bu mükemmel! bunu öğeyle ve tam olarak ihtiyacım olan şeyle birleştirdim, kodu göndermek istiyorum, cevabınızı veya sorumu düzenlemenin daha iyi olup olmadığını bilmiyorum ... Ve görüntüyü yansıtmak için pivot ile oynamak zorunda mıyım x & y?
Goofyahead

Yardımcı olabileceğim için mutluyum, isterseniz cevabı düzenleyin. pivotX ve pivotY, dönüşün merkez noktasını tanımlar. Aynalama için fikrim yok çünkü bu XML yalnızca 2B dönüşü tanımlayabilir.
dmaxi

1
@dmaxi Bu, çekilebilirliği bir döndürme animasyonuyla döndürmek değil mi? Bu biraz verimsiz olmaz mıydı?
starkej2

Bunu yaptım ama 0'dan 360 dereceye kadar tam bir dönüş istediğim için sorun küçük ekranlarda deforme olmuş dönüyor, herhangi bir ipucu var mı?
firetrap

1
Android M'de bu tam döndürme çekmecesini etkileyen bir hata vardı, tamamen kayboluyor, bu nedenle bu çözümü seçerseniz, M'de kırılacak. N. için düzeltildi.
androidguy

35

XML'de sol oku sağa şu şekilde döndürebilirim:

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

Referans için ekli resim.

görüntü açıklamasını buraya girin


Bunu yapıyorum ama arka planı herhangi bir fikre göre ayarlayamıyorum?
Mateen Chaudhry

18

Bir ImageView , stil ve renk durumu listesiyle birlikte vektör tabanlı çekilebilir öğeler kullanılırsa, düğmeniz aşağıdaki gibi yeniden düzenlenebilir:

Not: Vektör çekilebilir öğeleri resimlerden önemli ölçüde daha küçüktür, bu nedenle ekstra, açık tanımlar çok fazla ek yüke neden olmaz ve açık, açık kod sağlar (vektör varlıklarını değiştirmekten kaçınılması gerektiğini okudum, ancak bununla ilgilenmeyi tercih ederim birkaç dosyayı güncellemenin, bir dosyada dönüşümlere sahip olmanın ek yükü):

Not: Android Studio, vektör varlıkları için harika bir kaynaktır.

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>

Ayrıntılar_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 değiştirildi)

<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Öznitelik için güzel cevap , vektörü çok iyi
döndürüyor

0

İsterseniz rotationde çekilebilirdir xmldosya daha sonra basit bir eklenti android:rotation="180"içindeImageView

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_dropdown"
    android:rotation="180"/>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.