Giter VIP home page Giter VIP logo

zoomage's Introduction

zoomage

Build Status Download

A simple pinch-to-zoom ImageView library for Android with an emphasis on a smooth and natural feel.

Gradle

repositories {
    mavenCentral()
}

dependencies {
    implementation 'com.jsibbold:zoomage:1.3.1'
}

Using It

Simply add a ZoomageView as you would any typical ImageView in Android. The scaleType that you set on your ZoomageView will determine the starting size and position of your ZoomageView's image. This is the inherited ImageView.ScaleType from Android. With a ZoomageView, the fitCenter or centerInside scale types usually make the most sense to use, fitCenter being Android's default scale type.

    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <com.jsibbold.zoomage.ZoomageView
            android:id="@+id/myZoomageView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@drawable/my_zoomable_image"
            app:zoomage_restrictBounds="false"
            app:zoomage_animateOnReset="true"
            app:zoomage_autoResetMode="UNDER"
            app:zoomage_autoCenter="true"
            app:zoomage_zoomable="true"
            app:zoomage_translatable="true"
            app:zoomage_minScale="0.6"
            app:zoomage_maxScale="8"
            />
    </RelativeLayout>

If using a ZoomageView with a view pager, it is recommended that ViewPager2 is used.

XML Attributes

zoomage_restrictBounds="true|false"

Restricts the bounds of the image so it does not wander outside the border of the ImageView when it's smaller than the frame size, and restricts the bounds to stop at the edges of the ImageView when the image is larger than the frame size. Default value is false.

zoomage_animateOnReset="true|false"

Image will animate back to its starting size whenever it is reset if true, and will snap back to its starting size when false. Default value is true.

zoomage_autoResetMode="UNDER|OVER|ALWAYS|NEVER"

Determines at what times the image will reset to its starting size. Note that UNDER, OVER, and ALWAYS all have the effect of resetting the image to its starting position if its size has not changed. Default value is UNDER.

zoomage_autoCenter="true|false"

This will cause the image to pull itself into view on-screen if it is partially off-screen. Default value is true.

zoomage_minScale="{float greater than 0}"

The minimum allowed scale for the image. Ideally this should be less than 1, must be greater than 0, and must be less than maxScale. Default value is 0.6.

zoomage_maxScale="{float greater than 0}"

The maximum allowed scale for the image. Ideally this should be greater than 1, must be greater than 0, and must be greater than minScale. Default value is 8.

zoomage_zoomable="true|false"

Sets whether zooming is allowed. Default value is true.

zoomage_translatable="true|false"

Sets whether translation is allowed. Default value is true.

zoomage_doubleTapToZoom="true|false"

Sets whether double tap to zoom functionality is enabled. Default is true.

zoomage_doubleTapToZoomScaleFactor="{float within bounds of min and max scale}"

Sets the scale factor for double tap to zoom functionality. Default is 3.


Special thanks to @mchowning for all his help

License

Copyright 2016 Jeffrey Sibbold

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

zoomage's People

Contributors

jsibbold avatar macklinu 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  avatar  avatar  avatar

zoomage's Issues

Add Double Tab Listner

I want to customize double tab listener to move to next image , But not able to do as listener is observed.

View gets locked when changing layout params

Hi, I'm trying to make that a ZoomageView gets "fullscreen" when you double touch it, instead of simply zooming.

To make that, I've created a custom GestureDetector, this code:

class GestureListener(private val mainActivity: MainActivity) :
    GestureDetector.SimpleOnGestureListener() {
    companion object {
        private const val TAG = "GestureListener"
    }

    private var zoomed = false

    override fun onDoubleTap(e: MotionEvent?): Boolean {
        super.onDoubleTap(e)

        val displayMetrics = DisplayMetrics()
        mainActivity.windowManager.defaultDisplay.getMetrics(displayMetrics)
        val screenHeight = displayMetrics.heightPixels
        val imageViewParams = mainActivity.imageView.layoutParams
        imageViewParams.height = screenHeight * 1 / 2
        mainActivity.imageView.layoutParams = if (zoomed) imageViewParams
            else ConstraintLayout.LayoutParams(
                ConstraintLayout.LayoutParams.MATCH_PARENT,
                ConstraintLayout.LayoutParams.MATCH_PARENT
            )
        zoomed = !zoomed

        mainActivity.imageView.invalidate()

        return true
    }
}

