GithubHelp home page GithubHelp logo

veinhorn / scrollgalleryview Goto Github PK

View Code? Open in Web Editor NEW
529.0 22.0 156.0 4.12 MB

:bridge_at_night: Android image gallery with bottom scroll view

License: MIT License

Java 100.00%
android gallery picasso video fresco glide scrollgalleryview

scrollgalleryview's People

Contributors

ayhansalami avatar bierzorutas avatar bryant1410 avatar cinzianicoletti avatar ema987 avatar gitter-badger avatar inver avatar mbaleczny avatar mirjalal avatar oziomajnr avatar pentateu avatar rajasharan avatar stainlessstlrat avatar stefanopassador avatar veinhorn avatar voghdev avatar wching 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

scrollgalleryview's Issues

Images from local file

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

Nullpointer in HackyViewPager

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)

ScrollGallery as a popup??

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}

Error scrollGalleryView.setOnScrollChangeListener

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) {

  }
 });

OutOfMemory exception

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)

Only 5 images

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 video settings

Add several video settings (like option builder class):

  • Close icon
  • Autoclose after view
  • Autostart when select video

Failed to resolve

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

NullPointerException in ImageFragment

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?

Pinch to zoom

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?

TransactionTooLargeException on Nougat

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());

I can't relocate the thumbnails

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!

RTL Layout

How can I set thumbnail direction to rtl?
setting "layoutDirection" and "textDirection" attributes to rtl not work...

Gradle?

Will you upload the project to maven or jcenter? Also does it support loading images from url or only supports resources?

Glide with ScrollGalleryView is real?

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);

ImageView no longer exists

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.

Exception java.io.FileNotFoundException: No content provider

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)

Ability to remove images / clear gallery

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.

Remove app name from library resources

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

why place holder doesnt remove

Why what ever i do my first position is place holder icon?!

screenshot_1523283813

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) {

        }


    }

How to use on Fragment?

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 :)

Abstract image loading

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 :)

add OnPageChangeListener to ScrollGalleryView

public class ScrollGalleryView extends LinearLayout {
 ...
  public void addOnPageChangeListener(ViewPager.OnPageChangeListener listener) {
        viewPager.addOnPageChangeListener(listener);
  }
...

Fluent API for gallery initialization

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.

Key API features

  1. Get rid of ordered method invocation during gallery initialization.
  2. Support flexible step-by-step gallery initialization.
  3. Provide a new way to add media to your gallery (using static imports or interface).

Unclear points

  1. The place where we should check parameters which would be passed into GalleryBuilder (for now it's .build() method).

Gallery initialization

Pass view id to .from()

GalleryBuilder.from(R.id.scroll_gallery_view)
 .media(File image)
 .media(String image)
 .media(URI image)
 .media(Bitmap image)
 .build();

Pass inflated view to .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.

Adding media

Using Java static imports

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() {
  }
}

Gallery settings

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();

Additional info

Java static imports
Even more about static imports
Fluent interface
DSL
About DSLs in Java

Thumbnail improvements

Thumbnail improvements:

  • borders
  • long click -> open image in new activity
  • preview
  • hide thumbnails container (click on image)

Zooming FATAL EXCEPTION

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)

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.