Big image viewer supporting pan and zoom, with very little memory usage and full featured image loading choices. Powered by Subsampling Scale Image View, Fresco, Glide, and Picasso. Even with gif and webp support! 🍻

Overview

BigImageViewer

Big image viewer supporting pan and zoom, with very little memory usage and full featured image loading choices. Powered by Subsampling Scale Image View, Fresco, Glide, and Picasso. Even with gif and webp support!

Demo

memory usage

pan and zoom gif support
demo gif support

Getting started

Add the dependencies

Note: please put this download url at the first of your repositories part, otherwise, gradle may search in wrong place.

allprojects {
    repositories {
        mavenCentral()
    }
}

implementation 'com.github.piasy:BigImageViewer:1.8.0'

// load with fresco
implementation 'com.github.piasy:FrescoImageLoader:1.8.0'

// load with glide
implementation 'com.github.piasy:GlideImageLoader:1.8.0'

// progress pie indicator
implementation 'com.github.piasy:ProgressPieIndicator:1.8.0'

// support thumbnail, gif and webp with Fresco
implementation 'com.github.piasy:FrescoImageViewFactory:1.8.0'

// support thumbnail and gif with Glide
implementation 'com.github.piasy:GlideImageViewFactory:1.8.0'

Initialize

// MUST use app context to avoid memory leak!
// load with fresco
BigImageViewer.initialize(FrescoImageLoader.with(appContext));

// or load with glide
BigImageViewer.initialize(GlideImageLoader.with(appContext));

// or load with glide custom component
BigImageViewer.initialize(GlideCustomImageLoader.with(appContext, CustomComponentModel.class));

Note that if you've already used Fresco in your project, please change Fresco.initialize into BigImageViewer.initialize.

Add the BigImageView to your layout

<com.github.piasy.biv.view.BigImageView
        android:id="@+id/mBigImage"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:failureImage="@drawable/failure_image"
        app:failureImageInitScaleType="center"
        app:optimizeDisplay="true"
        />

You can disable display optimization using optimizeDisplay attribute, or BigImageView.setOptimizeDisplay(false), which will disable animation for long image, and the switch between thumbnail and origin image.

Show the image

BigImageView bigImageView = (BigImageView) findViewById(R.id.mBigImage);
bigImageView.showImage(Uri.parse(url));

Usage

Animated image support

Since 1.5.0, BIV support display animated image, e.g. gif and animated webp, to achieve that, you need set a custom ImageViewFactory via biv.setImageViewFactory:

// FrescoImageViewFactory is a prebuilt factory, which use Fresco's SimpleDraweeView
// to display animated image, both gif and webp are supported.
biv.setImageViewFactory(new FrescoImageViewFactory());

// GlideImageViewFactory is another prebuilt factory, which use ImageView to display gif,
// animated webp is not supported (although it will be displayed with ImageView,
// but it won't animate).
biv.setImageViewFactory(new GlideImageViewFactory());

Node: if the image is not gif or animated webp, then it will be displayed by SSIV, the image type is not determined by its file extension, but by its file header magic code.

Thumbnail support

To show a thumbnail before the big image is loaded, you can call below version of showImage:

bigImageView.showImage(Uri.parse(thumbnail), Uri.parse(url));

Note: make sure that you have already called setImageViewFactory.

Shared element transition support (experimental)

Since 1.6.0, BIV has experimental support for shared element transition, but it has following known issues:

  • The shared image may flicker during enter transition, or become white after return transition, when using Fresco, see Fresco issue #1445;
  • The shared image may flicker after return transition, especially after you zoomed SSIV;

You can play with the demo app to evaluate the shared element transition support.

Download progress indicator

bigImageView.setProgressIndicator(new ProgressPieIndicator());

There is one built-in indicator, ProgressPieIndicator, you can implement your own indicator easily, learn by example.

Prefetch

You can prefetch images in advance, so it could be shown immediately when user want to see it.

BigImageViewer.prefetch(uris);

Save image into gallery