What I'm trying to do there is to set the imageView's height to half the screen height, and when you double click, it fills the parent view.
The thing is that some times (mostly always) when the view changes size it gets blocked, I can't zoom in, out or move the image, and I have to close and reopen the app, to see the same behavior again.
I'm not getting any errors, so I am a bit confused.
I've tried doing it the ugly way, creating two imageView, and when double clicking one hiding that, and showing the other, see this code:

class GestureListener(private val mainActivity: MainActivity) :
    GestureDetector.SimpleOnGestureListener() {
    companion object {
        private const val TAG = "GestureListener"
    }

    private var zoomed = false

    override fun onDoubleTap(e: MotionEvent?): Boolean {
        super.onDoubleTap(e)

        visibility(mainActivity.sector_imageView, !zoomed)
        visibility(mainActivity.imageView_full, zoomed)

        zoomed = !zoomed

        mainActivity.imageView.invalidate()
        mainActivity.imageView_full.invalidate()

        return true
    }
}

Where visibility is:

fun visibility(view: View, visible: Boolean, setGone : Boolean = true, debug: Boolean = false){
    view.visibility = if(visible) View.VISIBLE else if(setGone) View.GONE else View.INVISIBLE
}

But I am having the same issue. Locked view, no errors... What am I doing wrong? Thanks in advance.

Add support for double-tap to zoom

Great library, thanks !
Would be nice if it allowed to zoom-in/zoom-out of the image by double-tapping on it.

Double-tapping would toggle-animate between the full-screen state and the original image size, which seems to be the standard behavior of most image-viewing widgets.

Single tap is also causing image to zoom

I open image in a separate activity and zoom works fine for the first time. But when I open this activity again, it zooms on a single click (To the maximum zoom) which is undesirable. Can you please check this issue.

Thanks in advance!

Zoom factor

How can i get zoom factor?
ex. zoomed (2x), zoomed (1.63x)

Edit:
and also how can i get x and y coordinates of displayed part of ZoomageView after i zoom in?

Error inflating class com.jsibbold.zoomage.ZoomageView

Device: Moto G4, API level 23

