Merkez noktasına göre Android görüntü ölçeği animasyonu


90

Bir ImageView'ım var ve ona basit ölçekli bir animasyon yapıyorum. Çok standart kod.

Scale_up.xml’im:

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale android:fromXScale="1"
           android:fromYScale="1"
           android:toXScale="1.2"
           android:toYScale="1.2"
           android:duration="175"/>
</set>

Animasyon kodum:

Animation a = AnimationUtils.loadAnimation(this, R.anim.scale_up);
((ImageView) findViewById(R.id.circle_image)).startAnimation(a);

Sorun:

Görüntü ölçeklendiğinde merkezden değil, sol üst köşeden ölçeklenir. Başka bir deyişle, görüntünün ölçeklendirilmiş versiyonu merkezle aynı noktaya sahip değildir, ancak aynı sol üst noktaya sahiptir. İşte ne demek istediğimi açıklayan bir bağlantı. İlk görüntü, animasyonun nasıl ölçeklendiğidir ve ikinci görüntü de benim nasıl ölçeklenmesini istediğimdir. Merkez noktayı aynı tutmalıdır. Görüntüye, konteynere, sola veya sağa hizalayarak yerçekimi kurmayı denedim, her zaman aynı ölçekleniyor. Ana ekran için RelativeLayout kullanıyorum ve ImageView başka bir RelativeLayout'ta bulunuyor, ancak diğer düzenleri denedim, değişiklik yok.

Yanıtlar:


77

Belirtilen ek çeviri, unutma android:pivotX, android:pivotYyarı genişlik ve yüksekliğe ve görüntünün merkezine ölçeklenir.


2
pivotXve pivotYyarısına viewportWidthve viewportHeighttam olarak ayarlanmalıdır .
toobsco42

163

50% animasyonlu görünümün merkezidir.

50%p ebeveynin merkezidir

<scale
    android:fromXScale="1.0"
    android:toXScale="1.2"
    android:fromYScale="1.0"
    android:toYScale="1.2"
    android:pivotX="50%"
    android:pivotY="50%"
    android:duration="175"/>

30
benim için% 50 işi yaptı (p olmadan)
agamov

5
animasyon uyguladığınız bileşen genişliğine veya yüksekliğine bağlıysa p içermemelidir. p, animasyonu uyguladığınız bileşenin ebeveynini ifade eder.
Alan Deep

50%pXML yerine Java dosyalarında nasıl kullanılır ?
Nikola K.

6
yeni ScaleAnimation (1.0f, 1.2f, 1.0f, 1.2f, Animation.RELATIVE_TO_PARENT, 0.5f, Animation.RELATIVE_TO_PARENT, 0.5f);
Jiang Qi

Ayrıca "a" - Animation.ABSOLUTE da vardır.
Zon

121

@Stevanveltema ve @JiangQi tarafından sağlanan cevap mükemmeldir, ancak kod kullanarak ölçeklendirmek istiyorsanız, cevabımı kullanabilirsiniz.

// first 0f, 1f mean scaling from X-axis to X-axis, meaning scaling from 0-100%
// first 0f, 1f mean scaling from Y-axis to Y-axis, meaning scaling from 0-100%
// The two 0.5f mean animation will start from 50% of X-axis & 50% of Y-axis, i.e. from center

ScaleAnimation fade_in =  new ScaleAnimation(0f, 1f, 0f, 1f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
fade_in.setDuration(1000);     // animation duration in milliseconds
fade_in.setFillAfter(true);    // If fillAfter is true, the transformation that this animation performed will persist when it is finished.
view.startAnimation(fade_in);

1
@ T.Todua Ne hataları? Lütfen yeni bir soru sorun ve bu yanıta geri bağlantı verin.
Rohan Kandwal

7

Bunu dengelemek için setinizdeki çeviri animasyonunu kullanabilirsiniz. Görüntüyü ortalamak için muhtemelen toXDelta ve toYDelta değerlerini ayarlamanız gerekecek.

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <scale android:fromXScale="1"
        android:fromYScale="1"
        android:toXScale="1.2"
        android:toYScale="1.2"
        android:duration="175"/>
    <translate
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="-20%"
        android:toYDelta="-20%"
        android:duration="175"/>
</set>
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.