veinhorn / scrollgalleryview Goto Github PK
View Code? Open in Web Editor NEW:bridge_at_night: Android image gallery with bottom scroll view
License: MIT License
:bridge_at_night: Android image gallery with bottom scroll view
License: MIT License
PicassoImageLoader not added with dependency
I am trying to retrieve some images from a local file of the device (let's say the DCIM/Camera). How can I use:
scrollGalleryView
.setThumbnailSize(100)
.setZoom(true)
.setFragmentManager(getSupportFragmentManager())
.addMedia(infos);
?
where infos it's a List
public class ScrollGalleryView extends LinearLayout {
...
public void addOnPageChangeListener(ViewPager.OnPageChangeListener listener) {
viewPager.addOnPageChangeListener(listener);
}
...
when I click on the img or the screen,I hope I can get the click event
03-15 21:21:41.280 23678-23678/com.veinhorn.scrollgalleryview I/PhotoViewAttacher: ImageView no longer exists. You should not use this PhotoViewAttacher any more.
java.lang.OutOfMemoryError: Failed to allocate a 46656012 byte allocation with 16771776 free bytes and 31MB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1080)
at android.content.res.Resources.loadDrawableForCookie(Resources.java:2635)
at android.content.res.Resources.loadDrawable(Resources.java:2540)
at android.content.res.Resources.getDrawable(Resources.java:806)
at android.content.res.Resources.getDrawable(Resources.java:771)
at com.veinhorn.scrollgalleryview.loader.DefaultImageLoader.loadBitmap(DefaultImageLoader.java:48)
at com.veinhorn.scrollgalleryview.loader.DefaultImageLoader.loadThumbnail(DefaultImageLoader.java:39)
at com.veinhorn.scrollgalleryview.ScrollGalleryView.addMedia(ScrollGalleryView.java:101)
at com.veinhorn.scrollgalleryview.ScrollGalleryView.addMedia(ScrollGalleryView.java:89)
at com.veinhorn.example.MainActivity.onCreate(MainActivity.java:56)
at android.app.Activity.performCreate(Activity.java:6251)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4077)
at android.app.ActivityThread.-wrap15(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1350)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Hi, Thanks a lot for your library. It really helps. But I have a strange error and dont know how to handle it.(Sry for duplicate of ^that text)
Console sometimes returns me a fatal error with "ImageFragment.onSaveInstanceState getBitmap()' on a null"... Plus.
I can not zoom picture.
Initialization here:
List<String> s = g.fromJson(stringExtra, listType);
List<MediaInfo> infos = new ArrayList<>(s.size());
for (String url : s)
infos.add(MediaInfo.mediaLoader(new MediaLoader() {
@Override
public boolean isImage() {
return true;
}
@Override
public void loadMedia(Context context, ImageView imageView, SuccessCallback callback) {
Glide
.with(context)
.load(url)
.asBitmap()
.into(imageView);
}
@Override
public void loadThumbnail(Context context, ImageView thumbnailView, SuccessCallback callback) {
}
}));
scrollGalleryView
.setThumbnailSize(100)
.setZoom(true)
.hideThumbnails(true)
.setFragmentManager(supportFragmentManager)
.addMedia(infos);
when i compile this library in android studio
its return failed to resolve : com.github.chrisbanes:PhotoView:2.0.0
the download link is return 404 error
ImageView no longer exists. You should not use this PhotoViewAttacher any more.
I think that the problem is here
library/src/main/res/layout/image_fragment.xml
How can i add textview for show image numbers ?
Hello there, great lib!
What first came to my mind is that loading the image could be abstracted away through an interface, so that client code can use whatever technique it wants (popular libraries like Picasso, Glide, Universal Image Loader, Fresco, etc.) instead of directly loading a Bitmap.
So rather than using addImage(Bitmap image)
, it would be addImage(ScrollGalleryViewItem item)
, where:
interface ScrollGalleryViewItem {
View getView();
View getThumbnail(int thumbnailSize);
}
(Just a rough sketch, but you get the idea)
Also, there would be a default implementation of this interface SimpleScrollGalleryViewItem
, which simply does what the lib currently does, so that people can easily use the lib without any extra code right away.
What do you think?
Ps.: 👍 for the nice, clean code :)
I think it's better to remove resources such as app_name from the library, because it can cause clashes with app's own app_name resource.
If someone uses app_name resource value (especially in layout, which was in my case), he will see ScrollGalleryView instead of his own app name.
Library has two res files which contains app_name string:
ScrollGalleryView/library/src/main/res/values-ru/strings.xml
ScrollGalleryView/library/src/main/res/values/strings.xml
Sometimes when I swipe images I got NPE indicating this line in ImageFragment.class
...
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
....
outState.putParcelable(Constants.IMAGE, ((BitmapDrawable) backgroundImage.getDrawable()).getBitmap());
...
}
Quick fix for that issue is adding IF
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
...
if (backgroundImage != null && backgroundImage.getDrawable() != null) {
outState.putParcelable(Constants.IMAGE, ((BitmapDrawable) backgroundImage.getDrawable()).getBitmap());
}
...
}
Have anybody else encountered this error?
Hi, there is a method which I can change the position of the thumbnails? I want to move from the bottom to a side of the screen but I can't.
Moreover, there is the posibility of hide the thumbnails when the user is viewing a photo and when he slides show again the thumbnails?
Thanks and regards!
Can i add text for each imageview
Hey,
First: Thanks for your awesome library. It really helps a lot. But I have a strange error and dont know how to handle it. My initialization of the scrollviewGallery happens after a doubletap, recongized by a TouchListener. Then I simply add the bitmaps, enable zoom and request the SupportedFragmentManager:
case MotionEvent.ACTION_DOWN:
if(mTime != 0f && System.currentTimeMillis() - mTime<160f){
Log.d(TAG,"doubletap");
List<MediaInfo> infos = new ArrayList<>(mBitmaps.size());
for(Bitmap b : mBitmaps){
infos.add(MediaInfo.mediaLoader(new DefaultImageLoader(b)));
}
scrollGalleryView.setThumbnailSize(100)
.setZoom(true)
.setFragmentManager(getActivity().getSupportFragmentManager())
.addMedia(infos);
//scrollGalleryView.bringToFront();
scrollGalleryView.setVisibility(View.VISIBLE);
singleViewContainer.setVisibility(View.GONE);
mTime = System.currentTimeMillis();
break;
}else{
mTime = System.currentTimeMillis();
}
mScrollView.setScrollingEnabled(false);
lastImagePosition = event.getX();
break;
The Gallery shows up, but if I perform a "pinch to zoom" action, I get an Exception with:
03-31 17:46:56.893 12711-12711/de.reno.app E/AndroidRuntime: FATAL EXCEPTION: main Process: de.reno.app, PID: 12711 java.lang.ArrayIndexOutOfBoundsException: length=1; index=1 at android.support.v4.widget.ViewDragHelper.saveLastMotion(ViewDragHelper.java:849) at android.support.v4.widget.ViewDragHelper.shouldInterceptTouchEvent(ViewDragHelper.java:1057) at android.support.v4.widget.DrawerLayout.onInterceptTouchEvent(DrawerLayout.java:1438) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2175) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2632) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2321) at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:413) at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1808) at android.app.Activity.dispatchTouchEvent(Activity.java:3061) at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:63) at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:375) at android.view.View.dispatchPointerEvent(View.java:10243) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4438) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4306) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3853) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3906) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3872) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3999) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3880) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4056) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3853) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3906) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3872) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3880) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3853) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6246) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6220) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6181) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6349) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method) at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176) at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:6320) at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:6372) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874) at android.view.Choreographer.doCallbacks(Choreographer.java:686) at android.view.Choreographer.doFrame(Choreographer.java:615) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6119) at java.lang.reflect.Method.invoke(Native Method) 03-31 17:46:56.893 12711-12711/de.reno.app E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Do you have any idea how I can handle the pinch to zoom gesture?
It would be nice to have a method for resetting gallery to its initial state (empty gallery - no images added). This would allow reusing the same gallery instance to show various sets of images.
My use case: I have a social network client app that shows a feed of posts. Each post may have its own collection of attached images. I want to reuse a single overlayed gallery instance to show images, and refill it with a list of images from different posts.
How can I set thumbnail direction to rtl?
setting "layoutDirection" and "textDirection" attributes to rtl not work...
Hi, I want to open this scroll gallery on a popup dialog but i am getting this error:
07-13 17:48:04.748 25834-25834/com.veinhorn.scrollgalleryview E/AndroidRuntime: java.lang.IllegalArgumentException: No view found for id 0x7f0c005f (com.veinhorn.scrollgalleryview:id/viewPager) for fragment ImageFragment{422ca0b0 #0 id=0x7f0c005f}
Can you specify a way to load list of Uri ?
Will you upload the project to maven or jcenter? Also does it support loading images from url or only supports resources?
Why what ever i do my first position is place holder icon?!
And this is my code:
ArrayList<String> strings = new ArrayList<>();
strings.add("http://img1.goodfon.ru/original/1920x1080/d/f5/aircraft-jet-su-47-berkut.jpg");
strings.add("http://img1.goodfon.ru/original/1920x1080/d/f5/aircraft-jet-su-47-berkut.jpg");
strings.add("http://img1.goodfon.ru/original/1920x1080/d/f5/aircraft-jet-su-47-berkut.jpg");
List<MediaInfo> infos = new ArrayList<>(strings.size());
for (String url : strings) infos.add(MediaInfo.mediaLoader(new PicassoImageLoader(url)));
scrollGalleryView = findViewById(R.id.scroll_gallery_view);
scrollGalleryView
.setThumbnailSize(200)
.setZoom(true)
.setFragmentManager(getSupportFragmentManager())
.addMedia(MediaInfo.mediaLoader(new MediaLoader() {
@Override public boolean isImage() {
return true;
}
@Override public void loadMedia(Context context, ImageView imageView,
MediaLoader.SuccessCallback callback) {
callback.onSuccess();
}
@Override public void loadThumbnail(Context context, ImageView thumbnailView,
MediaLoader.SuccessCallback callback) {
callback.onSuccess();
}
}))
.addMedia(infos);
}
And for PicassoImageLoader:
public class PicassoImageLoader implements MediaLoader {
private String url;
private Integer thumbnailWidth;
private Integer thumbnailHeight;
public PicassoImageLoader(String url) {
this.url = url;
}
public PicassoImageLoader(String url, Integer thumbnailWidth, Integer thumbnailHeight) {
this.url = url;
this.thumbnailWidth = thumbnailWidth;
this.thumbnailHeight = thumbnailHeight;
}
@Override
public boolean isImage() {
return true;
}
@Override
public void loadMedia(Context context, final ImageView imageView, final MediaLoader.SuccessCallback callback) {
Picasso.get()
.load(url)
.into(imageView, new ImageCallback(callback));
}
@Override
public void loadThumbnail(Context context, final ImageView thumbnailView, final MediaLoader.SuccessCallback callback) {
Picasso.get()
.load(url)
.resize(thumbnailWidth == null ? 300 : thumbnailWidth,
thumbnailHeight == null ? 300 : thumbnailHeight)
.centerInside()
.into(thumbnailView, new ImageCallback(callback));
}
private static class ImageCallback implements Callback {
private final MediaLoader.SuccessCallback callback;
public ImageCallback(SuccessCallback callback) {
this.callback = callback;
}
@Override
public void onSuccess() {
callback.onSuccess();
}
@Override
public void onError(Exception e) {
}
}
Hello,
I really love your library, but I could not use it on Fragment. Is there a way to use it on Fragment?
Thank you,
Have fun :)
Provide image loaders for most popular downloading and caching libraries as separate modules (dependencies).
Do we have any template to work with proguard?
I got error when I add this code :(
scrollGalleryView.setOnScrollChangeListener(new OnScrollChangeListener() {
@Override
public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
}
});
Hi,
this behaviour is not always reproducable.
Happens during device rotation, currently on a Genymotion Nexus 7 with android 4.1.1.
Let me know if you need more info. Not sure why the viewpager is null here.
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.veinhorn.scrollgalleryview.HackyViewPager.setLocked(boolean)' on a null object reference at com.veinhorn.scrollgalleryview.ImageFragment.onCreateView(ImageFragment.java:41) at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1234) at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:2046) at android.support.v4.app.FragmentController.dispatchActivityCreated(FragmentController.java:174) at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:598) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1237) at android.app.Activity.performStart(Activity.java:6268)
When open images and collapse app, show error. This maybe in ImageFragment in onSaveInstanceState method when call
outState.putParcelable("image", ((BitmapDrawable)this.backgroundImage.getDrawable()).getBitmap());
As specificed here , latest codes are not available in jcenter and I cannot use viewpager. Please publish latest codes to jcenter for 1.0.6 version.
Error detail after zooming in a image several times:
09-13 12:05:38.403 5340-5340/XXXXX E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: xxxxxxxxxy, PID: 5340
java.lang.IllegalArgumentException: pointerIndex out of range
at android.view.MotionEvent.nativeGetAxisValue(Native Method)
at android.view.MotionEvent.getX(MotionEvent.java:1983)
at android.support.v4.view.MotionEventCompatEclair.getX(MotionEventCompatEclair.java:32)
at android.support.v4.view.MotionEventCompat$EclairMotionEventVersionImpl.getX(MotionEventCompat.java:110)
at android.support.v4.view.MotionEventCompat.getX(MotionEventCompat.java:462)
at android.support.v4.view.ViewPager.onInterceptTouchEvent(ViewPager.java:1922)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2090)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2541)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2234)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2541)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2234)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2541)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2234)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2541)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2234)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2541)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2234)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2541)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2234)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2541)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2234)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2365)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1726)
at android.app.Activity.dispatchTouchEvent(Activity.java:2772)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2326)
at android.view.View.dispatchPointerEvent(View.java:8687)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4485)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4343)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3884)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3937)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3903)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4013)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3911)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4070)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3884)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3937)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3903)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3911)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3884)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6300)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6256)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6209)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6462)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176)
at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:6421)
at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:6493)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:795)
at android.view.Choreographer.doCallbacks(Choreographer.java:598)
at android.view.Choreographer.doFrame(Choreographer.java:565)
Thumbnail improvements:
08-08 21:18:57.663 26869-26869/com.veinhorn.scrollgalleryview D/MediaPlayer: setDataSource IOException happend :
java.io.FileNotFoundException: No content provider: http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_1mb.mp4
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1117)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:970)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:897)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1109)
at android.widget.VideoView.openVideo(VideoView.java:376)
at android.widget.VideoView.access$2100(VideoView.java:73)
at android.widget.VideoView$7.surfaceCreated(VideoView.java:657)
at android.view.SurfaceView.updateWindow(SurfaceView.java:714)
at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:208)
at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:1018)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2327)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1314)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7062)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:829)
at android.view.Choreographer.doCallbacks(Choreographer.java:606)
at android.view.Choreographer.doFrame(Choreographer.java:576)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:815)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6917)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
It's time to provide a new fluent API for the ScrollGalleryView library which should significantly increase flexibility of gallery creation and initialization. Currently, the development of new API is going in separate fluent-api branch, so if you have some ideas how to make API more flexible - PR is welcome, or just leave a comment with your suggestions. Here I have tried to provide a simple sketch of API.
.build()
method)..from()
GalleryBuilder.from(R.id.scroll_gallery_view)
.media(File image)
.media(String image)
.media(URI image)
.media(Bitmap image)
.build();
.from()
It's can be usefull when you use libraries such as Butterknife to bind views.
GalleryBuilder.from(R.id.scroll_gallery_view)
.media(File image)
.media(String image)
.media(URI image)
.media(Bitmap image)
.build();
So, .media()
method should support image loading from different sources, but at the same time it should use custom MediaLoader provided by external dependencies such as picasso-loader.
The GalleryBuilder
class should provide a bunch of overloaded .media()
methods for loading images from different sources such as file, url, uri, etc. Also .media()
method should recognize by url if it's image or video (I think it's can be done by extension in the end of url).
For now all fluent API code can be found in com.veinhorn.scrollgalleryview.builder
package. I'm going to keep it away from ScrollGalleryView class to abstract from gallery representation. If you think there are any reasons to add some kind of static method in ScrollGalleryView to obtain new builder instance - just leave a comment with your arguments.
Each custom MediaLoader (for example picasso-loader) should provide implementation of MediaHelpers
interface, then you can use Java static imports feature to bring this methods into your app scope:
import static PicassoMediaHelpers.*
GalleryBuilder.from(R.id.scroll_gallery_view)
.withMedia(media(new File("path/to/image")))
.withMedia(media(new File("folder with images")))
.withMedia(media("<uri>"))
.withMedia(media("<bitmap>"))
.build();
MediaHelpers
interface might looks like this:
interface MediaHelpers {
void media(String media);
void media(File media);
void media(Bitmap image);
void media(Uri media);
// and so on ...
}
Custom MediaHelpers
might looks like this:
public final class PicassoMediaHelpers implements MediaHelpers {
private PicassoMediaHelpers() {
}
}
Here is an example of how can look ScrollGalleryView configuration in new fluent API.
import static PicassoMediaHelpers.*
GalleryBuilder.from(R.id.scroll_gallery_view)
.withMedia(media(new File("path/to/image")))
.withMedia(media(new File("folder with images")))
// more media invocations here
.settings(
// specify gallery settings here
)
.build();
Java static imports
Even more about static imports
Fluent interface
DSL
About DSLs in Java
I faced with vexing problem. Your library doesn't work with "new style coding" - without using FragmentActivity as a parent class for main activity. How can I make your code work?
Hi
I have got a problem. IN android version 4.2.2 the app run great.
In a new dispositive with version 4.4.4., the same code only show 5 images.
Can you help me please?
Add several video settings (like option builder class):
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.