android.view.InflateException: Binary XML file line #189: Binary XML file line #189: Error inflating class com.jsibbold.zoomage.ZoomageView
FATAL EXCEPTION: Thread-761
Process: com.mediums, PID: 12093
android.view.InflateException: Binary XML file line #189: Binary XML file line #189: Error inflating class com.jsibbold.zoomage.ZoomageView
at android.view.LayoutInflater.inflate(LayoutInflater.java:539)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at com.mediums.ui.fragments.PhotoReadingFragment.onCreateView(PhotoReadingFragment.java:61)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2600)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:881)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
at androidx.fragment.app.FragmentManagerImpl.execSingleAction(FragmentManagerImpl.java:1696)
at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:299)
at com.mediums.ui.activity.DashboardActivity.loadFragment(DashboardActivity.java:130)
at com.mediums.adapter.BottomNavigationAdapter.onBindViewHolder(BottomNavigationAdapter.java:43)
at com.mediums.adapter.BottomNavigationAdapter.onBindViewHolder(BottomNavigationAdapter.java:19)
at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7065)
at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7107)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6012)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6279)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)
at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2303)
at androidx.recyclerview.widget.GridLayoutManager.layoutChunk(GridLayoutManager.java:561)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
at androidx.recyclerview.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:170)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3851)
at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4404)
at android.view.View.layout(View.java:16651)
at android.view.ViewGroup.layout(ViewGroup.java:5440)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at android.view.View.layout(View.java:16651)
at android.view.ViewGroup.layout(ViewGroup.java:5440)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079)
at android.view.View.layout(View.java:16651)
at android.view.ViewGroup.layout(ViewGroup.java:5440)
at androidx.appcompat.widget.LinearLayoutCompat.setChildFrame(LinearLayoutCompat.java:1655)
at androidx.appcompat.widget.LinearLayoutCompat.layoutVertical(LinearLayoutCompat.java:1509)
at androidx.appcompat.widget.LinearLayoutCompat.onLayout(LinearLayoutCompat.java:1417)
at android.view.View.layout(View.java:16651)
at android.view.ViewGroup.layout(ViewGroup.java:5440)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at android.view.View.layout(View.java:16651)
at android.view.ViewGroup.layout(ViewG

Get position touched by user

I need to show a map who will receive user interactions to point some events in my app. There is a way to get the right position (x/y) when the image is zoomed? I found a similar question where you say to use Matrix to do that, but I don't know how to do it.

About nested recycleview

Hi. I have a viewpager2 in recycleview just like instagram. I want to show a picture just like instagram pinch zoom. it is work in viewpager's borders when I use Zoomage in viewpager but it is not overflow of viewpager borders. it is mean it can not be fullscreen. is there any way to do full screen in Recycleview?

Can't swipe ViewPager

After update to 1.3.0 i can't swipe to left right inside viewpager. How can i fix it?
I can't change images

Status Code 409 Conflict

Hey Jeff,
I've used zoomage in my Android applications before with no error, but I'm getting an error now. See notes below. Hope you can help.

When loading an Android application with the zoomage dependencies, I get the following gradle error:

Error:Could not GET 'https://oss.jfrog.org/artifactory/oss-snapshot-local/com/android/support/appcompat-v7/25.3.1/appcompat-v7-25.3.1.pom'. Received status code 409 from server: Conflict
Enable Gradle 'offline mode' and sync project

When I go to the site in the error message (https://oss.jfrog.org/artifactory/oss-snapshot-local/com/android/support/appcompat-v7/25.3.1/appcompat-v7-25.3.1.pom), I see:
{ "errors": [ { "status": 409, "message": "The repository 'oss-snapshot-local' rejected the resolution of an artifact 'oss-snapshot-local:com/android/support/appcompat-v7/25.3.1/appcompat-v7-25.3.1.pom' due to conflict in the snapshot release handling policy." } ] }

Any idea what's going on?

Thanks

Add support for rotation

Since we have translation and scale, we may as well get crazy and add an option for rotation as well. Rotation would require twisting two fingers past a threshold, optionally resetting after, same as translation and scale.

Add support to clickListener

I'd like to handle clicks on the imageview, but when I call setOnClickListener, the listener isn't called.

I think onTouchEvent needs to be patched to detect when a click was done and call the performClick method accordingly.

Thanks for all the hard work!

Image bounds are not restricted when zooming.

I have a ZoomageView with zoomage_restrictBounds set to true, and when dragging with a finger, this is perfect, but when you drag with two fingers, when zooming, for example, it allows you to exit the boundaries.
Is it a bug, a feature or I do need to set up something else?
Thank you very much.

Add xml attrs file to the aar package

Hi! Just tried your library today and it works wonderfully! Thank you very much for releasing it.

But when I tried to use some attributes, Android Studio complained that it couldn't find them. After inspecting the aar file, I noticed that the attrs.xml file is missing inside the res folder.

How to connect Zoomage with Seekbar

I am really really stuck at this point

@Override
public void onRangeChanged(RangeSeekBar view, float leftValue, float rightValue, boolean 
isFromUser) {

    **_//What should i do here_**

}

@Override
public void onStartTrackingTouch(RangeSeekBar view, boolean isLeft) {

}

@Override
public void onStopTrackingTouch(RangeSeekBar view, boolean isLeft) {

}

Wrong value of view getWidth and getHeight

I am using your library for zooming view.
When I get width value and height value using getWidth and a getHeight method respectively.
But, It gives me the wrong value.

I want width value and height value for making bitmap.
After I append some value it is working well. Show below Ex.

For Example.

zoomage.getWidth() is wrong value.
(int) (zoomage(zoomage.getWidth() * 1.010)) is right value.

zoomage.getHeight() is wrong value.
(int) zoomage(zoomage.getHeight() * 1.010) is right value.

I also tried with Default ImageView and It gives the right value.

Could not find library

When I'm trying to download using gradle snapshot library I'm getting following errors on android studio 3.0.0

Error:Could not find com.jsibbold:zoomage:1.2.0-SNAPSHOT.
Searched in the following locations:
file:/E:/Android/sdk/extras/m2repository/com/jsibbold/zoomage/1.2.0-SNAPSHOT/maven-metadata.xml
file:/E:/Android/sdk/extras/m2repository/com/jsibbold/zoomage/1.2.0-SNAPSHOT/zoomage-1.2.0-SNAPSHOT.pom
file:/E:/Android/sdk/extras/m2repository/com/jsibbold/zoomage/1.2.0-SNAPSHOT/zoomage-1.2.0-SNAPSHOT.jar
file:/E:/Android/sdk/extras/google/m2repository/com/jsibbold/zoomage/1.2.0-SNAPSHOT/maven-metadata.xml
file:/E:/Android/sdk/extras/google/m2repository/com/jsibbold/zoomage/1.2.0-SNAPSHOT/zoomage-1.2.0-SNAPSHOT.pom
file:/E:/Android/sdk/extras/google/m2repository/com/jsibbold/zoomage/1.2.0-SNAPSHOT/zoomage-1.2.0-SNAPSHOT.jar
file:/E:/Android/sdk/extras/android/m2repository/com/jsibbold/zoomage/1.2.0-SNAPSHOT/maven-metadata.xml
file:/E:/Android/sdk/extras/android/m2repository/com/jsibbold/zoomage/1.2.0-SNAPSHOT/zoomage-1.2.0-SNAPSHOT.pom
file:/E:/Android/sdk/extras/android/m2repository/com/jsibbold/zoomage/1.2.0-SNAPSHOT/zoomage-1.2.0-SNAPSHOT.jar
file:/F:/android-studio-ide-171.4182969-windows/android-studio/gradle/m2repository/com/jsibbold/zoomage/1.2.0-SNAPSHOT/maven-metadata.xml
file:/F:/android-studio-ide-171.4182969-windows/android-studio/gradle/m2repository/com/jsibbold/zoomage/1.2.0-SNAPSHOT/zoomage-1.2.0-SNAPSHOT.pom
file:/F:/android-studio-ide-171.4182969-windows/android-studio/gradle/m2repository/com/jsibbold/zoomage/1.2.0-SNAPSHOT/zoomage-1.2.0-SNAPSHOT.jar
http://mobile.useinsider.com/com/jsibbold/zoomage/1.2.0-SNAPSHOT/maven-metadata.xml
http://mobile.useinsider.com/com/jsibbold/zoomage/1.2.0-SNAPSHOT/zoomage-1.2.0-SNAPSHOT.pom
http://mobile.useinsider.com/com/jsibbold/zoomage/1.2.0-SNAPSHOT/zoomage-1.2.0-SNAPSHOT.jar
https://jcenter.bintray.com/com/jsibbold/zoomage/1.2.0-SNAPSHOT/maven-metadata.xml
https://jcenter.bintray.com/com/jsibbold/zoomage/1.2.0-SNAPSHOT/zoomage-1.2.0-SNAPSHOT.pom
https://jcenter.bintray.com/com/jsibbold/zoomage/1.2.0-SNAPSHOT/zoomage-1.2.0-SNAPSHOT.jar
https://repo1.maven.org/maven2/com/jsibbold/zoomage/1.2.0-SNAPSHOT/maven-metadata.xml
https://repo1.maven.org/maven2/com/jsibbold/zoomage/1.2.0-SNAPSHOT/zoomage-1.2.0-SNAPSHOT.pom
https://repo1.maven.org/maven2/com/jsibbold/zoomage/1.2.0-SNAPSHOT/zoomage-1.2.0-SNAPSHOT.jar
https://raw.github.com/Matthias247/jawampa/mvn-repo/com/jsibbold/zoomage/1.2.0-SNAPSHOT/maven-metadata.xml
https://raw.github.com/Matthias247/jawampa/mvn-repo/com/jsibbold/zoomage/1.2.0-SNAPSHOT/zoomage-1.2.0-SNAPSHOT.pom
https://raw.github.com/Matthias247/jawampa/mvn-repo/com/jsibbold/zoomage/1.2.0-SNAPSHOT/zoomage-1.2.0-SNAPSHOT.jar
https://jitpack.io/com/jsibbold/zoomage/1.2.0-SNAPSHOT/maven-metadata.xml
https://jitpack.io/com/jsibbold/zoomage/1.2.0-SNAPSHOT/zoomage-1.2.0-SNAPSHOT.pom
https://jitpack.io/com/jsibbold/zoomage/1.2.0-SNAPSHOT/zoomage-1.2.0-SNAPSHOT.jar
https://dl.google.com/dl/android/maven2/com/jsibbold/zoomage/1.2.0-SNAPSHOT/maven-metadata.xml
https://dl.google.com/dl/android/maven2/com/jsibbold/zoomage/1.2.0-SNAPSHOT/zoomage-1.2.0-SNAPSHOT.pom
https://dl.google.com/dl/android/maven2/com/jsibbold/zoomage/1.2.0-SNAPSHOT/zoomage-1.2.0-SNAPSHOT.jar
https://maven.fabric.io/public/com/jsibbold/zoomage/1.2.0-SNAPSHOT/maven-metadata.xml
https://maven.fabric.io/public/com/jsibbold/zoomage/1.2.0-SNAPSHOT/zoomage-1.2.0-SNAPSHOT.pom
https://maven.fabric.io/public/com/jsibbold/zoomage/1.2.0-SNAPSHOT/zoomage-1.2.0-SNAPSHOT.jar
https://s3.amazonaws.com/repo.commonsware.com/com/jsibbold/zoomage/1.2.0-SNAPSHOT/maven-metadata.xml
https://s3.amazonaws.com/repo.commonsware.com/com/jsibbold/zoomage/1.2.0-SNAPSHOT/zoomage-1.2.0-SNAPSHOT.pom
https://s3.amazonaws.com/repo.commonsware.com/com/jsibbold/zoomage/1.2.0-SNAPSHOT/zoomage-1.2.0-SNAPSHOT.jar
Required by:
project :app

Location of Drawable

Is there a way to get the position of the drawable displayed by the ZoomageView?
I'd like to be able to programmatically access the current size and current position of the drawable.

Unable to Scroll in Sanpping RecyclerView

Emulator OS Android 10.

Unable to scroll through a snapping RecyclerView.

item_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"

    android:foreground="@drawable/ripple_effect"
    android:clickable="true"
    android:focusable="true">

    <com.jsibbold.zoomage.ZoomageView

        android:id="@+id/movieDetailsScreenshotImageView"

        android:layout_width="match_parent"
        android:layout_height="match_parent"

        app:zoomage_restrictBounds="true"

        android:contentDescription="@string/dummyImageDescription"

        tools:src="@drawable/temp_movie_screenshot"
        />

</FrameLayout>

fragment_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView
    xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/screenshotsRecyclerView"

    android:layout_width="match_parent"
    android:layout_height="match_parent"

    android:overScrollMode="never"
    android:background="@color/screen_shots_background_color"
    >

</androidx.recyclerview.widget.RecyclerView>

and finally setting up a snaphelper in the fragment:

snapHelper = new PagerSnapHelper();
snapHelper.attachToRecyclerView(screenshotsRecyclerView);

While the image is zoomable, user is unable to scroll through the list.

support library

this is what i get when i want to sync the project

org.gradle.internal.exceptions.LocationAwareException: Execution failed for task ':app:processDebugManifest'.
	at org.gradle.initialization.exception.DefaultExceptionAnalyser.transform(DefaultExceptionAnalyser.java:99)
	at org.gradle.initialization.exception.DefaultExceptionAnalyser.collectFailures(DefaultExceptionAnalyser.java:65)
	at org.gradle.initialization.exception.MultipleBuildFailuresExceptionAnalyser.transform(MultipleBuildFailuresExceptionAnalyser.java:39)
	at org.gradle.initialization.exception.StackTraceSanitizingExceptionAnalyser.transform(StackTraceSanitizingExceptionAnalyser.java:29)
	at org.gradle.initialization.DefaultGradleLauncher.finishBuild(DefaultGradleLauncher.java:174)
	at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:165)
	at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:134)
	at org.gradle.internal.invocation.GradleBuildController$1.execute(GradleBuildController.java:58)
	at org.gradle.internal.invocation.GradleBuildController$1.execute(GradleBuildController.java:55)
	at org.gradle.internal.invocation.GradleBuildController$3.create(GradleBuildController.java:82)
	at org.gradle.internal.invocation.GradleBuildController$3.create(GradleBuildController.java:75)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:183)
	at org.gradle.internal.work.StopShieldingWorkerLeaseService.withLocks(StopShieldingWorkerLeaseService.java:40)
	at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:75)
	at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:55)
	at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:54)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:58)
	at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
	at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:39)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:49)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:44)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:315)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:305)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:101)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:44)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:49)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:46)
	at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:78)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:46)
	at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:31)
	at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:42)
	at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:28)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:78)
	at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:52)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:59)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:36)
	at org.gradle.tooling.internal.provider.SessionScopeBuildActionExecuter.execute(SessionScopeBuildActionExecuter.java:68)
	at org.gradle.tooling.internal.provider.SessionScopeBuildActionExecuter.execute(SessionScopeBuildActionExecuter.java:38)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:37)
	at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:26)
	at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43)
	at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:60)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:32)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:55)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:41)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:48)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:32)
	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
	at org.gradle.util.Swapper.swap(Swapper.java:38)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:62)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:81)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:295)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:processDebugManifest'.
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:95)
	at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:91)
	at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:57)
	at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:119)
	at org.gradle.api.internal.tasks.execution.ResolvePreviousStateExecuter.execute(ResolvePreviousStateExecuter.java:43)
	at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:93)
	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:45)
	at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:94)
	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:56)
	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:55)
	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:67)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:49)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:315)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:305)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:101)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:49)
	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:43)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:134)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:129)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:202)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:193)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:129)
	... 3 more