bigImageView.setImageSaveCallback(new ImageSaveCallback() {
    @Override
    public void onSuccess(String uri) {
        Toast.makeText(LongImageActivity.this,
                "Success",
                Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onFail(Throwable t) {
        t.printStackTrace();
        Toast.makeText(LongImageActivity.this,
                "Fail",
                Toast.LENGTH_SHORT).show();
    }
});

// should be called on worker/IO thread
bigImageView.saveImageIntoGallery();

Get current image file

// only valid when image file is downloaded.
File path = bigImageView.getCurrentImageFile();

Image init scale type

You can set the normal image scale type using initScaleType attribute, or setInitScaleType.

mBigImageView.setInitScaleType(BigImageView.INIT_SCALE_TYPE_CENTER_CROP);
value effect
center Center the image in the view, but perform no scaling.
centerCrop Scale the image uniformly (maintain the image's aspect ratio) so that both dimensions (width and height) of the image will be equal to or larger than the corresponding dimension of the view (minus padding). The image is then centered in the view.
centerInside Scale the image uniformly (maintain the image's aspect ratio) so that both dimensions (width and height) of the image will be equal to or less than the corresponding dimension of the view (minus padding). The image is then centered in the view.
fitCenter Scales the image so that it fits entirely inside the parent. At least one dimension (width or height) will fit exactly. Aspect ratio is preserved. Image is centered within the parent's bounds.
fitEnd Scales the image so that it fits entirely inside the parent. At least one dimension (width or height) will fit exactly. Aspect ratio is preserved. Image is aligned to the bottom-right corner of the parent.
fitStart Scales the image so that it fits entirely inside the parent. At least one dimension (width or height) will fit exactly. Aspect ratio is preserved. Image is aligned to the top-left corner of the parent.
fitXY Scales width and height independently, so that the image matches the parent exactly. This may change the aspect ratio of the image.
custom Scale the image so that both dimensions of the image will be equal to or less than the maxScale and equal to or larger than minScale. The image is then centered in the view.
start Scale the image so that both dimensions of the image will be equal to or larger than the corresponding dimension of the view. The top left is shown.

Note: SSIV only support centerCrop, centerInside, custom and start, other scale types are treated as centerInside, while other scale types may be used by animated image types.

Failure image

You can set a local failure image using failureImage attribute, or setFailureImage.

It will displayed using an ImageView when the image network request fails. If not specified, nothing is displayed when the request fails.

Failure image init scale type

You can set the failure image scale type using failureImageInitScaleType attribute, or setFailureImageInitScaleType.

Any value of ImageView.ScaleType is valid. Default value is ImageView.ScaleType.FIT_CENTER. It will be ignored if there is no failure image set.

Tap to retry

When failure image is specified, you can tap the failure image then it will retry automatically. That's the default behavior, you can change it using tapToRetry attribute, or setTapToRetry.

Image load callback

You can handle the image load response by creating a new ImageLoader.Callback and overriding the key callbacks

ImageLoader.Callback myImageLoaderCallback = new ImageLoader.Callback() {
    @Override
    public void onCacheHit(int imageType, File image) {
      // Image was found in the cache
    }

    @Override
    public void onCacheMiss(int imageType, File image) {
      // Image was downloaded from the network
    }

    @Override
    public void onStart() {
      // Image download has started
    }

    @Override
    public void onProgress(int progress) {
      // Image download progress has changed
    }

    @Override
    public void onFinish() {
      // Image download has finished
    }

    @Override
    public void onSuccess(File image) {
      // Image was retrieved successfully (either from cache or network)
    }

    @Override
    public void onFail(Exception error) {
      // Image download failed
    }
}

Then setting it as the image load callback

mBigImageView.setImageLoaderCallback(myImageLoaderCallback);

The onSuccess(File image) is always called after the image was retrieved successfully whether from the cache or the network.

For an example, see ImageLoaderCallbackActivity.java

Cancel image loading

BIV will cancel image loading automatically when detach from window, you can also call cancel to cancel it manually.

You can also call BigImageViewer.imageLoader().cancelAll(); in an appropriate time, e.g. Activity/Fragment's onDestroy callback, to cancel all flying requests, avoiding memory leak.

Full customization

You can get the SSIV instance through the method below:

public SubsamplingScaleImageView getSSIV() {
    return mImageView;
}

Then you can do anything you can imagine about SSIV :)

Note: you should test whether SSIV is null, because the image could be a gif, then it won't be displayed by SSIV.

Custom SSIV support

You can even use your own custom SSIV, by calling biv.setImageViewFactory(), passing in a factory that override createStillImageView, and return your custom SSIV.

Custom Glide components support

You can use your custom Glide's components. If you have customized your Glide's configuration, you are able to apply that configuration to BIV too, to do that you only have to initialize BIV in this way:

BigImageViewer.initialize(GlideCustomImageLoader.with(appContext, CustomComponentModel.class));

Where CustomComponentModel.class is the Glide's model component. That's it!

For more detailed example, please refer to the example project.

Caveats

  • Handle permission when you want to save image into gallery.

  • When you want load local image file, you can create the Uri via Uri.fromFile, but the path will be url encoded, and may cause the image loader fail to load it, consider using Uri.parse("file://" + file.getAbsolutePath()).

  • When using with RecyclerView or ViewPager, the recycled BIV doesn't know it should clear the loaded image or reload the image, so you need manually notify it in some way, see issue 107, and issue 177.

  • Crash on Android 4.x device? You could force gradle to use a specific version of OkHttp (some version earlier than 3.13.0), by adding this block to your module's build.gradle, please note that it should be added at the top level, not inside any other block:

    configurations {
      all {
        resolutionStrategy {
          eachDependency { DependencyResolveDetails details ->
            if (details.requested.group == 'com.squareup.okhttp3' &&
                details.requested.name ==
                'okhttp') {
              // OkHttp drops support before 5.0 since 3.13.0
              details.useVersion '3.12.6'
            }
          }
        }
      }
    }

Why another big image viewer?

There are several big image viewer libraries, PhotoDraweeView, FrescoImageViewer, and Subsampling Scale Image View.

They both support pan and zoom. PhotoDraweeView and FrescoImageViewer both use Fresco to load image, which will cause extremely large memory usage when showing big images. Subsampling Scale Image View uses very little memory, but it can only show local image file.

This library show big image with Subsampling Scale Image View, so it only uses very little memory. And this library support using different image load libraries, so it's full featured!

If you are interested in how does this library work, you can refer to this issue, and Subsampling Scale Image View.

Performance

Memory usage of different libraries:

- PhotoDraweeView FrescoImageViewer BigImageViewer
4135*5134 80MB 80MB 2~20 MB

Todo

  • GlideImageLoader
  • Save image file to gallery
  • Optimize long image showing effect, thanks for razerdp
  • Optimize "double tap to zoom" effect, thanks for razerdp
  • Loading animation
  • Downloading progress
  • Thumbnail support
  • Component to display image list, with memory optimization
  • Fail image
  • Retry when fail
  • PicassoImageLoader, track this issue

Those features are offered by image load libraries, and they should be easy to implement, but I don't have enough time currently. So your contributions are welcome!

When you submit PR, please conform the code style of this project, which is customized from Square Android style.

Comments
  • Image-viewer isn't working for vertical images

    Image-viewer isn't working for vertical images

    I'm using ImageLoaderCallback and calling imageviewer.showImage(Uri uri).

    It's working for all URLs except some. Like this one :

    Code :

            bigImageView.setImageLoaderCallback(new ImageLoader.Callback() {
                @Override
                public void onCacheHit(int imageType, File image) {
                }
    
                @Override
                public void onCacheMiss(int imageType, File image) {
    
                }
    
                @Override
                public void onStart() {
                    Helper.log("start : " + getClass().getName() + url_base);
                }
    
                @Override
                public void onProgress(int progress) {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                        progress_load_bing.setProgress(progress, true);
                    } else {
                        progress_load_bing.setProgress(progress);
                    }
                }
    
                @Override
                public void onFinish() {
                    bigImageView.setVisibility(View.VISIBLE);
                    loadingView.setVisibility(View.INVISIBLE);
                    set_wall.show();
                    show_info.show();
    
                    try {
                        sheet = new InfoSheet(
                                title.split("©")[0],
                                title.split("©")[1],
                                view_link,
                                view_link);
    
                        if (!WallpaperSetter.this.isFinishing())
                            sheet.show(getSupportFragmentManager(), "info_shit");
                    } catch (Exception ignored) {
                    }
                }
    
                @Override
                public void onSuccess(File image) {
                    imageFile = image;
                }
    
                @Override
                public void onFail(Exception error) {
                    Toast.makeText(WallpaperSetter.this, "Error Loading Image", Toast.LENGTH_SHORT).show();
                    error.printStackTrace();
                }
            });
            String bet = BingActivity.getNextImage(url_base, BingActivity.Res.getByOrder(index));
            Helper.log(bet);
            bigImageView.showImage(Uri.parse(bet));
    

    PS: I couldn't get the printing statements executed from onStart

    opened by ExploiTR 11
  • Use with Glide custom ModelLoader

    Use with Glide custom ModelLoader

    Hey, thanks for creating this! It's super helpful for loading big images.

    Unfortunately, I'm not sure if I can use BigImageViewer to load encrypted images. I'm successfully loading encrypted images using Glide with a custom ModelLoader that decrypts the images during Glide's decoding step, but these images are not large enough that I need to use BigImageViewer. In a separate view in my app, I'm displaying images that can be quite large, so I'm hoping to use BigImageViewer to display them. All images in my app must be encrypted on disk.

    Is it possible to use BigImageViewer with a GlideImageLoader that uses a custom ModelLoader? If not, could you think of any other way I could decrypt image files while presenting them using BigImageViewer?

    opened by jordaneckhardt 11
  • Add Glide custom component support

    Add Glide custom component support

    This PR adds a new kind of GlideImageLoader class called GlideCustomImageLoader which allow the consumer of the lib to specify a concrete GlideModule associated with a previously registered glide component. That way, the lib is able to load resources as the client specifies, in the example added we request an specific image size by appending two parameters at the end of url.

    Regarding implementation, I've opted to make a new class instead of adding code to the original one (that was my first approach) and messing the code, hope it's the less invasive as possible.

    opened by SmasSive 10
  • New logo/icon proposal

    New logo/icon proposal

    Good day Sir I am a graphic designer and i am interested in designing a logo for your good project. I will be doing it as a gift for free. I just need your permission first before i begin my design. Hoping for your positive feedback. Thanks

    opened by mansya 10
  •  Binary XML file line #0: Binary XML file line #0: Error inflating class com.github.piasy.biv.view.BigImageView

    Binary XML file line #0: Binary XML file line #0: Error inflating class com.github.piasy.biv.view.BigImageView

    Getting issue android.view.InflateException: Binary XML file line #0: Binary XML file line #0: Error inflating class com.github.piasy.biv.view.BigImageView when using it

    Try creating sample app

    and use maven { url "http://dl.bintray.com/piasy/maven" } compile 'com.github.piasy:GlideImageLoader:1.4.6' compile 'com.github.piasy:BigImageViewer:1.4.6' compile 'com.github.piasy:ProgressPieIndicator:1.4.6'

    `<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="android.hackernewsak.com.myapplication.MainActivity">

    <com.github.piasy.biv.view.BigImageView xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/mBigImage"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        app:optimizeDisplay="false"
        app:failureImageInitScaleType="center" />
    

    </android.support.constraint.ConstraintLayout>`

    BigImageViewer.initialize(GlideImageLoader.with(getContext())); BigImageView bigImageView = view.findViewById(R.id.mBigImage); bigImageView.setProgressIndicator(new ProgressPieIndicator()); bigImageView.showImage( Uri.parse("sone url"));

    opened by amodkanthe 10
  • Disable tap to retry fail image

    Disable tap to retry fail image

    I am using setOnClickListener on BigImageView. It will trigger click listener fine if I load image from local but if I load online image and it fails to load, then click listener is not working because it is actually trying to load the image again instead of triggering click listener.

    When I walk through the code, I think this line is causing problem. For normal use case it is fine but I think there must an option to disable retry on image click so that user can listen to it.

    Or If I am wrong then guide me how to implement onclick for failure image use case.

    Currently I achieved this by ImageLoader.Callback and override onFail function.

    opened by thakkaryash94 10
  • fix memory leak

    fix memory leak

    GlideProgressSupport.DispatchingProgressListener.LISTENERS静态变量,即使调用forget方法,还是会导致承载BigImageView的activity不能释放,造成内存泄漏. 我是用eventbus来解决的,如下:

    https://github.com/hss01248/ImageLoader/blob/master/image/src/main/java/com/github/piasy/biv/view/BigImageView.java https://github.com/hss01248/ImageLoader/blob/master/glideloader/src/main/java/com/hss01248/glideloader/big/GlideProgressSupport.java

    用jdk里的订阅者也可以,就是有点繁琐.

    bug 
    opened by hss01248 10
  • Method saveImageIntoGallery() generate = 10.">

    Method saveImageIntoGallery() generate ".0" as file extension on Android >= 10.

    I try to use saveImageIntoGallery() to save an image to the device's gallery, it works fine on android < 10 with a timestamp as a filename and correct extension. However, when I try on a device with android >= 10, the filename was not the timestamp anymore and the extension will be ".0" which I think came from the filename on the cache.

    This problem occurred on Samsung and OPPO devices, but not on the Pixel emulators(because it appends .jpg to the saved filename)

    opened by SongpolR 9
  • Unable to use the library with minSdkVersion <17

    Unable to use the library with minSdkVersion <17

    implementation "com.github.piasy:GlideImageLoader:1.6.7"
    

    with minSdkVersion <17 gives

    Manifest merger failed : uses-sdk:minSdkVersion 16 cannot be smaller than version 17 declared in library [pl.droidsonroids.gif:android-gif-drawable:1.2.20]

    by the way, how did you even fit the minSdk 17 library into minSdk14 library? interesting.

    opened by tom5079 9
  • shared animation works and test, fixed warnings and test app

    shared animation works and test, fixed warnings and test app

    Hi, this is the work I did to make BigImageViewer better support shared transition animations, this is all working and tested, but this is only a starting point.

    The problem, as described in #98, is that while the animation is running between two activities, the View switches the thumbnailView and the SSIV, causing stutters, or black frames, or an animation that does not run at all.

    My suggestion is to have an additional parameter to only show the thumbnail for the transition and delay the main image loading, so we can trigger it later using listeners.

    I've made those modifications, and a test environment, using two activities and it does work, while not breaking the others activities in the sample app.

    I've added another listener for testing purposes, tell me if you want to keep it or not.

    While working with the sample app, I reduced the number of warnings, moving harcoded strings in resources and other stuff, hope you don't mind. Bumped okhttp to the next minor too.

    What do you think? would you do it in a different way?

    Good night for now.

    opened by KirkBushman 9
  • Lost OkHttpImagePipeline

    Lost OkHttpImagePipeline

    In my app I use OkHttpImagePipeline instead of standard one, but BigImageViewer breaks this configuration and returns everything to default. How to prevent it?

    UPD: I noticed, that I can set my configuration into BigImageViewer initialization, but I don't understand, why do you repeat Fresco initialization again inside FrescoImageLoader...

    opened by ghost 9
  • Choose MIME type for saving image?

    Choose MIME type for saving image?

    I came on here as my app was crashing on Android 11 due to the jpg/jpeg issue, but am I right in saying that ALL images are saved as jpeg? My app serves up images as either webp or animated gif images so would be good if I was able to save in these formats, either by auto-checking the filename, or forcefully choosing the mime type in the code.

    Possible?

    Thanks.

    opened by DaveMurchison83 5
  • ProgressPieIndicator still requires com.android.support

    ProgressPieIndicator still requires com.android.support

    I can see that the library has migrated to AndroidX, which is great. However, when we turned off Jetifier, we found out that one of the dependencies of ProgressPieIndicator still depends on the old support libraries, namely com.github.filippudak.progresspieview:library. I have forked the project and pulled PR https://github.com/FilipPudak/ProgressPieView/pull/18. Unfortunately, the project looks dead, so, maybe it is better to create new maven artifact from my fork.

    opened by OIvaschenko-BD 1
  • Ability to load a new url on failure

    Ability to load a new url on failure

    App crashes when we try to load a new image URL on failure callback:

    You can't start or clear loads in RequestListener or Target callbacks. If you're trying to start a fallback request when a load fails, use RequestBuilder#error(RequestBuilder). Otherwise consider posting your into() or clear() calls to the main thread using a Handler instead.

    opened by vipulasri 0
  • Load images from POST request.

    Load images from POST request.

    Is it possible to load images with POST request instead of GET. I can not find anything to pass custom request object other than Uri.parse.

    BigImageView bigImageView = (BigImageView) findViewById(R.id.mBigImage); bigImageView.showImage(Uri.parse(url));

    opened by Abdul-Moiz 1
Owner
Piasy
NEVER STOP
Piasy
Slider-Gallery-Zoom: image slider for android supporting indicator and auto scroll with clicking on image

image slider supporting indicator and auto scroll with clicking on image to open full screen image slider swipe and pinch zoom gestures like gallery,just pass your images and the position of the current image.

Mahmoud Elian 3 May 28, 2022
Android ImageView widget with zoom and pan capabilities

ImageViewTouch for Android ImageViewTouch is an android ImageView widget with zoom and pan capabilities. This is an implementation of the ImageView wi

Alessandro Crugnola 1.9k Jan 4, 2023
Implements pinch-zoom, rotate, pan as an ImageView for Android 2.1+

GestureImageView This is a simple Android View class which provides basic pinch and zoom capability for images. Can be used as a replacement for a sta

Jason 1.1k Nov 10, 2022
A photoView to scale image and finish activity,高仿微信可拖拽返回PhotoView

DragPhotoView(English) 高仿微信可拖拽返回PhotoView 基于 PhotoView ##下载APK体验 特性 拖拽缩放图片,并且结束Activity 其他PhotoView所有特性如下: Out of the box zooming, using multi-touch a

androidwing 1.6k Dec 5, 2022
Android View widget for displaying GIF animations.

gif-movie-view Android View widget for displaying GIF animations. To show animated GIF in your application just add GifMovieView into your layout.

Sergey Bakhtiarov 459 Nov 10, 2022
Android library (AAR). Highly configurable, easily extendable deep zoom view for displaying huge images without loss of detail. Perfect for photo galleries, maps, building plans etc.

Subsampling Scale Image View A custom image view for Android, designed for photo galleries and displaying huge images (e.g. maps and building plans) w

null 7.4k Jan 8, 2023
Android ImageView that handles animated GIF images

GifImageView Android ImageView that handles Animated GIF images Usage In your build.gradle file: dependencies { compile 'com.felipecsl:gifimageview:

Felipe Lima 1.1k Mar 9, 2021
An awesome photo album viewer.

An awesome photo album viewer.

null 15 Jun 13, 2022
Mobile development Exercise Simple photo viewer

Mobile development Simple Photo viewer Exercise A simple photo viewer based on Udacitys example app "dice roller"." Mobile development Exercise Simple

null 0 Oct 16, 2021
Tutorial Double Tap Pinch to Zoom with kotlin

Double-Tap-Pinch-Zoom Tutorial Double Tap Pinch to Zoom Tutorial Build with Andr

Azhar Rivaldi 6 Apr 13, 2022
PinchToZoom - Pinch to zoom used within list like Instagram

Pinch To Zoom ?? Description Pinch to Zoom with Pan Gestures like Instagram ?? Motivation and Context Big Thanks ???? to the guy and his amazing repo

Vivek Sharma 12 Apr 12, 2022
Android ImageView replacement which allows image loading from URLs or contact address book, with caching

Smart Image View for Android SmartImageView is a drop-in replacement for Android’s standard ImageView which additionally allows images to be loaded fr

James Smith 1.3k Dec 24, 2022
RasmView - an Android drawing view; it provides a view that allows users to draw on top of a bitmap.

RasmView RasmView is an Android drawing library; it provides a view that allows users to draw on top of a bitmap. Demo https://www.youtube.com/watch?v

Raed Mughaus 39 Dec 23, 2022
Flickable ImageView for Android. It's like a view of twitter's detail image.

FlickableView Flickable ImageView for Android. It's like a view of twitter's detail image. It's possible that other views animate with FlickableView.

goka 153 Nov 14, 2022
Image Picker with Customizable UI for Android, Pick an image from Gallery

Image Picker A Image Picker Library for Android (Supports Android 12) with fully

null 2 May 29, 2022
Custom view for circular images in Android while maintaining the best draw performance

CircularImageView Custom view for circular images in Android while maintaining the best draw performance Usage To make a circular ImageView, add this

Pkmmte Xeleon 1.2k Dec 28, 2022
Apply custom effects on view backgrounds

View Filters At the beginning the only purpose was to blur all layers below. Now you can do more : Blur background views easily Create custom filters

Mad Mirrajabi 180 Nov 25, 2022
Android widget for cropping and rotating an image.

Cropper The Cropper is an image cropping tool. It provides a way to set an image in XML and programmatically, and displays a resizable crop window on

Edmodo 2.9k Nov 14, 2022
Add curve at bottom of image views and relative layouts.

Crescento Android library that adds a curve at the below of image views and relative layouts. CrescentoImageView and CrescentoContainer are the image

Shivam Satija 1.3k Nov 18, 2022