Как сделать Zoom на весь контент в RecyclerView?

Мне нужно увеличить / уменьшить масштаб всего содержимого в RecyclerView. На самом деле мне нужно изменить размер всех дочерних представлений по ширине и текст внутри каждого элемента.

public class ViewHolder { Button btn; ... } 

Когда пользователь делает увеличение, текст кнопки должен уменьшаться до 8 8sp и исчезать, если пользователь продолжит увеличивать масштаб.

Итак, теперь у меня есть дилемма: что мне нужно делать? Измените размеры элементов в адаптере или измените их размер в LayoutManager и обновите весь адаптер.

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


Для состояния 21/11/2016 я не могу найти решение для этого случая.
Поэтому я решил написать свой собственный взгляд и провести переоценку видимых просмотров при каждом изменении масштабного коэффициента масштабирования.

Какой адаптер вы используете?

Я пробовал горизонтальный LinearLayoutManager и изменял размеры элементов внутри адаптера:

  @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { ... final ViewGroup.LayoutParams layoutParams = viewHolder.rootView.getLayoutParams(); layoutParams.width = getItemWidth(position); //width calculation using current zoom level layoutParams.height = mItemLayoutHeight; viewHolder.rootView.setLayoutParams(layoutParams); ... 

И setZoom (..) метод действия / фрагмента выглядит так:

  public void setZoom(float newValue) { int dScroll = (int) ((ADAPTER_ZOOM - newValue) * getResources().getDisplayMetrics().widthPixels/2f); //assume you Recycler view uses whole display ADAPTER_ZOOM = newValue; resetBoundaries(); // epgAdapter.notifyDataSetChanged(); // epgRecyclerView.scrollBy(dScroll, 0); } 

Но с моей собственной работой LayoutManager плохо, кажется, есть список оптимизаций внутри LinearLayoutManager

Пользователь этот код. Он отлично работает для масштабирования всего содержимого recyclerview.

 import android.content.Context; import android.graphics.Canvas; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.ScaleGestureDetector; /** @author yogesh * */ public class PinchRecyclerView extends RecyclerView { private static final int INVALID_POINTER_ID = -1; private int mActivePointerId = INVALID_POINTER_ID; private ScaleGestureDetector mScaleDetector; private float mScaleFactor = 1.f; private float maxWidth = 0.0f; private float maxHeight = 0.0f; private float mLastTouchX; private float mLastTouchY; private float mPosX; private float mPosY; private float width; private float height; public PinchRecyclerView(Context context) { super(context); if (!isInEditMode()) mScaleDetector = new ScaleGestureDetector(getContext(), new ScaleListener()); } public PinchRecyclerView(Context context, AttributeSet attrs) { super(context, attrs); if (!isInEditMode()) mScaleDetector = new ScaleGestureDetector(getContext(), new ScaleListener()); } public PinchRecyclerView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); if (!isInEditMode()) mScaleDetector = new ScaleGestureDetector(getContext(), new ScaleListener()); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { width = MeasureSpec.getSize(widthMeasureSpec); height = MeasureSpec.getSize(heightMeasureSpec); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { try { return super.onInterceptTouchEvent(ev); } catch (IllegalArgumentException ex) { ex.printStackTrace(); } return false; } @Override public boolean onTouchEvent(@NonNull MotionEvent ev) { super.onTouchEvent(ev); final int action = ev.getAction(); mScaleDetector.onTouchEvent(ev); switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: { final float x = ev.getX(); final float y = ev.getY(); mLastTouchX = x; mLastTouchY = y; mActivePointerId = ev.getPointerId(0); break; } case MotionEvent.ACTION_MOVE: { /* this line is replaced because here came below isssue java.lang.IllegalArgumentException: pointerIndex out of range ref http://stackoverflow.com/questions/6919292/pointerindex-out-of-range-android-multitouch */ //final int pointerIndex = ev.findPointerIndex(mActivePointerId); final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; final float x = ev.getX(pointerIndex); final float y = ev.getY(pointerIndex); final float dx = x - mLastTouchX; final float dy = y - mLastTouchY; mPosX += dx; mPosY += dy; if (mPosX > 0.0f) mPosX = 0.0f; else if (mPosX < maxWidth) mPosX = maxWidth; if (mPosY > 0.0f) mPosY = 0.0f; else if (mPosY < maxHeight) mPosY = maxHeight; mLastTouchX = x; mLastTouchY = y; invalidate(); break; } case MotionEvent.ACTION_UP: { mActivePointerId = INVALID_POINTER_ID; break; } case MotionEvent.ACTION_CANCEL: { mActivePointerId = INVALID_POINTER_ID; break; } case MotionEvent.ACTION_POINTER_UP: { final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; final int pointerId = ev.getPointerId(pointerIndex); if (pointerId == mActivePointerId) { final int newPointerIndex = pointerIndex == 0 ? 1 : 0; mLastTouchX = ev.getX(newPointerIndex); mLastTouchY = ev.getY(newPointerIndex); mActivePointerId = ev.getPointerId(newPointerIndex); } break; } } return true; } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.save(Canvas.MATRIX_SAVE_FLAG); canvas.translate(mPosX, mPosY); canvas.scale(mScaleFactor, mScaleFactor); canvas.restore(); } @Override protected void dispatchDraw(@NonNull Canvas canvas) { canvas.save(Canvas.MATRIX_SAVE_FLAG); if (mScaleFactor == 1.0f) { mPosX = 0.0f; mPosY = 0.0f; } canvas.translate(mPosX, mPosY); canvas.scale(mScaleFactor, mScaleFactor); super.dispatchDraw(canvas); canvas.restore(); invalidate(); } private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { @Override public boolean onScale(ScaleGestureDetector detector) { mScaleFactor *= detector.getScaleFactor(); mScaleFactor = Math.max(1.0f, Math.min(mScaleFactor, 3.0f)); maxWidth = width - (width * mScaleFactor); maxHeight = height - (height * mScaleFactor); invalidate(); return true; } } } 

Код, взятый из этого ответа StackOverflow: столбец просмотра ресайклеров Android no. На увеличенном зуме

Intereting Posts
Зависимости -> Не удалось создать плагин типа «AppPlugin» Приостановите музыкальный проигрыватель по телефону и снова возобновите его после телефонного звонка в Android Установка ширины TextView в java Android – нарисуйте видео YouTube на SurfaceTexture MAILTO Ссылка по электронной почте, чтобы начать новое письмо Как использовать форму, которая может быть скреплена вместе с изображением? Вызов кода Java из c ++ в приложении для Android Как заставить Volley NetworkImageView работать в автономном режиме Автозаполнение не отображается в Android Studio с двумя экранами Конфликт сообщений об ошибках Android: указанный ребенок уже имеет родителя. Вы должны сначала вызвать removeView () родителя ребенка Сообщение для facebook wall from android fb sdk всегда ошибка Приложения Android OpenGL перестают работать после загрузки в эмулятор Создание приложения, которое открывает расширение пользовательского файла Платит ли AdMob за импорт или только за клики? Qt5 QGeoPositionInfoSource :: createDefaultSource () падает на Android 5.0