Code Monkey home page Code Monkey logo

pinchtozoom's Introduction

Maven Central Android Arsenal

PinchToZoom

Android's ImageView pinch-to-zoom made easy

Sample app

Get it on Google Play

Get it

Add this line to your build.gradle's dependencies:

compile 'com.bogdwellers:pinchtozoom:0.1'

Overview

PinchToZoom for Android is a simple yet feature complete library for adding pinch-to-zoom functionality to an ImageView. It has sleek easing animations that make it stand out in quality and ease of use.

Features

  • Pinch-to-zoom
  • Double-tap to quickly zoom-in and out
  • Drag while zoomed in
  • Animated drag & zoom release easing
  • Does not extend the ImageView class so is usable with custom ImageView implementations
  • Fully customizable

Integrate

Adding pinch-to-zoom functionality to your ImageView is easy as this:

ImageView imageView = (ImageView) view.findViewById(R.id.image);
imageView.setOnTouchListener(new ImageMatrixTouchHandler(view.getContext()));

Customization

The ImageMatrixTouchHandler class has multiple getter/setter methods that allow for changing the behavior and animation settings.

Javadoc

Consult the Javadoc at https://martinwithaar.github.io/PinchToZoom/

pinchtozoom's People

Contributors

maillouxc avatar martinwithaar avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

pinchtozoom's Issues

Can i zoom out?

Can i somehow customize this library to support zoom out indefinitely? right now you can't zoom out to make the image smaller

Not working onClickListener

I tried to detect onClick event on imageView, but it is not working.
How can I fix this issue?

Here is my code.

ImageMatrixTouchHandler imageMatrixTouchHandler = new ImageMatrixTouchHandler(imageView.getContext());
imageView.setOnTouchListener(imageMatrixTouchHandler);

    imageView.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            //do something
        }
    });

How to reset zoom?

I can't figure out how to reset the zoom level. I am using one ImageView, into which I am loading one image at a time (from a thumbnail) for zooming with. However, if I open one, zoom in a bit, close it (hiding the imageview), then open another image, it shows up at the same zoom level as the one before it.

I tried setting a new ImageMatrixTouchHandler on the zoomed in ImageView every time I load in a new pic, but that didn't help.

I also tried making a "standalone" ImageMatrixTouchHandler ahead of setting it on the ImageView, with the thought that I could try myImageMatrixTouchHandler.animateZoom(0, 0) but I get a
Attempt to invoke virtual method 'void android.graphics.Matrix.getValues(float[])' on a null object reference

doesn't work inside of a scrollview

is there a fix for this? it might be because of conflicting onTouchListeners. Maybe it's possible that if you pass a reference of the scrollview to your library, you could handle it there?

detecting longpress

Is there a better way than below code? I am trying to find out the position(X, Y) of selected text on a zoomed image.

ImageMatrixTouchHandler imageMatrixTouchHandler = new ImageMatrixTouchHandler(layout.getContext()){
                @Override
                public boolean onTouch(View view, MotionEvent event) {
                    Log.d(TAG, "onTouch: ");
                    super.onTouch(view, event);
                    Log.d(TAG, "onTouch: super");
                    final GestureDetector gestureDetector = new GestureDetector(ViewImageActivity.this, new GestureDetector.SimpleOnGestureListener() {
                        public void onLongPress(MotionEvent e) {
                            Log.e(TAG, "Longpress detected event "+event.getAction()+" e "+e.getAction());
                            if(event.getAction() == 0){
                                Log.d(TAG, "onLongPress: real detected X: "+e.getX()+" Y: "+e.getY()+" event X: "+event.getX()+" Y: "+event.getY()+" raw Y"+event.getRawY());
                                Toast.makeText(getApplicationContext(), "Long Clicked " , Toast.LENGTH_SHORT).show();
                            }
                        }
                    });
                    gestureDetector.onTouchEvent(event);
                    return true; // indicate event was handled
                }
            };
            ivImage.setOnTouchListener(imageMatrixTouchHandler);

Not able to navigate a zoomed image. Swiping takes to second image instead of showing the section of zoomed image

I am not able to navigate a zoomed image. Swiping takes to second image instead of showing the section of the zoomed image.
Bug explained in this video at https://www.youtube.com/watch?v=_9XjgVCqIOg&t=300

Note that I should also be able to listen to longclick on a zoomed image. Currently I am able to detect longpress using GestureDetector as shown here https://github.com/onedrupal/One-Drupal-Android/blob/master/app/src/main/java/com/technikh/onedrupal/activities/ViewImageActivity.java#L188

Also I am not able to send the zoomed section to OCR detection(Google firebase ML Kit). I am only able to send the full image at https://github.com/onedrupal/One-Drupal-Android/blob/master/app/src/main/java/com/technikh/onedrupal/activities/ViewImageActivity.java#L240

Fatal Exception: java.lang.NullPointerException

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.drawable.Drawable.getIntrinsicWidth()' on a null object reference
       at com.bogdwellers.pinchtozoom.ImageMatrixCorrector.getInnerFitScale(ImageMatrixCorrector.java:62)
       at com.bogdwellers.pinchtozoom.ImageMatrixTouchHandler$ImageGestureListener.onDoubleTapEvent(ImageMatrixTouchHandler.java:430)
       at android.view.GestureDetector.onTouchEvent(GestureDetector.java:525)
       at com.bogdwellers.pinchtozoom.ImageMatrixTouchHandler.onTouch(ImageMatrixTouchHandler.java:326)
       at android.view.View.dispatchTouchEvent(View.java:8582)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2530)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2110)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2530)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2110)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2530)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2110)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2530)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2110)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2530)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2110)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2530)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2110)
       at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2530)
       at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2110)
       at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2538)
       at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1811)
       at android.app.Activity.dispatchTouchEvent(Activity.java:2820)
       at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:68)
       at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2476)
       at android.view.View.dispatchPointerEvent(View.java:8799)
       at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4729)
       at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4551)
       at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4047)
       at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4106)
       at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4066)
       at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4209)
       at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4074)
       at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4266)
       at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4047)
       at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4106)
       at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4066)
       at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4074)
       at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4047)
       at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6530)
       at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6504)
       at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6457)
       at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6689)
       at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:218)
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next(MessageQueue.java:148)
       at android.os.Looper.loop(Looper.java:168)
       at android.app.ActivityThread.main(ActivityThread.java:5657)
       at java.lang.reflect.Method.invoke(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:990)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:785)

Nothing happens

I have integrated the library as in the description and it does not work, unfortunately.

How to reset scaling to the original?

Hi! Thanks for the great library.

There is one problem.

  1. I do imgViev.setImageBitmap(bitmap)
  2. Enlarge the image, but do not reduce it.
  3. Upload the next image in imgView
  4. It is immediately on an enlarged scale, and I want it to be in the original. How to finish this?

Thank you!

P.S. I found a solution!

        try {
            imageMatrixTouchHandler.animateZoom(0, 0);
        } catch (Exception ignore) {
        }

try/catch need, because there may be an exception

W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Matrix.getValues(float[])' on a null object reference
at com.bogdwellers.pinchtozoom.MatrixCorrector.getValues(MatrixCorrector.java:96)

Custom onClick

Is there a way for us to use our own custom onclick event?

Not working

The image functionality only works inside the imageview, not for the imageview component, ie, only work for the resource inside, the beer

image

How to disable the screen edges block

Hi there, When I zoom an image into its original size, then I cannot drag it around, I have to zoom it out until it gets bigger than the screen's width, then I can move it, otherwise I can only zoom in an out and the image stays in the center of my relative layout.
How can I disable this block? (Hope my question is clear :)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.