Zoomlayout: рдЬрд╝реВрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдмрд╛рд░ рдЯреИрдк рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 29 рд╕рд┐рддре░ 2017  ┬╖  13рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: natario1/ZoomLayout

рдЬрд╝реВрдо рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдмрд╛рд░ рдЯреИрдк рдХрд░рдиреЗ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдирд╛ рдЖрдо рдмрд╛рдд рд╣реИред рдпрд╣ ZoomEngine рдореЗрдВ рдПрдХ рдСрдкреНрдЯ-рдЗрди рд╕реБрд╡рд┐рдзрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ ZoomImageView рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрддреА рд╣реИред

enhancement long term

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдирдорд╕реНрддреЗ,

рдПрдХ рдбрдмрд▓ рдЯреИрдк рдкрд░ рдЬрд╝реВрдорд┐рдВрдЧ + рдкреИрдирд┐рдВрдЧ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдЗрд╕ рдкрд░ рдХреЛрдИ рдЦрдмрд░?

рдзрдиреНрдпрд╡рд╛рдж,
рдХреНрд░рд┐рд╕реНрдЯреЛрдлрд╝

рд╕рднреА 13 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

@ рдирдЯрд╛рд░рд┐рдпреЛ1

рдЕрднреА рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдХрд╕реНрдЯрдо рдЬреЗрд╕реНрдЪрд░ рд╢реНрд░реЛрддрд╛ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рд╕реНрд╡рдпрдВ рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИред рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдЗрд╕рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рддреЛ рдореЗрд░рд╛ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

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);

            }
        };

рдлрд┐рд░ рдЕрдкрдиреЗ рдЯрдЪрд▓рд┐рд╕реНрдЯрд░ рдХреЛ рдЬрд╝реВрдордЗрдореЗрдЬрд╡реНрдпреВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ:

    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;
//        }
    }

рдХреГрдкрдпрд╛ рдУрд╡рд░рд░рд╛рдЗрдб рдСрдирд╕реНрдХреНрд░реЙрд▓ (MUST) рдФрд░ рдЕрдиреНрдп рд╡рд┐рдзрд┐ (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ) рдкрд░ рдХрд░реЗрдВ, рдЬрд┐рд╕рд╕реЗ рдЖрдкрдХреЗ рдкрд╛рд╕ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ 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 рдореЗрдВ рдПрдХ рдЬреЗрд╕реНрдЪрд░ рдбрд┐рдЯреЗрдХреНрдЯрд░ рд╣реИ рдЬреЛ рд╕реНрдХреНрд░реЙрд▓ рдФрд░ рдлрд╝реНрд▓рд┐рдВрдЧ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ
  • рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк onScale() рдХреЗ рдЕрдВрджрд░ 99% рддрд░реНрдХ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕реНрдХреЗрд▓ рдЬреЗрд╕реНрдЪрд░ рдХреЗ рдХреЗрдВрджреНрд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬрд╝реВрдо рдлрд╝реИрдХреНрдЯрд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдЬрд╝реВрдо рдХрд╛рд░рдХ рд╕реНрд╡рдпрдВ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ zoomIn() 1.3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ) рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдлреА рд╕рдорд╛рди рдХрд╛рд░реНрдп рд╣реИ
  • рдпрд╣ рдПрдХ XML рд╡рд┐рд╢реЗрд╖рддрд╛ ( doubleTapBehavior ?) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рджреЛ рд╡рд┐рдХрд▓реНрдк ("рдХреЛрдИ рдирд╣реАрдВ" рдФрд░ "рдЬрд╝реВрдо") рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдЖрдЗрдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрдИ рдирд╣реАрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА lib рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред

@natario1 рдХреВрд▓! рдЬрдм рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд╕рдордп рд╣реЛрдЧрд╛ рддреЛ рдореИрдВ рдЗрд╕реЗ рдХрд░реВрдБрдЧрд╛ ...

рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдХрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдЖрдкрдХреЗ рдЬрд╝реВрдорд▓реЗрдЖрдЙрдЯ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡рд╣рд╛рдВ рдЕрдкрдирд╛ рддрд░реНрдХ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВред
рдореИрдВ рдЙрд╕реА рд╕рдордп рдЖрдВрджреЛрд▓рди рдХреЗ рд╕рд╛рде рдЬрд╝реВрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдордп рдХреЛрдИ рднрд╛рдЧреНрдп рдирд╣реАрдВ рд╣реИред

рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдХреНрдпрд╛ MoveTo () рд╡рд┐рдзрд┐ рдореЗрдВ рдХреЛрдИ рдХреНрд░рд┐рдпрд╛ рдЬреЛрдбрд╝реА рдЬрд╛ рд╕рдХрддреА рд╣реИ? рдЗрд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдЖрдк рдХрдИ рдЪреАрдЬреЗрдВ рдХрд░ рд╕рдХреЗрдВред

рдареАрдХ рд╣реИ, рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд╝реВрдордмреА, рдЬрд╝реВрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрджрд┐ ...

рдпрд╣ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

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

@AlvaroFalcon рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдореИрдВ рдРрд╕рд╛ рдХрд░реВрдВрдЧрд╛ рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рд╢реБрджреНрдз рдЬрд╛рд╡рд╛ рд╣реИред рд╣рдо рд╣рд╛рд▓рд╛рдВрдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХреЛрдЯрд▓рд┐рди рдЬрд╛рдПрдВрдЧреЗред рдЕрднреА рдХреЗ рд▓рд┐рдП, onIdle() рд╣реИ рдЬрд┐рд╕реЗ рдХреЛрдИ рднреА рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

@AlvaroFalcon рдХреНрдпрд╛ рдЖрдк рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЬрд╝реВрдо рдФрд░ рдкреИрди рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗ? рдЕрдкрдирд╛ рдХреЛрдб рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдорди?

рдореИрдВрдиреЗ рдЬрд╝реВрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрдмрд▓ рдЯреИрдк рдФрд░ рдкрд┐рдВрдЪ рджреЛрдиреЛрдВ рд▓рд╛рдЧреВ рдХрд┐рдП рд╣реИрдВред рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдорд╛рдзрд╛рди рдХреА рдХреБрдВрдЬреА рдЬрд╝реВрдо рд▓реЗрдЖрдЙрдЯ рдХреЗ рдЕрдВрджрд░ рд╕рд╛рдордЧреНрд░реА рджреГрд╢реНрдп рдореЗрдВ рдЯреИрдк/рдбрдмрд▓ рдЯреИрдк рдЬреЗрд╕реНрдЪрд░ рдбрд┐рдЯреЗрдХреНрдЯрд░ рд╕рдВрд▓рдЧреНрди рдХрд░рдирд╛ рд╣реИ рдФрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдЪреНрдЪреЛрдВ рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝реВрдо рд▓реЗрдЖрдЙрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реИред рдлрд┐рд░ рдХреЙрдиреНрдЯреЗрдВрдЯ рд╡реНрдпреВ рдХреЗ рдСрдирдЯрдЪрдПрд╡реЗрдВрдЯ рдореЗрдВ рдЯрдЪ рдЗрд╡реЗрдВрдЯреНрд╕ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд▓реМрдЯреЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЬреЗрд╕реНрдЪрд░ рдбрд┐рдЯреЗрдХреНрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдВред рдЗрд╕ рддрд░рд╣ рдкрд┐рдВрдЪ, рдЬреВрдо рдФрд░ рдбрдмрд▓ рдЯреИрдк рджреЛрдиреЛрдВ рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдбрдмрд▓ рдЯреИрдк рдкрд░ рдЬрд╝реВрдо рдЗрди рдХрд░рдирд╛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВрдиреЗ рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЬрд╝реВрдо рдХрд░рдиреЗ рдХрд╛ рднреА рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдбрдмрд▓ рдЯреИрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ 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 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

kuoliangkwong picture kuoliangkwong  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

lucasrsv picture lucasrsv  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Yahor10 picture Yahor10  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

wakaztahir picture wakaztahir  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

MohamedMedhat1998 picture MohamedMedhat1998  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