ImageView – увеличение на растяжку или вытягивание

Как достичь этой функции, PullToZoom только с ImageView (без ListView в образце)?

Аналогичный вопрос , но ответа нет 🙁

Как насчет использования Gesture Detector ? Вы можете найти и реализовать то, что (я думаю) вам нужно в следующем коде:

public class MainActivity extends AppCompatActivity { private static final String DEBUG_TAG = "Gestures"; private GestureDetectorCompat mDetector; private ImageView imageView; private MyGestureListener myGestureListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = (ImageView) findViewById(R.id.image); myGestureListener = new MyGestureListener(); mDetector = new GestureDetectorCompat(this, myGestureListener); imageView.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { int action = MotionEventCompat.getActionMasked(event); if (action == MotionEvent.ACTION_UP) { myGestureListener.upDetected(); } return mDetector.onTouchEvent(event); } }); imageView.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.test)); } class MyGestureListener extends GestureDetector.SimpleOnGestureListener { private static final float MAX_ZOOM = 0.5f; private static final float PCT = 300f; private float delta; private ValueAnimator valueAnimator; @Override public boolean onDown(MotionEvent event) { return true; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { if (valueAnimator != null) { valueAnimator.cancel(); } delta += distanceY; float pct = getPct(delta); imageView.setScaleX(1.0f + pct); imageView.setScaleY(1.0f + pct); return false; } void upDetected() { float pct = getPct(delta); valueAnimator = new ValueAnimator(); valueAnimator.setFloatValues(pct, 0.0f); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { imageView.setScaleX(1.0f + (float) animation.getAnimatedValue()); imageView.setScaleY(1.0f + (float) animation.getAnimatedValue()); } }); valueAnimator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { delta = 0f; imageView.setScaleX(1.0f); imageView.setScaleY(1.0f); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); valueAnimator.start(); } private float getPct(float delta) { float pct = delta / PCT; if (pct >= MAX_ZOOM) { pct = MAX_ZOOM; } else if (pct <= -MAX_ZOOM) { pct = -MAX_ZOOM; } return pct; } } } 

У MainActivity есть простой ImageView. Когда вы прокручиваете «внутри», этот жест обнаруживается, и изображение масштабируется (вверх или вниз). Когда вы удаляете палец с экрана, изображение масштабируется до первоначального размера с помощью простой анимации. Если вы хотите избежать уменьшения, вам просто нужно работать с методом getPct ().

РЕДАКТИРОВАТЬ

Например, getPtc может быть чем-то вроде этого (если вас интересует только увеличение)

 private float getPct(float delta) { float pct = -delta / PCT; if (pct >= MAX_ZOOM) { pct = MAX_ZOOM; } else if (pct <= 0) { pct = 0; } return pct; } 

EDIT # 2

Похоже, что самое первое событие прокрутки детектора жестов широко. Я добавил код, чтобы его игнорировать

  class MyGestureListener extends GestureDetector.SimpleOnGestureListener { private static final float MAX_ZOOM = 0.8f; private static final float PCT = 300f; private float delta; private ValueAnimator valueAnimator; private boolean mFirstEvent = true; @Override public boolean onDown(MotionEvent event) { return true; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { if (valueAnimator != null) { valueAnimator.cancel(); } if (mFirstEvent) { mFirstEvent = false; return false; } delta += distanceY; float pct = getPct(delta); imageView.setScaleX(1.0f + pct); imageView.setScaleY(1.0f + pct); textView.setScaleY(1.0f - pct); return false; } void upDetected() { mFirstEvent = true; float pct = getPct(delta); valueAnimator = new ValueAnimator(); valueAnimator.setFloatValues(pct, 0.0f); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { imageView.setScaleX(1.0f + (Float) animation.getAnimatedValue()); imageView.setScaleY(1.0f + (Float) animation.getAnimatedValue()); textView.setScaleY(1.0f - (Float) animation.getAnimatedValue()); } }); valueAnimator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { delta = 0f; imageView.setScaleX(1.0f); imageView.setScaleY(1.0f); textView.setScaleY(1.0f); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); valueAnimator.start(); } private float getPct(float delta) { float pct = -delta / PCT; if (pct >= MAX_ZOOM) { pct = MAX_ZOOM; } else if (pct <= 0) { pct = 0; } return pct; } /*private float getPct(float delta) { float pct = delta / PCT; if (pct >= MAX_ZOOM) { pct = MAX_ZOOM; } else if (pct <= -MAX_ZOOM) { pct = -MAX_ZOOM; } return pct; }*/ } 

Приложение Tinder для android выполняет аналогичную функцию, переопределяя метод onTouchEvent() . Проверьте этот пост, чтобы увидеть больше.