Масштабирование и панорамирование ImageView с наложением (SimpleOnScaleGestureListener / SimpleOnGestureListener) - PullRequest
0 голосов
/ 07 мая 2020

Мое приложение (Java 8 / мин API 24 / целевой API 27) отображает изображение (загруженное из хранилища приложения во время выполнения) с использованием ImageView, которое я хочу увеличить, а также панорамировать во время увеличения.

Я знаю, что уже есть вопросы по этому поводу, но большинство из них были заданы в 2012 или 2013 годах, и принятые ответы обычно гласят: «Использовать библиотеку» (например, PhotoView ), что я вероятно, не может, потому что: я также хочу нарисовать на изображении, например, заполненный круг с текстом рядом с ним, который затем перемещается вместе с изображением, но не увеличивается. Думайте об этом как о карте (отдельное изображение, около 2000x2000) с маркерами карты, которые всегда остаются в одном и том же месте на карте (= одинаковые координаты x / y), даже при панорамировании.

Я уже нашел этот вопрос 2012 года, но предлагаемая библиотека ( TileView ), к сожалению, требует, чтобы изображение было разделено на плитки, которые хранятся как активы.

Вот почему я начал применять масштабирование сам, используя ScaleGestureDetector.SimpleOnScaleGestureListener ( источник ):

ScaleGestureDetector sgd = new ScaleGestureDetector(this, new MyPinchListener());
imageView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        sgd.onTouchEvent(event);
        return true;
    }
});

Это автоматически вызывает слушателя, например, onScaleEnd, и затем я рисую соответствующую часть растрового изображения на Canvas и добавьте это к ImageView:

Bitmap bitmapCanvas = Bitmap.createBitmap(getResources().getDisplayMetrics().widthPixels,getResources().getDisplayMetrics().heightPixels,Bitmap.Config.ARGB_8888);
canvas.drawBitmap(bitmapFile,srcRect,dstRect,paint);
imageView.setImageBitmap(bitmapCanvas);

Там полный код для обнаружения масштабирования и панорамирования здесь , но, хотя он работает, он не использует SimpleOnScaleGestureListener или SimpleOnGestureListener (который имеет onScroll), но вместо этого пытается найти тип самого жеста.

Вопрос: Как мне объединить этих двух слушателей в onTouch, чтобы я мог взять преимущество их on... методов? Есть ли менее сложный способ, чем полный код, который я привел выше?

Если есть библиотека (бесплатная и все еще поддерживается!), Которая выполняет прокрутку / панорамирование с одним большим изображением, а также позволяет добавлять какой-либо тип наложения (мне нужно знать, какая область пикселей отображается в настоящее время), пожалуйста, не стесняйтесь предлагать его в качестве альтернативы.

...