рдЬрд╝реВрдо рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдмрд╛рд░ рдЯреИрдк рдХрд░рдиреЗ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдирд╛ рдЖрдо рдмрд╛рдд рд╣реИред рдпрд╣ ZoomEngine
рдореЗрдВ рдПрдХ рдСрдкреНрдЯ-рдЗрди рд╕реБрд╡рд┐рдзрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ ZoomImageView
рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрддреА рд╣реИред
@ рдирдЯрд╛рд░рд┐рдпреЛ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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ) рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдлреА рд╕рдорд╛рди рдХрд╛рд░реНрдп рд╣реИ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()
}
}
рдирдорд╕реНрддреЗ,
рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! :)
рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╣реИрдХреА рддрд░реАрдХрд╛ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЕрднреА рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╣реА рдПрдирд┐рдореЗрдЯрд┐рдВрдЧ рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рд╛рде рд░рд╣рдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред
рдзрдиреНрдпрд╡рд╛рдж,
рдирд┐рдХреЛрд▓рд╛рдЬреВ
рдирдорд╕реНрддреЗ,
рдПрдХ рдбрдмрд▓ рдЯреИрдк рдкрд░ рдЬрд╝реВрдорд┐рдВрдЧ + рдкреИрдирд┐рдВрдЧ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдЗрд╕ рдкрд░ рдХреЛрдИ рдЦрдмрд░?
рдзрдиреНрдпрд╡рд╛рдж,
рдХреНрд░рд┐рд╕реНрдЯреЛрдлрд╝
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдирдорд╕реНрддреЗ,
рдПрдХ рдбрдмрд▓ рдЯреИрдк рдкрд░ рдЬрд╝реВрдорд┐рдВрдЧ + рдкреИрдирд┐рдВрдЧ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдЗрд╕ рдкрд░ рдХреЛрдИ рдЦрдмрд░?
рдзрдиреНрдпрд╡рд╛рдж,
рдХреНрд░рд┐рд╕реНрдЯреЛрдлрд╝