Zoomlayout: НаТмитС Π΄Π²Π°ΠΆΠ΄Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 29 сСнт. 2017  Β·  13ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: natario1/ZoomLayout

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΡŽΡ‚ Π½Π° Π΄Π²ΠΎΠΉΠ½ΠΎΠ΅ касаниС для управлСния ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. Π­Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ функция Π² ZoomEngine , Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Π°Ρ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² ZoomImageView .

enhancement long term

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

ΠŸΡ€ΠΈΠ²Π΅Ρ‚,

Π•ΡΡ‚ΡŒ новости ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ + панорамирования ΠΏΠΎ Π΄Π²ΠΎΠΉΠ½ΠΎΠΌΡƒ Ρ‚Π°ΠΏΡƒ?

Бпасибо,
ΠšΡ€ΠΈΡΡ‚ΠΎΡ„

ВсС 13 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

@natario1

На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ я Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π» эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ собствСнного класса ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Ρ‚Π΅Π»Ρ ТСстов. Π’ΠΎΡ‚ ΠΌΠΎΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π°, Ссли ΠΊΠΎΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ.

private GestureDetector gestureDetector; 
private View.OnTouchListener touchListener;
private ZoomImageView selectedImage;

Π·Π°Ρ‚Π΅ΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ эти ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅:

    gestureDetector = new GestureDetector(mContext, new MyGestureListener());

        touchListener = new View.OnTouchListener() {
            <strong i="11">@Override</strong>
            public boolean onTouch(View v, MotionEvent event) {
                // pass the events to the gesture detector
                // a return value of true means the detector is handling it
                // a return value of false means the detector didn't
                // recognize the event
                selectedImage = (ZoomImageView) v;
                return gestureDetector.onTouchEvent(event);

            }
        };

Π·Π°Ρ‚Π΅ΠΌ Π½Π°Π·Π½Π°Ρ‡ΡŒΡ‚Π΅ свой touchlistener для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° zoomimageview:

    ZoomImageView image = layout.findViewById(R.id.imageViewItemImageSlider);
    image.setOnTouchListener(touchListener);

Π° Π²ΠΎΡ‚ класс MyGestureListener:

    class MyGestureListener extends GestureDetector.SimpleOnGestureListener {

//        <strong i="18">@Override</strong>
//        public boolean onDown(MotionEvent event) {
//            Log.d("TAG","onDown: ");
//
//            // don't return false here or else none of the other
//            // gestures will work
//            return true;
//        }
//
//        <strong i="19">@Override</strong>
//        public boolean onSingleTapConfirmed(MotionEvent e) {
//            Log.i("TAG", "onSingleTapConfirmed: ");
//            return true;
//        }
//
//        <strong i="20">@Override</strong>
//        public void onLongPress(MotionEvent e) {
//            Log.i("TAG", "onLongPress: ");
//        }

        <strong i="21">@Override</strong>
        public boolean onDoubleTap(MotionEvent e) {
            Log.i("TAG", "onDoubleTap: ");
            if((selectedImage.getEngine().getZoom() >= 2.75F)) {
                selectedImage.getEngine().zoomTo(1F, true);
            } else if((selectedImage.getEngine().getZoom() < 1F)) {
                selectedImage.getEngine().zoomTo(1F, true);
            }  else {
                selectedImage.getEngine().zoomBy(2F, true);
            }

            return true;
        }

//        <strong i="22">@Override</strong>
//        public boolean onScroll(MotionEvent e1, MotionEvent e2,
//                                float distanceX, float distanceY) {
//            Log.i("TAG", "onScroll: ");
//            return true;
//        }

//        <strong i="23">@Override</strong>
//        public boolean onFling(MotionEvent event1, MotionEvent event2,
//                               float velocityX, float velocityY) {
//            Log.d("TAG", "onFling: ");
//            return true;
//        }
    }

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ onScroll (ΠžΠ‘Π―Π—ΠΠ’Π•Π›Π¬ΠΠž) ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π² ΠΌΠΎΠ΅ΠΌ случаС), с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π²Π°ΠΌ Π½Π΅Ρ‡Π΅Π³ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒ с событиСм касания ZoomImageView ΠΈ создаст ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ.

НадСюсь, Ρ‡Ρ‚ΠΎ это ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ.

Π’ настоящСС врСмя я Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΡŽ Π½Π° Π΄Π²ΠΎΠΉΠ½ΠΎΠ΅ касаниС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ†Π΅Π½Ρ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ экран, Π³Π΄Π΅ Π±Ρ‹Π»ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ событиС.