Caused by: java.lang.RuntimeException: Manifest merger failed : Attribute application@appComponentFactory value=(android.support.v4.app.CoreComponentFactory) from [com.android.support:support-compat:28.0.0] AndroidManifest.xml:22:18-91
	is also present at [androidx.core:core:1.0.0] AndroidManifest.xml:22:18-86 value=(androidx.core.app.CoreComponentFactory).
	Suggestion: add 'tools:replace="android:appComponentFactory"' to <application> element at AndroidManifest.xml:8:5-29:19 to override.
	at com.android.builder.core.AndroidBuilder.mergeManifestsForApplication(AndroidBuilder.java:558)
	at com.android.build.gradle.tasks.ProcessApplicationManifest.doFullTaskAction(ProcessApplicationManifest.java:208)
	at com.android.build.gradle.internal.tasks.IncrementalTask.taskAction(IncrementalTask.java:106)
	at jdk.internal.reflect.GeneratedMethodAccessor161.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
	at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:47)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:41)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$2.run(ExecuteActionsTaskExecuter.java:284)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:301)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:293)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:91)
	at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:273)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:258)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$200(ExecuteActionsTaskExecuter.java:67)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:145)
	at org.gradle.internal.execution.impl.steps.ExecuteStep.execute(ExecuteStep.java:49)
	at org.gradle.internal.execution.impl.steps.CancelExecutionStep.execute(CancelExecutionStep.java:34)
	at org.gradle.internal.execution.impl.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:69)
	at org.gradle.internal.execution.impl.steps.TimeoutStep.execute(TimeoutStep.java:49)
	at org.gradle.internal.execution.impl.steps.CatchExceptionStep.execute(CatchExceptionStep.java:33)
	at org.gradle.internal.execution.impl.steps.CreateOutputsStep.execute(CreateOutputsStep.java:50)
	at org.gradle.internal.execution.impl.steps.SnapshotOutputStep.execute(SnapshotOutputStep.java:43)
	at org.gradle.internal.execution.impl.steps.SnapshotOutputStep.execute(SnapshotOutputStep.java:29)
	at org.gradle.internal.execution.impl.steps.CacheStep.executeWithoutCache(CacheStep.java:134)
	at org.gradle.internal.execution.impl.steps.CacheStep.lambda$execute$3(CacheStep.java:83)
	at org.gradle.internal.execution.impl.steps.CacheStep.execute(CacheStep.java:82)
	at org.gradle.internal.execution.impl.steps.CacheStep.execute(CacheStep.java:36)
	at org.gradle.internal.execution.impl.steps.PrepareCachingStep.execute(PrepareCachingStep.java:33)
	at org.gradle.internal.execution.impl.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:38)
	at org.gradle.internal.execution.impl.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:23)
	at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:96)
	at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:89)
	at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:52)
	at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:36)
	at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:34)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:91)
	... 32 more

