Skip to content

Commit 0ac0311

Browse files
authored
Merge pull request #2 from nos-digital/bugfix/scrolling-boundries
Bugfix/scrolling boundries
2 parents e5dbea8 + 641843c commit 0ac0311

File tree

18 files changed

+207
-162
lines changed

18 files changed

+207
-162
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ buildscript {
88

99
}
1010
dependencies {
11-
classpath 'com.android.tools.build:gradle:3.5.1'
11+
classpath 'com.android.tools.build:gradle:3.6.2'
1212
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
1313
// NOTE: Do not place your application dependencies here; they belong
1414
// in the individual module build.gradle files

example/build.gradle

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ android {
1212
targetSdkVersion 28
1313
versionCode 1
1414
versionName "1.0"
15-
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
15+
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
1616
}
1717
buildTypes {
1818
release {
@@ -25,9 +25,10 @@ android {
2525
dependencies {
2626
implementation fileTree(dir: 'libs', include: ['*.jar'])
2727
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
28-
implementation 'com.android.support:appcompat-v7:28.0.0'
29-
implementation 'com.android.support:recyclerview-v7:28.0.0'
30-
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
28+
implementation 'androidx.appcompat:appcompat:1.1.0'
29+
implementation 'androidx.recyclerview:recyclerview:1.1.0'
30+
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
31+
implementation 'androidx.viewpager2:viewpager2:1.0.0'
3132

3233
implementation project(path: ':library')
3334
}

example/src/main/java/nl/nos/imagin/example/SwipableViewPager.kt

Lines changed: 0 additions & 34 deletions
This file was deleted.
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package nl.nos.imagin.example.data
22

3+
import android.os.Parcelable
4+
import kotlinx.android.parcel.Parcelize
5+
6+
@Parcelize
37
data class Picture(
48
val name: String,
59
val fileName: String
6-
)
10+
) : Parcelable
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package nl.nos.imagin.example.gallery
2+
3+
import androidx.fragment.app.Fragment
4+
import androidx.fragment.app.FragmentActivity
5+
import androidx.viewpager2.adapter.FragmentStateAdapter
6+
7+
class FragmentPagerAdapter(fa: FragmentActivity,
8+
private val fragmentList: List<Fragment>
9+
) : FragmentStateAdapter(fa) {
10+
11+
override fun getItemCount(): Int {
12+
return fragmentList.size
13+
}
14+
15+
override fun createFragment(position: Int): Fragment {
16+
return fragmentList[position]
17+
}
18+
}

example/src/main/java/nl/nos/imagin/example/gallery/GalleryActivity.kt

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,19 @@ package nl.nos.imagin.example.gallery
33
import android.content.Context
44
import android.content.Intent
55
import android.os.Bundle
6-
import android.support.v4.app.SharedElementCallback
7-
import android.support.v7.app.AppCompatActivity
6+
import androidx.core.app.SharedElementCallback
7+
import androidx.appcompat.app.AppCompatActivity
88
import android.view.View
99
import android.view.animation.DecelerateInterpolator
1010
import android.widget.ImageView
11+
import androidx.fragment.app.Fragment
12+
import androidx.viewpager2.widget.ViewPager2
1113
import kotlinx.android.synthetic.main.activity_gallery.*
12-
import nl.nos.imagin.example.R
1314
import nl.nos.imagin.example.data.Repository
15+
import nl.nos.imagin.example.R
1416

15-
class GalleryActivity : AppCompatActivity(), GalleryPagerAdapter.OnSwipedToCloseListener {
16-
17+
class GalleryActivity : AppCompatActivity() {
1718
private val repository = Repository()
18-
private val adapter = GalleryPagerAdapter().apply {
19-
onSwipedToCloseListener = this@GalleryActivity
20-
}
2119
private val position by lazy { intent.getIntExtra(EXTRA_POSITION, -1) }
2220

2321
override fun onCreate(savedInstanceState: Bundle?) {
@@ -28,14 +26,7 @@ class GalleryActivity : AppCompatActivity(), GalleryPagerAdapter.OnSwipedToClose
2826
window.sharedElementEnterTransition.interpolator = DecelerateInterpolator(3f)
2927
supportPostponeEnterTransition()
3028

31-
adapter.pictures.addAll(repository.getPictures())
32-
33-
view_pager.adapter = adapter
34-
view_pager.setCurrentItem(position, false)
35-
36-
view_pager.post {
37-
supportStartPostponedEnterTransition()
38-
}
29+
setupViewPager()
3930

4031
// Map the shared element transition for when the page has changed.
4132
setEnterSharedElementCallback(object : SharedElementCallback() {
@@ -58,8 +49,23 @@ class GalleryActivity : AppCompatActivity(), GalleryPagerAdapter.OnSwipedToClose
5849
})
5950
}
6051

61-
override fun onSwipeToClose() {
62-
finishAfterTransition()
52+
private fun setupViewPager() {
53+
val fragments = mutableListOf<Fragment>()
54+
55+
repository.getPictures().forEach {
56+
fragments.add(GalleryImageFragment.newInstance(it))
57+
}
58+
59+
view_pager?.apply {
60+
adapter = FragmentPagerAdapter(
61+
this@GalleryActivity,
62+
fragments
63+
)
64+
orientation = ViewPager2.ORIENTATION_HORIZONTAL
65+
setCurrentItem(position, false)
66+
67+
post { supportStartPostponedEnterTransition() }
68+
}
6369
}
6470

6571
companion object {
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package nl.nos.imagin.example.gallery
2+
3+
import android.content.Context
4+
import android.graphics.Rect
5+
import android.os.Bundle
6+
import android.util.DisplayMetrics
7+
import android.view.LayoutInflater
8+
import android.view.View
9+
import android.view.ViewGroup
10+
import android.view.WindowManager
11+
import android.widget.Toast
12+
import androidx.fragment.app.Fragment
13+
import kotlinx.android.synthetic.main.gallery_item.*
14+
import nl.nos.imagin.Imagin
15+
import nl.nos.imagin.SingleTapHandler
16+
import nl.nos.imagin.example.AssetLoader
17+
import nl.nos.imagin.example.R
18+
import nl.nos.imagin.example.data.Picture
19+
20+
class GalleryImageFragment : Fragment(), SingleTapHandler.OnSingleTapListener {
21+
private var tapListener: SingleTapHandler.OnSingleTapListener? = null
22+
private val assetLoader = AssetLoader()
23+
24+
override fun onAttach(context: Context) {
25+
super.onAttach(context)
26+
27+
if (context is SingleTapHandler.OnSingleTapListener) {
28+
tapListener = context
29+
}
30+
}
31+
32+
override fun onCreateView(
33+
inflater: LayoutInflater,
34+
container: ViewGroup?,
35+
savedInstanceState: Bundle?
36+
): View = inflater.inflate(R.layout.gallery_item, container, false)
37+
38+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
39+
super.onViewCreated(view, savedInstanceState)
40+
41+
val data = arguments?.getParcelable(IMAGE_DATA) as? Picture ?: return
42+
43+
loadImage(data)
44+
}
45+
46+
private fun loadImage(picture: Picture) {
47+
image_view.setImageDrawable(
48+
assetLoader.createDrawableFromAsset(
49+
image_view.resources,
50+
picture.fileName
51+
)
52+
)
53+
54+
enableImageZoomControls(picture)
55+
}
56+
57+
private fun enableImageZoomControls(picture: Picture) {
58+
view?.let {
59+
Imagin.with(it, image_view)
60+
.enableDoubleTapToZoom()
61+
.enablePinchToZoom()
62+
.enableSingleTap(object : SingleTapHandler.OnSingleTapListener {
63+
override fun onSingleTap() {
64+
Toast.makeText(image_view.context, picture.name, Toast.LENGTH_SHORT).show()
65+
}
66+
})
67+
.enableScroll(
68+
allowScrollOutOfBoundsHorizontally = false,
69+
allowScrollOutOfBoundsVertically = true,
70+
scrollDistanceToCloseInPx = getScreenHeight(image_view.context) / 5
71+
) {
72+
activity?.finishAfterTransition()
73+
}
74+
75+
image_view.transitionName = picture.name
76+
image_view.tag = picture.name
77+
}
78+
}
79+
80+
private fun getScreenHeight(context: Context): Int {
81+
val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
82+
val display = windowManager.defaultDisplay
83+
val displayMetrics = DisplayMetrics()
84+
85+
display.getMetrics(displayMetrics)
86+
return Rect(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels).height()
87+
}
88+
89+
override fun onSingleTap() {
90+
tapListener?.onSingleTap()
91+
}
92+
93+
companion object {
94+
const val IMAGE_DATA= "IMAGE_DATA"
95+
96+
fun newInstance(image: Picture?): Fragment {
97+
val args = Bundle()
98+
args.putParcelable(IMAGE_DATA, image)
99+
val imageFragment =
100+
GalleryImageFragment()
101+
imageFragment.arguments = args
102+
return imageFragment
103+
}
104+
}
105+
}

example/src/main/java/nl/nos/imagin/example/gallery/GalleryPagerAdapter.kt

Lines changed: 0 additions & 86 deletions
This file was deleted.

example/src/main/java/nl/nos/imagin/example/overview/OverviewActivity.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
package nl.nos.imagin.example.overview
22

33
import android.os.Bundle
4-
import android.support.v4.app.ActivityOptionsCompat
5-
import android.support.v4.app.SharedElementCallback
6-
import android.support.v7.app.AppCompatActivity
7-
import android.support.v7.widget.GridLayoutManager
4+
import androidx.core.app.ActivityOptionsCompat
5+
import androidx.core.app.SharedElementCallback
6+
import androidx.appcompat.app.AppCompatActivity
7+
import androidx.recyclerview.widget.GridLayoutManager
88
import android.view.View
99
import kotlinx.android.synthetic.main.activity_overview.*
1010
import nl.nos.imagin.example.data.Picture
1111
import nl.nos.imagin.example.data.Repository
1212
import nl.nos.imagin.example.gallery.GalleryActivity
1313

14-
class OverviewActivity : AppCompatActivity(), OverviewAdapter.OnPictureClickedListener {
14+
class OverviewActivity : AppCompatActivity(),
15+
OverviewAdapter.OnPictureClickedListener {
1516

1617
private val repository = Repository()
1718
private val adapter = OverviewAdapter().apply {

0 commit comments

Comments
 (0)