ΠŸΡ€ΠΎΡΡ‚ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠ² это:

    private val simpleGestureDetector = GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {


        //here is the method for double tap


        override fun onDoubleTap(e: MotionEvent): Boolean {

            Log.d("OnDoubleTapListener", "onDoubleTap")
            centerElement(e.x.absoluteValue,e.y.absoluteValue)
            return true
        }

    })

    fun centerElement(clickedX: Float, clickedY: Float) {
        val offsetX = (width.absoluteValue) / 2
        val offsetY = (height.absoluteValue) / 2
        val displacedX = engine.panX.absoluteValue
        val displacedY = engine.panY.absoluteValue
        val x = (displacedX + clickedX / engine.realZoom) - (offsetX / engine.realZoom)
        val y = (displacedY + clickedY / engine.realZoom) - (offsetY / engine.realZoom)
        val desiredX = if (x > 0) -x else 0f
        val desiredY = if (y > 0) -y else 0f
        engine.moveTo(engine.zoom, desiredX, desiredY, true)
    }

Π’Π΅ΠΏΠ΅Ρ€ΡŒ я ΠΏΡ‹Ρ‚Π°ΡŽΡΡŒ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. Π― ΠΌΠΎΠ³Ρƒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ запрос Π½Π° Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π».

@AlvaroFalcon , это Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΊΡ€ΡƒΡ‚ΠΎ! Π― ΠΌΠΎΠ³Ρƒ Π΄Π°Ρ‚ΡŒ Π²Π°ΠΌ нСсколько совСтов.

  • Π£ нас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€ ТСстов Π² ZoomEngine , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΡƒ ΠΈ пСрСлистываниС.
  • Π― Π΄ΡƒΠΌΠ°ΡŽ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ 99% Π»ΠΎΠ³ΠΈΠΊΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ onScale() . Он Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ Ρ†Π΅Π½Ρ‚Ρ€Π° ΠΌΠ°ΡΡˆΡ‚Π°Π±Π½ΠΎΠ³ΠΎ ТСста ΠΈ примСняСт коэффициСнт ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ. Π’Π°ΠΌ придСтся ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ коэффициСнт ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ (я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ zoomIn() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ 1,3), Π½ΠΎ это ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Π° ΠΆΠ΅ Π·Π°Π΄Π°Ρ‡Π°.
  • Π­Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ настроСно с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ XML-Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ( doubleTapBehavior ?), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° (Β«Π½Π΅Ρ‚Β» ΠΈ Β«ΠΌΠ°ΡΡˆΡ‚Π°Π±Β»). Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ none ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, поэтому ΠΌΡ‹ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ это для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ ΡƒΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ.

@natario1 ΠšΡ€ΡƒΡ‚ΠΎ! Π― сдСлаю это, ΠΊΠΎΠ³Π΄Π° Ρƒ мСня Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ...

Π’ настоящСС врСмя я Ρ€Π°Π±ΠΎΡ‚Π°ΡŽ Π½Π°Π΄ своим ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ с классом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ ваш zoomlayout, поэтому я добавляю Ρ‚ΡƒΠ΄Π° свою Π»ΠΎΠ³ΠΈΠΊΡƒ.
Π― ΠΏΡ‹Ρ‚Π°ΡŽΡΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ это, Π½ΠΎ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΠΎΠ²Π΅Π·Π»ΠΎ.

Бпасибо Π·Π° совСты!

МоТно Π»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ дСйствиС Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ moveTo()? Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ это Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ нСсколько Π²Π΅Ρ‰Π΅ΠΉ.

Ну, для moveTo, zoomBy, zoomTo ΠΈ Ρ‚.Π΄...

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊ:

moveTo(zoom, x, y, action : ()->Unit={})

@AlvaroFalcon Π’ ΠšΠΎΡ‚Π»ΠΈΠ½Π΅ я Π±Ρ‹ сдСлал это, Π½ΠΎ это всС Π΅Ρ‰Π΅ чистая Java. Однако Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ Π½Π° Kotlin. На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΅ΡΡ‚ΡŒ onIdle() , ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ.

@AlvaroFalcon , Π²Π°ΠΌ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΏΠ°Π½ΠΎΡ€Π°ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ? НС ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Π²Ρ‹ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ своим ΠΊΠΎΠ΄ΠΎΠΌ?