and I'm using appcompat support library 28.0.0
is it a problem due to not using androidx?

No method to retain zoom level

Hi! I need to retain the zoom level when drawable changes in the view. Currently when I show thumbnail in the ImageView and zoom the image then when Glide loads the actual image. The zoom state is reset, I need to retain it in that case.
Currently I've handled it like this:

    @Override
    public void setScaleType(@Nullable ScaleType scaleType) {
        // To retain zoom level on Drawable change i.e. when actual image loads after thumbnail
        if (!isZoomed()) {
            super.setScaleType(scaleType);
        }
    }

Undesirable zoom when entering page with ViewPager2

I have such a problem - when scrolling with view pager some of the pages are auto zoomed a little and after a second they revert to original size. This seems to not occur when scale type of an imageView is set to Matrix, but not confirmed. I have a default configuration in code, nothing custom. Additionally autoReset seems to not work everytime i lose interaction with image.

app:zoomage_autoResetMode="ALWAYS"
app:zoomage_restrictBounds="true"
app:zoomage_animateOnReset="true"
app:zoomage_autoCenter="false"
app:zoomage_translatable="false"
app:zoomage_zoomable="false"
app:zoomage_minScale="1"
app:zoomage_maxScale="5"
app:zoomage_doubleTapToZoom="false"

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.