2013-11-08 5 views
5

Я пытаюсь редактировать these source, чтобы создать простую функцию, которая будет работать на всех моих представлениях.Android views expand animation

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

RelativeLayout mLayout1 = (RelativeLayout) findViewById(R.id.layout1); 
RelativeLayout mLayoutToBeExpanded1 = (RelativeLayout) findViewById(R.id.layout_exp_1); 
addAction(mLayout, mLayoutToBeExpanded); 

RelativeLayout mLayout2 = (RelativeLayout) findViewById(R.id.layout2); 
RelativeLayout mLayoutToBeExpanded2 = (RelativeLayout) findViewById(R.id.layout_exp_2); 
addAction(mLayout2, mLayoutToBeExpanded2); 

RelativeLayout mLayout3 = (RelativeLayout) findViewById(R.id.layout3); 
RelativeLayout mLayoutToBeExpanded3 = (RelativeLayout) findViewById(R.id.layout_exp_3); 
addAction(mLayout3, mLayoutToBeExpanded3); 

} 

    public void addAction(final View layout, final View summary) { 

    summary.getViewTreeObserver().addOnPreDrawListener(
      new ViewTreeObserver.OnPreDrawListener() { 

       @Override 
       public boolean onPreDraw() { 
        summary.getViewTreeObserver().removeOnPreDrawListener(this); 
        summary.setVisibility(View.GONE); 

        final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); 
        final int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); 
        summary.measure(widthSpec, heightSpec); 

        mAnimator = slideAnimator(0, summary.getMeasuredHeight(), summary); 
        return true; 
       } 
      }); 

    layout.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if (summary.getVisibility() == View.GONE) { 
       expand(summary); 
      } else { 
       collapse(summary); 
      } 
     } 
    }); 
} 

private void expand(View summary) { 
    //set Visible 
    summary.setVisibility(View.VISIBLE); 

      /* Remove and used in preDrawListener 
      final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); 
      final int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); 
      mLinearLayout.measure(widthSpec, heightSpec); 

      mAnimator = slideAnimator(0, mLinearLayout.getMeasuredHeight()); 
      */ 

    mAnimator.start(); 
} 

private void collapse(final View summary) { 
    int finalHeight = summary.getHeight(); 

    ValueAnimator mAnimator = slideAnimator(finalHeight, 0, summary); 

    mAnimator.addListener(new Animator.AnimatorListener() { 
     @Override 
     public void onAnimationEnd(Animator animator) { 
      //Height=0, but it set visibility to GONE 
      summary.setVisibility(View.GONE); 
     } 

     @Override 
     public void onAnimationStart(Animator animator) { 
     } 

     @Override 
     public void onAnimationCancel(Animator animator) { 
     } 

     @Override 
     public void onAnimationRepeat(Animator animator) { 
     } 
    }); 
    mAnimator.start(); 
} 


private ValueAnimator slideAnimator(int start, int end, final View summary) { 

    ValueAnimator animator = ValueAnimator.ofInt(start, end); 


    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(ValueAnimator valueAnimator) { 
      //Update Height 
      int value = (Integer) valueAnimator.getAnimatedValue(); 

      ViewGroup.LayoutParams layoutParams = summary.getLayoutParams(); 
      layoutParams.height = value; 
      summary.setLayoutParams(layoutParams); 
     } 
    }); 
    return animator; 
} 

Проблема: первые 2 макета работают только один раз. После первого расширения -> сбой, onClickFunction не работает. 3-й макет работает отлично, я могу развернуть/свернуть его несколько раз. Любое решение?

+0

Приятно видеть, что проблема решена. Если я смогу дать какой-то совет, выньте свое решение * из вопроса и ответьте правильно. Затем он может быть отмечен как принятый, и может даже быть выделен отдельно, заработав репутацию. – Geobits

+0

Done !! Благодаря!! – iGio90

ответ

17

Я решил сам, поэтому, это рабочее решение для расширяемой компоновки.

Использование:

addAction(YourLayout, LayoutToBeExpanded) 

Функция:

