2014-12-13 4 views
2

ScrollView와 EditText가있는 RelativeLayout이 있고 사용자가 EditText로 포커스를 이동하면 ScrollView가 끝날 때까지 자체를 숨기려고합니다. 그 부분은 쉬웠지만, RelativeLayout을 열고/닫을 필요없이 점진적으로 축소/확대하여 좋은 전환을 제공하고 싶습니다.RelativeLayout에 애니메이션을 적용하여 내용이 변경된 경우 크기를 변경하려고합니다.

개인 클래스 myCostBoxFocusListener가 {

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); 
     } 
    } 
} 

View.OnFocusChangeListener를 구현하고 이것이 잘 작동 : 여기

은 글고 향상에 포커스 때있는 ScrollView를 숨 깁니다 코드입니다. 그러나, 내가 열거 나 닫는 것을 움직이려고 노력하면서 함께 묶은 코드가 작동하지 않습니다. 현재 RelativeLayout이 여전히 열리거나 닫히는 동안 ScrollView 항목이 2 초 동안 페이드 인/아웃됩니다.

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); 

내가 대신 CHANGE_ 사라지는/LayoutTransition_APPEARING를 사용하여 시도했지만, 그게 내가 원하는 애니메이션을하지 않습니다. 나는 분명히 개념을 여기에서 놓치고 있고, 내가 이것을 틀리게 개념화하고있는 방법에 대한 약간의 포인터를 크게 고맙게 생각할 것이다.

답변

3

내장형 layout change animation을 사용해 보셨습니까?

android:animateLayoutChanges="true"을 상대 레이아웃에 추가하면 원하는대로 할 수 있습니다.

편집 : 기본 애니메이션의 재생 시간을 변경하려면 다음과 같이하십시오.

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

관련 문제