jsibbold / zoomage Goto Github PK
View Code? Open in Web Editor NEWA simple pinch-to-zoom ImageView library for Android
Home Page: http://jsibbold.github.io/zoomage
License: Apache License 2.0
A simple pinch-to-zoom ImageView library for Android
Home Page: http://jsibbold.github.io/zoomage
License: Apache License 2.0
When you change orientation, the images change dimension and position (they become smaller and at the top corner). No idea why.
In Viewpager which is horizontal swiping, the first image is zoomable but the rest of the images are not able to zoom.
When you set restrictBounds = true
and the scaleType
property for the view to FIT_XY
, the image gets cropped.
Note: This bug is inconsistent and may require you to zoom in, out and move the image slightly.
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.
it's a request
This more closely guarantees a safe XML attribute declaration, since zoomage_ will be a part of the attribute's name.
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
Unfortunately it doesn't work with ViewPager2. I can zoom in the photo but the ViewPager's swipe is broken so I can't see my next photos in the slideshow.
This library seems to work with but there is no customization like yours
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?
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!
Hi, is there any way of finding where the user has tapped on the image?
(I'm a bit new to android studio)
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.
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.
Tested under Android 10 on Moto G8 plus
As already described when zoom out to the maximim possible value suddenly the image disapears and will not re-appear. Just to check I added a button that lets me do a reset(). But that does not change anything.
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.
I'm looking to restrict the scale to page width for the purpose of scrolling through multiple pages vertically.
Thank you for this 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?
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"
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);
}
}
I cant seem to find the appropriate way to get the visible zoomed image
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
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.
this is just for clarity
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.
hi admin please enable also double tap zoom feature
Hello there,
I want to save image after zooming, can you please help me by suggesting any logic to save zoomed image.
small images not fitting top center , it alligning top left corner not top center corner .
I don't know how to enable double tap to zoom, how can i do that?
Thanks
If the Bitmap set by setImageBitmap(Bitmap)
is bigger than the bitmap that was loaded before, it is impossible zoom out enough to fit into the View
When i zoom image and swipe left or right then view pager swipe not image.
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
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.
Request to add momentum to the slide gesture
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!
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.
I want to show original image first . But it is showing zoomed in image .
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?
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) { }
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.
My image is quite big and is showing full screen image. If I want to set a specific zoom value initially how can it be done?
I want to customize double tab listener to move to next image , But not able to do as listener is observed.
When image is zoomed right in then change images the new image is at the same zoom level as the last image even if I do a ZoomageView.reset() first.
Is there a way to reset the zoom to 1?
Damien
How we can upload image by passing the string URL which we received from server.
Hello,
I set scaltype fitxy and set image width,height match_parent still image not show to fullscreen.
Would be awesome to be able to translate only with pinch in stead of single finger.
awesome library! any hints for videos though?
When the ZoomageView is inside an ScrollView and your content doesn´t fit in the screen and the scroll view is enabled, using the ZoomageView functionality is a mess because it conflicts with the scroll bar.
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
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.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.