Π― Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π» ΠΊΠ°ΠΊ Π΄Π²ΠΎΠΉΠ½ΠΎΠ΅ касаниС, Ρ‚Π°ΠΊ ΠΈ Ρ‰ΠΈΠΏΠΎΠΊ для увСличСния. ΠšΠ»ΡŽΡ‡ΠΎΠΌ ΠΊ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌΡƒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ являСтся присоСдинСниС Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€Π° ТСстов касания/Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ касания ΠΊ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡŽ содСрТимого Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ°ΠΊΠ΅Ρ‚Π° ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈ настройка ΠΌΠ°ΠΊΠ΅Ρ‚Π° ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ»ΠΈΠΊΠ°Π±Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ элСмСнты Π±Ρ‹Π»ΠΈ истинными. Π—Π°Ρ‚Π΅ΠΌ Π² onTouchEvent прСдставлСния содСрТимого Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сСнсорныС события ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈΡ… Π΄Π΅Ρ‚Π΅ΠΊΡ‚ΠΎΡ€Ρƒ ТСстов. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‰ΠΈΠΏΠΎΠΊ, ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π΄Π²ΠΎΠΉΠ½ΠΎΠ΅ касаниС Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ Π΄Π²ΠΎΠΉΠ½ΠΎΠΌΡƒ Ρ‚Π°ΠΏΡƒ Π½Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°.

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, я Ρ‚Π°ΠΊΠΆΠ΅ попытался ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ, которая Π±Ρ‹Π»Π° Π΄Π²Π°ΠΆΠ΄Ρ‹ Π½Π°ΠΆΠ°Ρ‚Π°, ΠΈ, учитывая, ΠΊΠ°ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ZoomEngine.moveTo , одноврСмСнная интСрполяция ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈ панорамирования Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, ΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠΊΠΎΠ»ΡŒΠ·ΠΈΡ‚ ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ путям, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΏΠ°Π½ΠΎΡ€Π°ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ мСста назначСния. Π­Ρ‚ΠΎ Π½Π΅ выглядит Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎ приятным, Π½ΠΎ я Π½Π΅ ΠΌΠΎΠ³Ρƒ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ происходит. Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ интСрполяции Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ фактичСскоС ΠΏΠ°Π½ΠΎΡ€Π°ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² зависимости ΠΎΡ‚ фактичСского ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ части Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ.

ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚ΡŒΡΡ ΠΊ области, которая Π±Ρ‹Π»Π° Π΄Π²Π°ΠΆΠ΄Ρ‹ Π½Π°ΠΆΠ°Ρ‚Π°

Π”Π°, это ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ я пытался ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. Π›ΡŽΠ±Ρ‹Π΅ прСдлоТСния ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ @natario1?

ΠŸΡ€ΠΈΠ²Π΅Ρ‚ @mman

ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ способ автоматичСского ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ касаСтся экрана, ΠΈ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π² Π²ΠΈΠ΄Π΅ закручивания ΠΊ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌΡƒ полоТСнию.

Π‘Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Ссли Π±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ этой Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠ΅ΠΉ. Π•ΡΡ‚ΡŒ Π»ΠΈ Ρƒ вас ΠΈΠ»ΠΈ Ρƒ Π΄Ρ€ΡƒΠ³ΠΈΡ… прСдлоТСния, ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ?

Π—Π°Ρ€Π°Π½Π΅Π΅ спасибо :)

МнС ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ грязного Π²Π·Π»ΠΎΠΌΠ°. Π― ΠΎΠ±ΠΌΠ°Π½Ρ‹Π²Π°ΡŽ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ, заставляя Π΅Π³ΠΎ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ происходит Ρ‰ΠΈΠΏΠΎΠΊ.

class ReflectionHelper {
    <strong i="6">@Nullable</strong>
    static ScaleGestureDetector.OnScaleGestureListener getScaleDetectorListenerUsingReflection(ZoomEngine zoomEngine) {
        try {
            Field mScaleDetector = zoomEngine.getClass().getDeclaredField("mScaleDetector");
            mScaleDetector.setAccessible(true);
            ScaleGestureDetector detector = (ScaleGestureDetector) mScaleDetector.get(zoomEngine);
            Field mListener = detector.getClass().getDeclaredField("mListener");
            mListener.setAccessible(true);
            return (ScaleGestureDetector.OnScaleGestureListener) mListener.get(detector);
        } catch (Exception e) {
            return null;
        }
    }
}

private fun simulatePinch(fromScale: Float, toScale: Float, focusX: Float, focusY: Float) {
    class MockDetector(var mockScaleFactor: Float, var mockFocusX: Float, var mockFocusY: Float) : ScaleGestureDetector(context, null) {
        override fun getScaleFactor() = mockScaleFactor
        override fun getFocusX() = mockFocusX
        override fun getFocusY() = mockFocusY
    }

    val mockDetector = MockDetector(fromScale, focusX, focusY)
    ValueAnimator.ofFloat(fromScale, toScale).apply {
        addUpdateListener { animation ->
            mockDetector.mockScaleFactor = animation.animatedValue as Float
            zoomEngineScaleListener?.onScale(mockDetector)
        }
        doOnEnd { zoomEngineScaleListener?.onScaleEnd(mockDetector) }
        start()
    }
}

ΠŸΡ€ΠΈΠ²Π΅Ρ‚,

Бпасибо Π·Π° ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ! :)

Π­Ρ‚ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ каТСтся Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ хакСрским способом достиТСния этого. Π― Π΄ΡƒΠΌΠ°ΡŽ, ΠΎΠ΄Π½Π°ΠΊΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΊΠ° ΠΌΡ‹ Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ Тизнь с самой ΠΎΠΆΠΈΠ²Π»ΡΡŽΡ‰Π΅ΠΉ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠ΅ΠΉ.

Бпасибо,
Николай

ΠŸΡ€ΠΈΠ²Π΅Ρ‚,

Π•ΡΡ‚ΡŒ новости ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ + панорамирования ΠΏΠΎ Π΄Π²ΠΎΠΉΠ½ΠΎΠΌΡƒ Ρ‚Π°ΠΏΡƒ?

Бпасибо,
ΠšΡ€ΠΈΡΡ‚ΠΎΡ„

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