B4A Library [B4X] ZoomImageView - Cross platform zoomable + pannable image view

Erel

Administrator
Staff member
Licensed User
A custom view that shows an image and allows the user to zoom and pan the image.

Instructions:
- Add with designer.
- Call SetBitmap.

Updates:

v1.04 - Fixes an issue in B4i where the image jumps when switching from pinch gesture to pan gesture.
v1.03 - Fixes an issue with the click event.
v1.02 - Removed the loading of Picture1.png which was left by mistake.
v1.01 - Fixes an issue with old Android devices.
 

Attachments

Last edited:

omo

Active Member
Licensed User
Is any method missing out in this library? I tried attached example out twice with 7/13 and 7/15 uploads but generated the same error on real-device and emulator. Am i missing something at my end? Here is my log:

*** Service (starter) Create ***
** Service (starter) Start **
** Activity (main) Create, isFirst = true **
zoomimageview_designercreateview (java line: 151)
java.lang.RuntimeException: Method: setQuickScaleEnabled not found in: android.view.ScaleGestureDetector
at anywheresoftware.b4j.object.JavaObject$MethodCache.getMethod(JavaObject.java:366)
at anywheresoftware.b4j.object.JavaObject.RunMethod(JavaObject.java:119)
at b4a.example.zoomimageview._designercreateview(zoomimageview.java:151)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:213)
at anywheresoftware.b4a.objects.CustomViewWrapper.AfterDesignerScript(CustomViewWrapper.java:67)
at anywheresoftware.b4a.keywords.LayoutBuilder.loadLayout(LayoutBuilder.java:162)
at anywheresoftware.b4a.objects.PanelWrapper.LoadLayout(PanelWrapper.java:134)
at anywheresoftware.b4a.objects.B4XViewWrapper.LoadLayout(B4XViewWrapper.java:311)
at b4a.example.b4xmainpage._b4xpage_created(b4xmainpage.java:39)
at b4a.example.b4xmainpage.callSub(b4xmainpage.java:72)
at anywheresoftware.b4a.keywords.Common.CallSub4(Common.java:1066)
at anywheresoftware.b4a.keywords.Common.CallSubNew2(Common.java:1037)
at b4a.example.b4xpagesmanager._createpageifneeded(b4xpagesmanager.java:497)
at b4a.example.b4xpagesmanager._showpage(b4xpagesmanager.java:799)
at b4a.example.b4xpagesmanager._addpage(b4xpagesmanager.java:197)
at b4a.example.b4xpagesmanager._addpageandcreate(b4xpagesmanager.java:204)
at b4a.example.b4xpagesmanager._initialize(b4xpagesmanager.java:680)
at b4a.example.main._activity_create(main.java:360)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at anywheresoftware.b4a.BA.raiseEvent2(BA.java:213)
at b4a.example.main.afterFirstLayout(main.java:105)
at b4a.example.main.access$000(main.java:17)
at b4a.example.main$WaitForLayout.run(main.java:83)
at android.os.Handler.handleCallback(Handler.java:605)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4424)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)
 

omo

Active Member
Licensed User
The example works well for me, except that you have to change the images, which are assigned incorrectly.
This example is not working for me, i don't know why. I tried it again after your message, but i am still having the same error. I am using android 9 and Youwave emulator. Below is the screenshot of library used, but still having the same errors linked above
2.jpg

Am i still missing something?
 

omo

Active Member
Licensed User
Your Android SDK is up to date?
I am still using android SDk-28 also targeted by Erel in that example: <uses-sdk android:minSdkVersion="5" android:targetSdkVersion="28"/> and jdk-11.0.1
 

asales

Well-Known Member
Licensed User
I am still using android SDk-28 also targeted by Erel in that example: <uses-sdk android:minSdkVersion="5" android:targetSdkVersion="28"/> and jdk-11.0.1
Not your SDK target in manifest. Your Android SDK.
Check the menu: Tools / SDK Manager.
Make a copy of the Android SDK folder before update the recommended items.
 
  • Like
Reactions: omo

omo

Active Member
Licensed User
Not your SDK target in manifest. Your Android SDK.
Check the menu: Tools / SDK Manager.
Make a copy of the Android SDK folder before update the recommended items.
Ok, thanks Asales, that may be the reason, i tried updating it 2-weeks ago, but i am not sure i finished it successfully due to other issues of the moment then
👍
 

omo

Active Member
Licensed User
v1.01 - Fixes an issue with old Android devices.
Ok, Thanks, this v1.01 now fixes the problem, but first generated another errors that it coundn't found picture1.png and later was looking for world-physical-map-mercator.jpg. I replaced the two files in the asset folder; so now it works well on my emulator and device
3.png


Thanks, Erel, Asales and Vecino
Regards
 

Biswajit

Active Member
Licensed User
Due to this following line, if you don't have an image named Picture1.png in your assets folder this library is crashing the app,
B4X:
Public Sub DesignerCreateView (Base As Object, Lbl As Label, Props As Map)
    mBase = Base
    Tag = mBase.Tag
....
....
....
    no.RunMethod("addGestureRecognizer:", Array(nme.RunMethod("CreateRecognizer", Null)))
    #end if
    SetBitmap(xui.LoadBitmap(File.DirAssets, "Picture1.png")) '<- this line
End Sub
 

omo

Active Member
Licensed User
Due to this following line, if you don't have an image named Picture1.png in your assets folder this library is crashing the app,
B4X:
Public Sub DesignerCreateView (Base As Object, Lbl As Label, Props As Map)
    mBase = Base
    Tag = mBase.Tag
....
....
....
    no.RunMethod("addGestureRecognizer:", Array(nme.RunMethod("CreateRecognizer", Null)))
    #end if
    SetBitmap(xui.LoadBitmap(File.DirAssets, "Picture1.png")) '<- this line
End Sub
Ok, thank you Biswajit, noted, although, I provided the picture since, but I will have to modify the code or keep managing it till Erel correct that in next version
 
Top