SORU
9 ŞUBAT 2011, ÇARŞAMBA


Android:/daralt animasyon Genişletin

Hadi dikey bir linearLayout ki :

[v1]
[v2]

Varsayılan v1 sahiptir visibily = GİTTİ. Bir animasyon genişletmek ve aynı anda itin v2 ile v1 göstermek istiyorum.

Böyle bir şey denedim:

Animation a = new Animation()
{
    int initialHeight;

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        final int newHeight = (int)(initialHeight * interpolatedTime);
        v.getLayoutParams().height = newHeight;
        v.requestLayout();
    }

    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
        initialHeight = height;
    }

    @Override
    public boolean willChangeBounds() {
        return true;
    }
};

Ama bu çözüm, animasyon başladığında bir göz kırpma var. V1 animasyon uygulanmadan önce tam boy göstererek neden olduğunu düşünüyorum.

Javascript ile jQuery bir çizgi vardır! Android ile bunu yapmak için herhangi bir basit bir yolu?

CEVAP
14 Kasım 2012, ÇARŞAMBA


Bu soru benim gerçek çözüm sonrası çok popüler oldu görüyorum. Ana avantajı animasyon uygulamak için genişletilmiş yüksekliği bilmek zorunda değilsin ve görünümü genişletilmiş sonra, içerik değişirse yükseklik uyarlar. Benim için harika çalışıyor.

public static void expand(final View v) {
    v.measure(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
    final int targetHeight = v.getMeasuredHeight();

    // Older versions of android (pre API 21) cancel animations for views with a height of 0.
    v.getLayoutParams().height = 1;
    v.setVisibility(View.VISIBLE);
    Animation a = new Animation()
    {
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            v.getLayoutParams().height = interpolatedTime == 1
                    ? LayoutParams.WRAP_CONTENT
                    : (int)(targetHeight * interpolatedTime);
            v.requestLayout();
        }

        @Override
        public boolean willChangeBounds() {
            return true;
        }
    };

    // 1dp/ms
    a.setDuration((int)(targetHeight / v.getContext().getResources().getDisplayMetrics().density));
    v.startAnimation(a);
}

public static void collapse(final View v) {
    final int initialHeight = v.getMeasuredHeight();

    Animation a = new Animation()
    {
        @Override
        protected void applyTransformation(float interpolatedTime, Transformation t) {
            if(interpolatedTime == 1){
                v.setVisibility(View.GONE);
            }else{
                v.getLayoutParams().height = initialHeight - (int)(initialHeight * interpolatedTime);
                v.requestLayout();
            }
        }

        @Override
        public boolean willChangeBounds() {
            return true;
        }
    };

    // 1dp/ms
    a.setDuration((int)(initialHeight / v.getContext().getResources().getDisplayMetrics().density));
    v.startAnimation(a);
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • thenewboston

    thenewboston

    4 ŞUBAT 2008
  • TouchePro

    TouchePro

    27 EYLÜL 2007
  • Willie D.

    Willie D.

    16 Aralık 2006