public void addAction(final View layout, final View summary) { 



    layout.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if (summary.getVisibility() == View.GONE) { 
       expand(summary); 
      } else { 
       collapse(summary); 
      } 
     } 
    }); 
} 

private void expand(View summary) { 
    //set Visible 
    summary.setVisibility(View.VISIBLE); 

      final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); 
      summary.measure(widthSpec, 300); 

      mAnimator = slideAnimator(0, 300, summary); 

    mAnimator.start(); 
} 

private void collapse(final View summary) { 
    int finalHeight = summary.getHeight(); 

    ValueAnimator mAnimator = slideAnimator(finalHeight, 0, summary); 

    mAnimator.addListener(new Animator.AnimatorListener() { 
     @Override 
     public void onAnimationEnd(Animator animator) { 
      //Height=0, but it set visibility to GONE 
      summary.setVisibility(View.GONE); 
     } 

     @Override 
     public void onAnimationStart(Animator animator) { 
     } 

     @Override 
     public void onAnimationCancel(Animator animator) { 
     } 

     @Override 
     public void onAnimationRepeat(Animator animator) { 
     } 
    }); 
    mAnimator.start(); 
} 


private ValueAnimator slideAnimator(int start, int end, final View summary) { 

    ValueAnimator animator = ValueAnimator.ofInt(start, end); 


    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(ValueAnimator valueAnimator) { 
      //Update Height 
      int value = (Integer) valueAnimator.getAnimatedValue(); 

      ViewGroup.LayoutParams layoutParams = summary.getLayoutParams(); 
      layoutParams.height = value; 
      summary.setLayoutParams(layoutParams); 
     } 
    }); 
    return animator; 
} 

Если вы хотели бы также свернуть "mLayoutToBeExpanded" на использовании собственной мыши этот:

public void addAction(final View layout, final View summary) { 
    layout.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (summary.getVisibility() == View.GONE) { 
       expand(summary); 
      } else { 
       collapse(summary); 
      } 
     } 
    }); 

    summary.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      if (summary.getVisibility() == View.VISIBLE) { 
       collapse(summary); 
      } else { 
       //nothing 
      } 
     } 
    }); 
} 
2

Используйте этот метод а также развернуть анимацию:

 public void expandOrCollapse(final View v,String exp_or_colpse) { 
    TranslateAnimation anim = null; 
    if(exp_or_colpse.equals("expand")) 
    { 
     anim = new TranslateAnimation(0.0f, 0.0f, -v.getHeight(), 0.0f); 
     v.setVisibility(View.VISIBLE); 
    } 
    else{ 
     anim = new TranslateAnimation(0.0f, 0.0f, 0.0f, -v.getHeight()); 
     AnimationListener collapselistener= new AnimationListener() { 
      @Override 
      public void onAnimationStart(Animation animation) { 
      } 

      @Override 
      public void onAnimationRepeat(Animation animation) { 
      } 

      @Override 
      public void onAnimationEnd(Animation animation) { 
      v.setVisibility(View.GONE); 
      } 
     }; 

     anim.setAnimationListener(collapselistener); 
    } 

    // To Collapse 
     // 

    anim.setDuration(300); 
    anim.setInterpolator(new AccelerateInterpolator(0.5f)); 
    v.startAnimation(anim); 
} 

И вызовите этот метод в вашем коде:

 //For Expand View 
     expandOrCollapse(YourView,"expand"); 

     //For Collapse View 
     expandOrCollapse(yourView,"collapse"); 
0
ValueAnimator expandAnimation = ValueAnimator.ofInt(mainView.getHeight(), 400); 
    expandAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(final ValueAnimator animation) { 
      int height = (Integer) animation.getAnimatedValue(); 
      RelativeLayout.LayoutParams lp = (LayoutParams) mainView.getLayoutParams(); 
      lp.height = height; 
     } 
    }); 


    expandAnimation.setDuration(500); 
    expandAnimation.start(); 
0

просто альтернатива, простой в использовании. Чтобы расширить вид с помощью анимации:

view.setPivotY(0); 
ObjectAnimator.ofFloat(view, "scaleY", 0f, 1f).setDuration(300).start();