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

  • ETrade Supply

    ETrade Suppl

    23 Temmuz 2011
  • fufko

    fufko

    27 ŞUBAT 2006
  • TastyTuts | Creative video tutorials by Gareth David

    TastyTuts |

    6 Temmuz 2011