2014-11-14 4 views
0

Я работаю над тем, чтобы анимация работала. Я перемещаю строку поиска с середины экрана в верхнюю часть экрана. Анимация работает нормально, но как только она движется, я не могу взаимодействовать ни с чем. Я обновил позицию, но не могу взаимодействовать с ней независимо. Вот что у меня до сих пор:Обновление позиции просмотра после анимации

private void moveSearchToTop() 
{ 
    FrameLayout root = (FrameLayout) findViewById(R.id.rootLayout); 
    DisplayMetrics dm = new DisplayMetrics(); 
    this.getWindowManager().getDefaultDisplay().getMetrics(dm); 
    statusBarOffset = dm.heightPixels - root.getMeasuredHeight(); 

    int originalPos[] = new int[2]; 
    mSearchBar.getLocationOnScreen(originalPos); 

    search_top = statusBarOffset - originalPos[1]; 
    TranslateAnimation anim = new TranslateAnimation(0, 0, 0, search_top); 
    anim.setDuration(500); 
    anim.setFillAfter(true); 
    anim.setAnimationListener(new Animation.AnimationListener() { 
     @Override 
     public void onAnimationStart(Animation animation) { 

     } 

     @Override 
     public void onAnimationEnd(Animation animation) { 
      mSearchBar.layout(0, search_top, 0, mSearchBar.getHeight() + search_top); 
     } 

     @Override 
     public void onAnimationRepeat(Animation animation) { 

     } 
    }); 

    mSearchBar.startAnimation(anim); 
} 

и вот что вид выглядит в XML:

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_vertical" 
    android:id="@+id/search_bar" 
    android:background="@android:drawable/dialog_holo_light_frame"> 
    <ImageView 
     android:id="@+id/search_icon" 
     android:layout_width="wrap_content" 
     android:onClick="onSearchClick" 
     android:layout_height="25dp" 
     android:layout_gravity="center_vertical" 
     android:src="@drawable/search"/> 
    <EditText 
     android:id="@+id/search_field" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical" 
     android:layout_weight="1" 
     android:singleLine="true" 
     android:hint="Search"/> 
    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="25dp" 
     android:layout_gravity="center_vertical" 
     android:src="@drawable/camera"/> 
    </LinearLayout> 

мне нужно обновить положение всех дочерних элементов тоже ли? Спасибо за толкание в правильном положении.

+2

Вы используете вид анимацию, который только собирается изменить, где нарисовано, а не фактическое положение. Я уверен, что есть способы обмануть его в перемещение фактической позиции, но я всегда считаю, что проще всего использовать объектный аниматор, поскольку он обновит фактическое положение без необходимости делать что-либо лишнее. – Whitney

ответ

0

Нет, вам не нужно будет изменять вид ребенка. Они отправятся туда, где идет панель поиска.

Мне кажется, что вы используете переменную search_top как в качестве дельта (для конструктора TranslateAnimation), так и в качестве позиции внутри своего родителя (в вызове макета). Это действительно дельта, поэтому вызов макета неверен.

Является ли родитель вашего поиска «корень» FrameLayout? Если это так, то вы просто хотите использовать 0 в качестве новой координаты y в вызове макета. Кроме того, вы используете 0 в качестве правой координаты, а это означает, что после анимации она не имеет ширины. Этот вызов будет позиционировать панель поиска в верхнем левом краю своего родителя, и сохранить свою текущую ширину и высоту:

mSearchBar.layout(0, 0, mSearchBar.getWidth(), mSearchBar.getHeight()); 

Я также рекомендовал бы вам не использовать положение экрана. Безопаснее просто установить положение просмотров в пределах родительских представлений. Например, если родитель панели поиска действительно является корнем, то вы могли бы получить дельту с:

search_top = - mSearchBar.getTop(); 
Смежные вопросы