2011-05-08 20 views
9

gibi animasyon genişletmek Can Android Market animasyon Açıklama TextView animasyonunu genişletmek nasıl çözüme herkes noktası? 'More' etiketine tıkladıktan sonra genişleyen FrameLayout'a eklenen TextView var.TextView'un Android Market

cevap

12

Çözüm:

private static int measureViewHeight(View view2Expand, View view2Measure) { 
    try { 
     Method m = view2Measure.getClass().getDeclaredMethod("onMeasure", int.class, int.class); 
     m.setAccessible(true); 
     m.invoke(view2Measure, 
        MeasureSpec.makeMeasureSpec(view2Expand.getWidth(), MeasureSpec.AT_MOST), 
        MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 
    } catch (Exception e) { 
     return -1; 
    } 

    int measuredHeight = view2Measure.getMeasuredHeight(); 
    return measuredHeight; 
} 

static public void expandOrCollapse(View view2Expand, View view2Measure, 
     int collapsedHeight) { 
    if (view2Expand.getHeight() < collapsedHeight) 
     return; 

    int measuredHeight = measureViewHeight(view2Expand, view2Measure); 

    if (measuredHeight < collapsedHeight) 
     measuredHeight = collapsedHeight; 

    final int startHeight = view2Expand.getHeight(); 
    final int finishHeight = startHeight <= collapsedHeight ? 
      measuredHeight : collapsedHeight; 

    view2Expand.startAnimation(new ExpandAnimation(view2Expand, startHeight, finishHeight)); 
} 

class ExpandAnimation extends Animation { 
    private final View _view; 
    private final int _startHeight; 
    private final int _finishHeight; 

    public ExpandAnimation(View view, int startHeight, int finishHeight) { 
     _view = view; 
     _startHeight = startHeight; 
     _finishHeight = finishHeight; 
     setDuration(220); 
    } 

    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) { 
     final int newHeight = (int)((_finishHeight - _startHeight) * interpolatedTime + _startHeight); 
     _view.getLayoutParams().height = newHeight; 
     _view.requestLayout(); 
    } 

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

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

daha fazla ayrıntı verebilir, measureViewHeight() geri çağırma nasıl Görünüm view2Expand Görünüm view2Measure nedir? – pengwang

+2

Tabii ki. Benim durumumda, view2Measure - TextView. view2Expand - TextView içeren FrameLayout. Metin görünümünün tam yüksekliğini ölçüyoruz ve bunu FrameLayout'a uyguluyoruz. FrameLayout, metin daraltıldığında solma etkisi için sunulur (bkz. Http://stackoverflow.com/questions/5947758/force-fading-edge-drawing) – HighFlyer

+0

@HighFlyer Tüm bunları nasıl elde edeceğiniz hakkında daha fazla bilgi verebilir miyim? – ingsaurabh

İlgili konular