2014-12-13 2 views
2

У меня есть RelativeLayout, в котором есть ScrollView и EditText, и если пользователь переключает фокус на EditText, я хочу, чтобы ScrollView скрывался, пока они не закончили. Эта часть была простой, но мне также хотелось бы, чтобы RelativeLayout постепенно сокращалась/расширялась, чтобы обеспечить хороший переход, а не щелчок по открытию/закрытию.Сложность анимирования RelativeLayout для изменения размера при изменении его содержимого

Вот код, который скрывает Scrollview когда получает EditText фокус:

частный класс myCostBoxFocusListener реализует View.OnFocusChangeListener {

public void onFocusChange(View v, boolean hasFocus) { 

     ScrollView sView = (ScrollView) ((RelativeLayout)v.getParent().getParent()).getChildAt(1); 
     //A bit hacky, I know, but it works. 

     if (hasFocus) { 
      sView.setVisibility(View.GONE); 
     } 
     else if(!hasFocus) { 
      sView.setVisibility(View.VISIBLE); 
     } 
    } 
} 

и это прекрасно работает. Тем не менее, код, который я нарисовал, чтобы попытаться оживить открытие/закрытие, не работает. В настоящее время они заставляют элементы ScrollView затухать в течение 2 секунд, а RelativeLayout по-прежнему мгновенно открывает/закрывает.

LayoutTransition transition = new LayoutTransition(); 
ObjectAnimator a1 = ObjectAnimator.ofFloat(null, View.SCALE_Y, 0, 1); 
AnimatorSet animator = new AnimatorSet(); 
animator.setStartDelay(0); 
animator.play(a1); 
transition.setAnimator(LayoutTransition.CHANGE_APPEARING, animator); 
transition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, animator); 
transition.setDuration(2000); 
RelativeLayout rView = (RelativeLayout) dialogNew.findViewById(R.id.ocrmain_group_select_parent); 
rView.setLayoutTransition(transition); 

Я попытался с помощью LayoutTransition_APPEARING/Исчезающие вместо CHANGE_, но это не живой, что я хочу. Мне явно не хватает концепции здесь, и я бы очень признателен за некоторые указания относительно того, как я концептуализую это неправильно.

ответ

3

Вы пробовали встроенный layout change animation?

android:animateLayoutChanges="true", добавленный к вашему относительному расположению, должен делать то, что вы хотите.

EDIT: Чтобы изменить продолжительность анимации по умолчанию, вы можете сделать что-то вроде следующего.

public class MainActivity extends Activity { 

    private ScrollView scrollView; 

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

     RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.relative_layout); 
     LayoutTransition t = relativeLayout.getLayoutTransition(); 
     t.setDuration(2000); 
     relativeLayout.setLayoutTransition(t); 

     scrollView = (ScrollView) findViewById(R.id.scroll_view); 

     EditText editText = (EditText) findViewById(R.id.edit_text); 
     editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
      @Override 
      public void onFocusChange(View v, boolean hasFocus) { 
       if (hasFocus) { 
        scrollView.setVisibility(View.GONE); 
       } 
       else { 
        scrollView.setVisibility(View.VISIBLE); 
       } 
      } 
     }); 
    } 
} 

test.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:id="@+id/relative_layout" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:animateLayoutChanges="true" 
       android:padding="5dp" > 

    <LinearLayout android:id="@+id/linear_layout" 
        android:orientation="horizontal" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:focusable="true" android:focusableInTouchMode="true" 
        android:layout_alignParentTop="true" > 

     <EditText android:id="@+id/edit_text" 
        android:gravity="end" 
        android:layout_width="0dp" 
        android:layout_height="wrap_content" 
        android:layout_weight="3" 
        android:selectAllOnFocus="true" 
        android:imeOptions="actionDone" 
        android:inputType="numberDecimal" /> 

     <EditText android:id="@+id/edit_text2" 
        android:gravity="end" 
        android:layout_width="0dp" 
        android:layout_height="wrap_content" 
        android:layout_weight="3" 
        android:selectAllOnFocus="true" 
        android:imeOptions="actionDone" 
        android:inputType="numberDecimal" /> 

    </LinearLayout> 

    <ScrollView android:id="@+id/scroll_view" 
       android:paddingTop="20dp" 
       android:gravity="end" 
       android:layout_width="fill_parent" 
       android:layout_height="180dp" 
       android:layout_below="@id/linear_layout" > 

     <TableLayout android:id="@+id/table_layout" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" > 

      <TextView android:layout_height="30dp" android:layout_width="match_parent" android:text="TTTT"/> 

      <TextView android:layout_height="30dp" android:layout_width="match_parent" android:text="TTTT"/> 

      <TextView android:layout_height="30dp" android:layout_width="match_parent" android:text="TTTT"/> 

      <TextView android:layout_height="30dp" android:layout_width="match_parent" android:text="TTTT"/> 

      <TextView android:layout_height="30dp" android:layout_width="match_parent" android:text="TTTT"/> 

      <TextView android:layout_height="30dp" android:layout_width="match_parent" android:text="TTTT"/> 

      <TextView android:layout_height="30dp" android:layout_width="match_parent" android:text="TTTT"/> 


     </TableLayout> 

    </ScrollView> 

    <Button android:id="@+id/button_cancel" 
      android:layout_width="150dp" 
      android:layout_height="wrap_content" 
      android:text="Cancel" 
      android:layout_below="@id/scroll_view" 
      android:layout_alignParentLeft="true" /> 

    <Button android:id="@+id/button_ok" 
      android:layout_width="150dp" 
      android:layout_height="wrap_content" 
      android:text="Ok" 
      android:layout_below="@id/scroll_view" 
      android:layout_alignParentRight="true" /> 

</RelativeLayout> 
+0

Это имеет несколько более хороший эффект, но размер окна до сих пор меняется почти мгновенно. Как установить длительность для ее расширения/сокращения? – mikeappell

+0

Взгляните на http://developer.android.com/reference/android/view/ViewGroup.html#setLayoutTransition(android.animation.LayoutTransition). Чтобы изменить этот переход по умолчанию, вы можете выполнить 't = getLayoutTransition()', затем 't.setDuration (CHANGE_DISAPPEARING, duration)', затем 'setLayoutTransition (t)'? – mpkuth

+0

Хорошо, вот в чем проблема: анимированные кнопки - это кнопки, которые исчезают/появляются снова. Окно, содержащее их, по-прежнему меняет размер почти мгновенно. Я каким-то образом применяю переход к неправильному объекту? – mikeappell

Смежные вопросы