У меня есть RecyclerView с изображениями. Он основан на this solution. Изображения ленивы загружаются в поле зрения с помощью Glide. Мне нужно добавить увеличение центрального изображения (например, на this example). Как мне это сделать?Zoom центральное изображение ресайклера
ответ
Самый прямой способ повлиять на то, что вы хотите, - это расширение 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);
}
}
И это все, что есть в ней. Супер отзывчивый, и вы можете отказаться от этого нового менеджера компоновки в любом горизонтальном ресайклере.
Благодарим за разъяснения. Здесь найдено еще одно решение: http://stackoverflow.com/a/30041459/5571200 –
Я сделал это, но это не дает мне желаемого результата https://gist.github.com/beersheba/cdb69cf600d2d1b9f3c5 'float scale = interp (Math.abs (myMidpoint - recyclerMidpoint));' А что такое 'interp' здесь? –
'interp' представляет интерполяционную функцию, которая принимает число и возвращает некоторый масштаб, который будет идти от 0.0f до 1.0f (и, возможно, больше). То, что вы проходите, - это расстояние, которое, скорее всего, будет в 10 или 100 лет. Не то, что вы хотите. Я отредактирую ответ, чтобы дать вам примерную функцию интерполяции, которую вы можете использовать. –
проверка сайт разработчика Android для увеличения эффект http://developer.android.com/training/animation/zoom.html. весь код есть, но очень длинный. Чтобы увеличить изображение по клику, вы можете использовать другое мероприятие с маленьким размером и передать изображение этой деятельности. это даст эффект щелчка контакта whatsapp.
попробуйте это http://www.plattysoft.com/2015/06/16/snapping-items-on-a- horizontal-list/ –