2016-02-10 4 views
1

У меня есть RecyclerView с изображениями. Он основан на this solution. Изображения ленивы загружаются в поле зрения с помощью Glide. Мне нужно добавить увеличение центрального изображения (например, на this example). Как мне это сделать?Zoom центральное изображение ресайклера

+0

попробуйте это http://www.plattysoft.com/2015/06/16/snapping-items-on-a- horizontal-list/ –

ответ

17

Самый прямой способ повлиять на то, что вы хотите, - это расширение LinearLayoutManager. Как вы, несомненно, обнаружили, что правильная привязка к событиям прокрутки - это боль:

Итак, давайте продлим менеджер. Мы создадим несколько параметров, которые вы можете открыть.

public class ZoomCenterCardLayoutManager extends LinearLayoutManager { 
    // Shrink the cards around the center up to 50% 
    private final float mShrinkAmount = 0.5f; 
    // The cards will be at 50% when they are 75% of the way between the 
    // center and the edge. 
    private final float mShrinkDistance = 0.75f; 

Заполните ваши конструктор, а затем переопределить scrollHorizontallyBy:

@Override 
    public int scrollHorizontallyBy(int dx, 
     RecyclerView.Recycler recycler, RecyclerView.State state) { 

вызова версию родителя и сохранить пройденное расстояние. Мы должны вернуть это в конце метода:

 int scrolled = super.scrollHorizontallyBy(dx, recycler, state); 

Мы собираемся создать простую линейную интерполяцию. Это выглядит достаточно хорошо.

 float midpoint = getWidth()/2.f; 
     float d0 = 0.f; 
     float d1 = mShrinkDistance * midpoint; 
     float s0 = 1.f; 
     float s1 = 1.f - mShrinkAmount; 

Прокрутите все активные дочерние элементы управления, запустите интерполяцию и установите масштаб ребенка.

 for (int i = 0; i < getChildCount(); i++) { 
     View child = getChildAt(i); 
     float childMidpoint = 
      (getDecoratedRight(child) + getDecoratedLeft(child))/2.f; 
     float d = Math.min(d1, Math.abs(midpoint - childMidpoint)); 
     float scale = s0 + (s1 - s0) * (d - d0)/(d1 - d0); 
     child.setScaleX(scale); 
     child.setScaleY(scale); 
     } 

     return scrolled; 
    } 

Это почти все, что вам нужно. Один последний шаг, чтобы убедиться, что эта корректировка вызывается после инициализации - в противном случае изменение масштаба не вступит в силу до первого элемента управления перемещается:

@Override 
    public void onLayoutChildren(Recycler recycler, State state) { 
    super.onLayoutChildren(recycler, state); 
    scrollVerticallyBy(0, recycler, state); 
    } 

} 

И это все, что есть в ней. Супер отзывчивый, и вы можете отказаться от этого нового менеджера компоновки в любом горизонтальном ресайклере.

+0

Благодарим за разъяснения. Здесь найдено еще одно решение: http://stackoverflow.com/a/30041459/5571200 –

+0

Я сделал это, но это не дает мне желаемого результата https://gist.github.com/beersheba/cdb69cf600d2d1b9f3c5 'float scale = interp (Math.abs (myMidpoint - recyclerMidpoint));' А что такое 'interp' здесь? –

+0

'interp' представляет интерполяционную функцию, которая принимает число и возвращает некоторый масштаб, который будет идти от 0.0f до 1.0f (и, возможно, больше). То, что вы проходите, - это расстояние, которое, скорее всего, будет в 10 или 100 лет. Не то, что вы хотите. Я отредактирую ответ, чтобы дать вам примерную функцию интерполяции, которую вы можете использовать. –

-2

проверка сайт разработчика Android для увеличения эффект http://developer.android.com/training/animation/zoom.html. весь код есть, но очень длинный. Чтобы увеличить изображение по клику, вы можете использовать другое мероприятие с маленьким размером и передать изображение этой деятельности. это даст эффект щелчка контакта whatsapp.