2011-12-07 11 views
2

3つのRadioButtonを持つRadioGroupを含むAndroidビューがあります。 RadioButtonの1つが選択されると、ユーザはEditTextコントロールにテキストを入力する必要があります。他の2つのRadioButtonのいずれかが選択されている場合、この余分な情報は必要ありません。アニメーションでAndroidコントロールを非表示にすることはできますか?

私は現在、RadioGroupのOnCheckedChangedListenerを使用して、新しいRadioButtonがいつチェックされたかを判断し、ViewTGを可視性に設定してEditTextを隠しています。しかし、これは少し不快なものであり、私はトランジションをまったくアニメートできる方法があるかどうか疑問に思っています。これは可能ですか?もしそうなら、始めるための鍵は何ですか?

答えて

1

私は私が私の活動ではhttp://tech.chitgoks.com/2011/10/29/android-animation-to-expand-collapse-view-its-children/

で見つけたコードに基づいた以下の実行可能なソリューション、を作ってみた:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.edit_account); 
    companyGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() 
    { 
     @Override 
     public void onCheckedChanged(RadioGroup group, int checkedId) 
     { 
      if (checkedId == R.id.companyRadio) 
       EDNUtils.expandCollapse(companyNameText, true, 500); 
      else 
       EDNUtils.expandCollapse(companyNameText, false, 500); 
     } 
    }); 
} 

実装EDNUtilsから:

public static Animation expandCollapse(final View v, final boolean expand) 
{  
    return expandCollapse(v, expand, 1000); 
} 

public static Animation expandCollapse(final View v, final boolean expand, final int duration) 
{ 
    int currentHeight = v.getLayoutParams().height; 
    v.measure(MeasureSpec.makeMeasureSpec(((View)v.getParent()).getMeasuredWidth(), MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 
    final int initialHeight = v.getMeasuredHeight(); 

    if ((expand && currentHeight == initialHeight) || (!expand && currentHeight == 0)) 
     return null; 

    if (expand) 
     v.getLayoutParams().height = 0; 
    else 
     v.getLayoutParams().height = initialHeight; 
    v.setVisibility(View.VISIBLE); 

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

      if (interpolatedTime == 1 && !expand) 
       v.setVisibility(View.GONE); 
     } 

     @Override 
     public boolean willChangeBounds() 
     { 
      return true; 
     } 
    }; 
    a.setDuration(duration); 
    v.startAnimation(a); 
    return a; 
} 
関連する問題