Проблема масштабирования ViewPager и ImageView
Я пытаюсь реализовать галерею изображений с помощью ViewPager. Кроме того, для реализации функции масштабирования в этом я использую TouchImageView из github. Я также попытался использовать ZoomableImageView.
но проблема в том , что если я увеличиваю изображение и прокручиваю изображение, то вместо изображения,ViewPager
прокручивается и следующий вид ViewPager
становится загружен.
Если я увеличиваю изображение, то если я прокручиваю это, то изображение должно двигаться вместо этого из ViewPager
следующий вид ViewPager должен загружаться только при достижении конца увеличенного изображения. Как это сделать?
Я не могу найти это.Если я касаюсь и перетаскиваю изображение по диагонали, только тогда изображение перемещается. или иначе перетаскивание ViewPager вызывается.
PS: это не дубликат. Масштабирование выполнено. Но проблема заключается в масштабировании изображения.
5 ответов
Да, у меня тоже была такая же проблема не с TouchImageView.
слишком решена проблема, что я сделал, отключил ViewPager, когда мой взгляд получает фокус.
public class EnableDisableViewPager extends ViewPager {
private boolean enabled = true;
public EnableDisableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
if(enabled)
return super.onInterceptTouchEvent(arg0);
return false;
}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
}
поэтому в TouchImageView реализуйте свой прослушиватель, чтобы вызвать событие, будь то масштабирование или перетаскивание.
установите прослушиватель для вашего объекта просмотра в вашей деятельности. Поэтому, когда эти события происходят, просто отключите пейджер просмотра.
Примечание: вам также понадобится мышь вверх событие для включения viewpager.
редактировать
это будет работать только для масштабирования, так что для ViewPager салфетки страниц вы должны увеличить обратно к оригиналу.
добавьте этот код в TouchImageView
public class TouchImageView extends ImageView {
...
private TouchEventListener touchEventListener;
private void sharedConstructing(Context context) {
...
setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
...
case MotionEvent.ACTION_UP:
...
if(touchEventListener != null)
{
if(saveScale == 1.0)
touchEventListener.onZoomToOriginal();
else
touchEventListener.onZoom();
}
break;
...
}
...
}
});
}
...
public TouchEventListener getTouchEventListener() {
return touchEventListener;
}
public void setTouchEventListener(TouchEventListener touchEventListener) {
this.touchEventListener = touchEventListener;
}
public interface TouchEventListener
{
void onZoom();
void onZoomToOriginal();
}
}
ЛУЧШЕЕ РЕШЕНИЕ
мы могли бы достичь этого, не расширяя ViewPager до нового класса, используя метод, приведенный ниже.
requestDisallowInterceptTouchEvent(true);
и с этим мы могли бы провести без масштабирования из исходное положение, как мы видим в галерее и многих других приложений.
public class TouchImageView extends ImageView {
...
private void stopInterceptEvent()
{
getParent().requestDisallowInterceptTouchEvent(true);
}
private void startInterceptEvent()
{
getParent().requestDisallowInterceptTouchEvent(false);
}
private void sharedConstructing(Context context) {
super.setClickable(true);
this.context = context;
mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
matrix.setTranslate(1f, 1f);
m = new float[9];
setImageMatrix(matrix);
setScaleType(ScaleType.MATRIX);
setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mScaleDetector.onTouchEvent(event);
matrix.getValues(m);
float x = m[Matrix.MTRANS_X];
float y = m[Matrix.MTRANS_Y];
PointF curr = new PointF(event.getX(), event.getY());
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
last.set(event.getX(), event.getY());
start.set(last);
mode = DRAG;
stopInterceptEvent();
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
float deltaX = curr.x - last.x;
float deltaY = curr.y - last.y;
float scaleWidth = Math.round(origWidth * saveScale);
float scaleHeight = Math.round(origHeight * saveScale);
if (scaleWidth < width) {
deltaX = 0;
if (y + deltaY > 0)
deltaY = -y;
else if (y + deltaY < -bottom)
deltaY = -(y + bottom);
} else if (scaleHeight < height) {
deltaY = 0;
if (x + deltaX > 0)
deltaX = -x;
else if (x + deltaX < -right)
deltaX = -(x + right);
} else {
if (x + deltaX > 0)
deltaX = -x;
else if (x + deltaX < -right)
deltaX = -(x + right);
if (y + deltaY > 0)
deltaY = -y;
else if (y + deltaY < -bottom)
deltaY = -(y + bottom);
}
if(deltaX == 0)
startInterceptEvent();
else
stopInterceptEvent();
matrix.postTranslate(deltaX, deltaY);
last.set(curr.x, curr.y);
}
break;
case MotionEvent.ACTION_UP:
mode = NONE;
int xDiff = (int) Math.abs(curr.x - start.x);
int yDiff = (int) Math.abs(curr.y - start.y);
if (xDiff < CLICK && yDiff < CLICK)
performClick();
startInterceptEvent();
break;
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
break;
}
setImageMatrix(matrix);
invalidate();
return true; // indicate event was handled
}
});
}
}
Я заставил его работать, добавив этот код:
if(deltaX == 0 && saveScale == 1.0 )
startInterceptEvent();
else
stopInterceptEvent();
Я наконец-то нашел Вид Изображения Масштаба Подвыборки библиотека, которая работает даже со стандартным ViewPager из пакета поддержки Android без каких-либо настроек.
Если у кого-то есть горизонтальный viewpager, важно изменить @ kirit-vaghela код:
if(deltaX == 0 || saveScale == 1.0 )
startInterceptEvent();
else
stopInterceptEvent();
до
if(saveScale == 1.0 )
startInterceptEvent();
else
stopInterceptEvent();
Так изменится адаптера изображение только при 1.0