├── .gitignore ├── .idea ├── .name ├── codeStyles │ └── codeStyleConfig.xml └── vcs.xml ├── Jenkinsfile ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── pereira │ │ └── agnaldo │ │ └── previewimgcol │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── pereira │ │ │ └── agnaldo │ │ │ └── previewimgcol │ │ │ └── MainActivity.kt │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── ic_launcher_background.xml │ │ ├── landscape_01.jpg │ │ ├── landscape_02.jpg │ │ ├── landscape_03.jpg │ │ ├── landscape_04.jpg │ │ ├── landscape_05.jpg │ │ ├── landscape_06.jpg │ │ ├── landscape_07.jpg │ │ └── landscape_08.jpg │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── pereira │ └── agnaldo │ └── previewimgcol │ └── ExampleUnitTest.kt ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── previewimgcol ├── .gitignore ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── pereira │ │ └── agnaldo │ │ └── previewimgcol │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── pereira │ │ │ └── agnaldo │ │ │ └── previewimgcol │ │ │ ├── Blur.kt │ │ │ ├── GlideListener.kt │ │ │ ├── ImageCollectionView.kt │ │ │ └── PreviewImage.kt │ └── res │ │ ├── drawable │ │ └── blur.png │ │ └── values │ │ ├── attrs.xml │ │ ├── boolean.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── integer.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── pereira │ └── agnaldo │ └── previewimgcol │ └── ExampleUnitTest.kt ├── screenshot ├── sample.gif └── screenshot.png └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | .idea/codeStyles/Project.xml 16 | .idea/gradle.xml 17 | .idea/jarRepositories.xml 18 | .idea/runConfigurations.xml 19 | .idea/ 20 | .idea/* 21 | .idea/*.* 22 | .idea/compiler.xml 23 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | Preview Images Collections -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Jenkinsfile: -------------------------------------------------------------------------------- 1 | stage 'Checkout' 2 | node('slave') { 3 | deleteDir() 4 | checkout scm 5 | } 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Preview Image Collection 2 | 3 | ## Introduction 4 | *Preview Image Collection* is a library to draw a collage with a number of images like facebook preview album 5 | 6 | ![Screenshot](https://github.com/AgnaldoNP/PreviewImageCollection/blob/master/screenshot/screenshot.png?raw=true) 7 | ![GIF](https://github.com/AgnaldoNP/PreviewImageCollection/blob/master/screenshot/sample.gif?raw=true) 8 | 9 | ## Install 10 | 11 | **Step 1**. Add the JitPack repository to your build file 12 | Add it in your root build.gradle at the end of repositories: 13 | ``` 14 | allprojects { 15 | repositories { 16 | ... 17 | maven { url 'https://jitpack.io' } 18 | } 19 | } 20 | ``` 21 | 22 | If you are using newest versions of gradle this config should be done on settings.gradle 23 | ``` 24 | dependencyResolutionManagement { 25 | repositories { 26 | ... 27 | maven { url 'https://jitpack.io' } 28 | } 29 | } 30 | ``` 31 | 32 | **Step 2.** Add the dependency 33 | ``` 34 | dependencies { 35 | implementation 'com.github.AgnaldoNP:PreviewImageCollection:2.3' 36 | } 37 | ``` 38 | [![](https://jitpack.io/v/AgnaldoNP/PreviewImageCollection.svg)](https://jitpack.io/#AgnaldoNP/PreviewImageCollection) 39 | 40 | ## Usage 41 | 42 | Sample of usage 43 | ```xml 44 | 56 | 57 | ``` 58 | 59 | ### Options 60 | 61 | | Property | Value type | Default | 62 | |-----------------------------|-------------------|-------------| 63 | | backgroundColor | color | #FFFFFF | 64 | | baseRowHeight | dimension | 150dp | 65 | | imageMargin | dimension | 1dp | 66 | | pinchToZoom | boolean | true | 67 | | showExternalBorderMargins | boolean | true | 68 | | maxImagePerRow | integer | 3 | 69 | | maxRows | integer | 3 | 70 | | previewImageScaleType | enum | center_crop | 71 | | previewDistributeEvenly | boolean | false | 72 | | previewCornerRadius | dimension | 0dp | 73 | 74 | > On Version 2.0 `imageScaleType` was changed to `previewImageScaleType` 75 | 76 | ### Programmatically 77 | ```kotlin 78 | var collectionView = findViewById(R.id.imageCollectionView) 79 | 80 | collectionView.maxRows = ImageCollectionView.NO_ROW_LIMITS 81 | collectionView.maxRows = 10 82 | 83 | collectionView.maxImagePerRow =3 84 | 85 | collectionView.imageMargin = 10 86 | 87 | collectionView.baseImageHeight = 150 88 | 89 | collectionView.mBackgroundColor = Color.WHITE 90 | 91 | collectionView.pinchToZoom = true 92 | 93 | collectionView.showExternalBorderMargins = true 94 | 95 | val bitmap = ... 96 | collectionView.addImage(bitmap) 97 | 98 | val bitmap2 = ... 99 | collectionView.addImage(bitmap2, object : ImageCollectionView.OnImageClickListener { 100 | override fun onClick(bitmap: Bitmap, imageView: ImageView) { 101 | Toast.makeText(imageView.context, "Test Click on image ...", Toast.LENGTH_LONG).show() 102 | } 103 | }) 104 | // or simply 105 | collectionView.addImage(bitmap2, { bitmap: Bitmap?, imageView: ImageView? -> 106 | Toast.makeText(context, "Test Click on image ...", Toast.LENGTH_LONG).show() 107 | }) 108 | 109 | collectionView.setOnMoreClicked(object : ImageCollectionView.OnMoreClickListener { 110 | override fun onMoreClicked(bitmaps: List) { 111 | Toast.makeText(collectionView.context, "on more clicked ", Toast.LENGTH_LONG).show() 112 | } 113 | }) 114 | // or simply 115 | collectionView.setOnMoreClicked { bitmaps -> 116 | Toast.makeText(collectionView.context, "on more clicked ", Toast.LENGTH_LONG).show() 117 | } 118 | ``` 119 | 120 | ```java 121 | ImageCollectionView collectionView = (ImageCollectionView) findViewById(R.id.imageCollectionView); 122 | 123 | Bitmap bitmap = ...; 124 | imageCollectionView.addImage(bitmap); 125 | 126 | Bitmap bitmap2 = ...; 127 | imageCollectionView.addImage(bitmap, (bmp, imageView) -> { 128 | Toast.makeText(context, "Test Click image 08", Toast.LENGTH_LONG).show(); 129 | }); 130 | 131 | imageCollectionView.setOnMoreClicked(bitmaps -> { 132 | Toast.makeText(context, "OnMoreClicked", Toast.LENGTH_LONG).show(); 133 | }); 134 | ``` 135 | 136 | 137 | ## Contributions and Support 138 | 139 | This project made use of [Zoomy](https://github.com/imablanco/Zoomy) by [Álvaro Blanco](https://github.com/imablanco) to enable "pinch to zoom" functionality. 140 | 141 | Contributions are welcome. Create a new pull request in order to submit your fixes and they shall be merged after moderation. In case of any issues, bugs or any suggestions, either create a new issue or post comments in already active relevant issues 142 | 143 | ## Please consider supporting me 144 | ETH Address 145 | * [0xe61d524595D3bCC92DaD9bCC965B87394F9069d8](https://etherscan.io/address/0xe61d524595D3bCC92DaD9bCC965B87394F9069d8) 146 | 147 | -- 148 | 149 | ETH / SHIB / BNB / SLP / IOTX / DODGE (BEP20 or ERC20) 150 | * 0x0d620a663692ac8797c289c5715228c5f19f9f7a 151 | 152 | -- 153 | 154 | DOGE 155 | * (Main net) DQXW3DH2Jwe3zuCAcNAL7xLr1cSx7b7Pmt 156 | * (BEP20) 0x0d620a663692ac8797c289c5715228c5f19f9f7a 157 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | apply plugin: 'kotlin-android' 4 | 5 | apply plugin: 'kotlin-android-extensions' 6 | 7 | android { 8 | compileSdkVersion 31 9 | buildToolsVersion "29.0.2" 10 | defaultConfig { 11 | applicationId "pereira.agnaldo.previewimgcol" 12 | minSdkVersion 21 13 | targetSdkVersion 31 14 | versionCode 7 15 | versionName "1.6" 16 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 17 | 18 | multiDexEnabled true 19 | 20 | javaCompileOptions { 21 | annotationProcessorOptions { 22 | arguments = [ 23 | "androidManifestFile": "$projectDir/src/main/AndroidManifest.xml".toString() 24 | ] 25 | } 26 | } 27 | } 28 | buildTypes { 29 | release { 30 | minifyEnabled false 31 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 32 | } 33 | } 34 | 35 | compileOptions { 36 | encoding "UTF-8" 37 | sourceCompatibility JavaVersion.VERSION_1_8 38 | targetCompatibility JavaVersion.VERSION_1_8 39 | } 40 | 41 | android.compileOptions.sourceCompatibility 1.8 42 | android.compileOptions.targetCompatibility 1.8 43 | 44 | packagingOptions { 45 | exclude 'META-INF/NOTICE.txt' 46 | exclude 'META-INF/LICENSE.txt' 47 | exclude 'META-INF/LICENSE' 48 | exclude 'META-INF/LICENSE-FIREBASE.txt' 49 | exclude 'protobuf.meta' 50 | } 51 | } 52 | 53 | dependencies { 54 | implementation project(":previewimgcol") 55 | 56 | implementation fileTree(dir: 'libs', include: ['*.jar']) 57 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.10" 58 | implementation 'androidx.appcompat:appcompat:1.4.0' 59 | implementation 'androidx.core:core-ktx:1.7.0' 60 | implementation 'androidx.constraintlayout:constraintlayout:2.1.2' 61 | testImplementation 'junit:junit:4.13.2' 62 | androidTestImplementation 'androidx.test.ext:junit:1.1.3' 63 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' 64 | 65 | implementation 'com.github.ivan200:PhotoBarcode:1.1.1' 66 | } 67 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/androidTest/java/pereira/agnaldo/previewimgcol/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package pereira.agnaldo.previewimgcol 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("pereira.agnaldo.previewimgcol", appContext.packageName) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/java/pereira/agnaldo/previewimgcol/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package pereira.agnaldo.previewimgcol 2 | 3 | import android.content.res.Resources 4 | import android.graphics.Bitmap 5 | import android.graphics.BitmapFactory 6 | import android.graphics.Color 7 | import android.os.Bundle 8 | import android.widget.* // ktlint-disable no-wildcard-imports 9 | import android.widget.SeekBar.OnSeekBarChangeListener 10 | import androidx.appcompat.app.AppCompatActivity 11 | import com.ivan200.photobarcodelib.PhotoBarcodeScannerBuilder 12 | import kotlinx.android.synthetic.main.activity_main.view.* 13 | 14 | class MainActivity : AppCompatActivity() { 15 | 16 | private lateinit var collectionView: ImageCollectionView 17 | private lateinit var backgroundColor: SeekBar 18 | private lateinit var baseRowHeight: SeekBar 19 | private lateinit var imageMargin: SeekBar 20 | private lateinit var maxImagePerRow: SeekBar 21 | private lateinit var maxRows: SeekBar 22 | private lateinit var cornerRadius: SeekBar 23 | private lateinit var pinchToZoom: CheckBox 24 | private lateinit var showExternalBoards: CheckBox 25 | private lateinit var distributeEvenly: CheckBox 26 | 27 | private lateinit var addPhoto: Button 28 | private lateinit var clearPhotos: Button 29 | 30 | val Int.dp: Int 31 | get() = (this / Resources.getSystem().displayMetrics.density).toInt() 32 | val Int.px: Int 33 | get() = (this * Resources.getSystem().displayMetrics.density).toInt() 34 | 35 | override fun onCreate(savedInstanceState: Bundle?) { 36 | super.onCreate(savedInstanceState) 37 | setContentView(R.layout.activity_main) 38 | 39 | collectionView = findViewById(R.id.imageCollectionView) 40 | 41 | backgroundColor = findViewById(R.id.color) 42 | baseRowHeight = findViewById(R.id.baseRowHeight) 43 | imageMargin = findViewById(R.id.imageMargin) 44 | maxImagePerRow = findViewById(R.id.maxImagePerRow) 45 | maxRows = findViewById(R.id.maxRows) 46 | cornerRadius = findViewById(R.id.cornerRadius) 47 | pinchToZoom = findViewById(R.id.pinchToZoom) 48 | showExternalBoards = findViewById(R.id.showExternalBorderMargins) 49 | distributeEvenly = findViewById(R.id.distributeEvenly) 50 | addPhoto = findViewById(R.id.add_photo) 51 | clearPhotos = findViewById(R.id.clear_photos) 52 | 53 | backgroundColor.setOnSeekBarChangeListener(object : OnSeekBarChangeListener { 54 | override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { 55 | collectionView.mBackgroundColor = if (progress == 0) Color.TRANSPARENT else 56 | Color.HSVToColor(floatArrayOf(progress.toFloat(), 100f, 100f)) 57 | } 58 | 59 | override fun onStartTrackingTouch(seekBar: SeekBar?) { 60 | } 61 | 62 | override fun onStopTrackingTouch(seekBar: SeekBar?) { 63 | } 64 | }) 65 | 66 | baseRowHeight.setOnSeekBarChangeListener(object : OnSeekBarChangeListener { 67 | override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { 68 | collectionView.baseImageHeight = if (progress <= 2) 120.px else progress.px 69 | } 70 | 71 | override fun onStartTrackingTouch(seekBar: SeekBar?) { 72 | } 73 | 74 | override fun onStopTrackingTouch(seekBar: SeekBar?) { 75 | } 76 | }) 77 | 78 | imageMargin.setOnSeekBarChangeListener(object : OnSeekBarChangeListener { 79 | override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { 80 | collectionView.imageMargin = progress.px 81 | } 82 | 83 | override fun onStartTrackingTouch(seekBar: SeekBar?) { 84 | } 85 | 86 | override fun onStopTrackingTouch(seekBar: SeekBar?) { 87 | } 88 | }) 89 | 90 | maxImagePerRow.setOnSeekBarChangeListener(object : OnSeekBarChangeListener { 91 | override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { 92 | collectionView.maxImagePerRow = if (progress == 0) 3 else progress 93 | } 94 | 95 | override fun onStartTrackingTouch(seekBar: SeekBar?) { 96 | } 97 | 98 | override fun onStopTrackingTouch(seekBar: SeekBar?) { 99 | } 100 | }) 101 | 102 | maxRows.setOnSeekBarChangeListener(object : OnSeekBarChangeListener { 103 | override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { 104 | collectionView.maxRows = 105 | if (progress == 0) ImageCollectionView.NO_ROW_LIMITS else progress 106 | } 107 | 108 | override fun onStartTrackingTouch(seekBar: SeekBar?) { 109 | } 110 | 111 | override fun onStopTrackingTouch(seekBar: SeekBar?) { 112 | } 113 | }) 114 | 115 | cornerRadius.setOnSeekBarChangeListener(object : OnSeekBarChangeListener { 116 | override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { 117 | collectionView.previewCornerRadius = 118 | (collectionView.width * (progress / 100F)).toInt() 119 | } 120 | 121 | override fun onStartTrackingTouch(seekBar: SeekBar?) { 122 | } 123 | 124 | override fun onStopTrackingTouch(seekBar: SeekBar?) { 125 | } 126 | }) 127 | 128 | pinchToZoom.setOnCheckedChangeListener { buttonView, isChecked -> 129 | collectionView.pinchToZoom = isChecked 130 | } 131 | 132 | showExternalBoards.setOnCheckedChangeListener { buttonView, isChecked -> 133 | collectionView.showExternalBorderMargins = isChecked 134 | } 135 | 136 | distributeEvenly.setOnCheckedChangeListener { buttonView, isChecked -> 137 | collectionView.previewDistributeEvenly = isChecked 138 | } 139 | 140 | addPhoto.setOnClickListener { 141 | PhotoBarcodeScannerBuilder() 142 | .withActivity(this) 143 | .withTakingPictureMode() 144 | .withAutoFocus(true) 145 | .withFocusOnTap(true) 146 | .withCameraLockRotate(false) 147 | .withThumbnails(false) 148 | .withCameraTryFixOrientation(true) 149 | .withImageLargerSide(1200) 150 | .withPictureListener { file -> 151 | if (file.exists()) { 152 | val bitmap = BitmapFactory.decodeFile(file.absolutePath) 153 | collectionView.addImage(bitmap) 154 | file.delete() 155 | } 156 | }.build().start() 157 | } 158 | 159 | clearPhotos.setOnClickListener { 160 | collectionView.clearImages() 161 | } 162 | 163 | collectionView.addImage( 164 | BitmapFactory.decodeResource(resources, R.drawable.landscape_08), 165 | object : ImageCollectionView.OnImageClickListener { 166 | override fun onClick(bitmap: Bitmap, imageView: ImageView) { 167 | Toast.makeText(imageView.context, "Test Click image 08", Toast.LENGTH_LONG) 168 | .show() 169 | } 170 | } 171 | ) 172 | collectionView.addImage( 173 | BitmapFactory.decodeResource(resources, R.drawable.landscape_01), 174 | object : ImageCollectionView.OnImageLongClickListener { 175 | override fun onLongClick(bitmap: Bitmap, imageView: ImageView) { 176 | Toast.makeText(imageView.context, "Long Click", Toast.LENGTH_LONG) 177 | .show() 178 | } 179 | } 180 | ) 181 | collectionView.addImageK( 182 | R.drawable.landscape_02, 183 | { bitmap: Bitmap?, imageView: ImageView? -> 184 | Toast.makeText(this, "landscape_02", Toast.LENGTH_LONG).show() 185 | } 186 | ) 187 | 188 | collectionView.addImage(BitmapFactory.decodeResource(resources, R.drawable.landscape_05)) 189 | 190 | collectionView.addImage(BitmapFactory.decodeResource(resources, R.drawable.landscape_03)) 191 | collectionView.addImage(BitmapFactory.decodeResource(resources, R.drawable.landscape_04)) 192 | collectionView.addImage(BitmapFactory.decodeResource(resources, R.drawable.landscape_06)) 193 | collectionView.addImage(BitmapFactory.decodeResource(resources, R.drawable.landscape_07)) 194 | collectionView.addImage( 195 | "https://d1dwhi9yny5dep.cloudfront.net/cm_live/c4d403788761d42233b6675.desktop-gallery-large.jpg", 196 | R.drawable.blur 197 | ) 198 | collectionView.addImage( 199 | "https://d1dwhi9yny5dep.cloudfront.net/cm_live/80f4beb96361d422359321c.desktop-gallery-large.jpg", 200 | R.drawable.blur 201 | ) 202 | 203 | collectionView.setOnMoreClicked(object : ImageCollectionView.OnMoreClickListener { 204 | override fun onMoreClicked(bitmaps: List) { 205 | Toast.makeText(collectionView.context, "oi oi oi oi ", Toast.LENGTH_LONG) 206 | .show() 207 | } 208 | }) 209 | 210 | collectionView.setOnMoreClicked { bitmaps -> } 211 | } 212 | } 213 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/landscape_01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AgnaldoNP/PreviewImageCollection/d84d459e70d70e2ed58bf67f1a57d1571fc66184/app/src/main/res/drawable/landscape_01.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable/landscape_02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AgnaldoNP/PreviewImageCollection/d84d459e70d70e2ed58bf67f1a57d1571fc66184/app/src/main/res/drawable/landscape_02.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable/landscape_03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AgnaldoNP/PreviewImageCollection/d84d459e70d70e2ed58bf67f1a57d1571fc66184/app/src/main/res/drawable/landscape_03.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable/landscape_04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AgnaldoNP/PreviewImageCollection/d84d459e70d70e2ed58bf67f1a57d1571fc66184/app/src/main/res/drawable/landscape_04.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable/landscape_05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AgnaldoNP/PreviewImageCollection/d84d459e70d70e2ed58bf67f1a57d1571fc66184/app/src/main/res/drawable/landscape_05.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable/landscape_06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AgnaldoNP/PreviewImageCollection/d84d459e70d70e2ed58bf67f1a57d1571fc66184/app/src/main/res/drawable/landscape_06.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable/landscape_07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AgnaldoNP/PreviewImageCollection/d84d459e70d70e2ed58bf67f1a57d1571fc66184/app/src/main/res/drawable/landscape_07.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable/landscape_08.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AgnaldoNP/PreviewImageCollection/d84d459e70d70e2ed58bf67f1a57d1571fc66184/app/src/main/res/drawable/landscape_08.jpg -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 17 | 18 | 25 | 26 | 32 | 33 | 40 | 41 | 42 | 49 | 50 | 55 | 56 | 63 | 64 | 65 | 72 | 73 | 78 | 79 | 86 | 87 | 88 | 96 | 97 | 102 | 103 | 110 | 111 | 112 | 120 | 121 | 126 | 127 | 134 | 135 | 136 | 144 | 145 | 150 | 151 | 158 | 159 | 160 | 167 | 168 | 175 | 176 | 183 | 184 |