Skip to content

Commit 0da9c7a

Browse files
committed
Add delayed view size calculation
1 parent 9f0a1fe commit 0da9c7a

File tree

3 files changed

+65
-6
lines changed

3 files changed

+65
-6
lines changed

imageloader/src/main/java/com/tomclaw/imageloader/core/ImageLoader.kt

+14-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class ImageLoaderImpl(
3131
uriString: String,
3232
handlers: Handlers<T>
3333
) {
34-
val size = view.getSize()
34+
val size = view.optSize() ?: run { waitSizeAsync(view, uriString, handlers); return }
3535
val key = generateKey(uriString, size.width, size.height)
3636
val prevTag = view.tag
3737
view.tag = key
@@ -55,6 +55,19 @@ class ImageLoaderImpl(
5555
?: loadAsync(view, size, uriString, key, handlers)
5656
}
5757

58+
private fun <T> waitSizeAsync(
59+
view: ViewHolder<T>,
60+
uriString: String,
61+
handlers: Handlers<T>
62+
) {
63+
backgroundExecutor.submit {
64+
view.getSize()
65+
mainExecutor.execute {
66+
load(view, uriString, handlers)
67+
}
68+
}
69+
}
70+
5871
private fun <T> loadAsync(
5972
view: ViewHolder<T>,
6073
size: ViewSize,

imageloader/src/main/java/com/tomclaw/imageloader/core/ViewHolder.kt

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package com.tomclaw.imageloader.core
22

33
interface ViewHolder<T> {
44

5+
fun optSize(): ViewSize?
6+
57
fun getSize(): ViewSize
68

79
var tag: Any?

imageloader/src/main/java/com/tomclaw/imageloader/util/ImageViewHolder.kt

+49-5
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,61 @@
11
package com.tomclaw.imageloader.util
22

3+
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
4+
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
5+
import android.view.ViewTreeObserver
36
import android.widget.ImageView
47
import com.tomclaw.imageloader.core.ViewHolder
58
import com.tomclaw.imageloader.core.ViewSize
9+
import java.util.concurrent.CountDownLatch
610

711
class ImageViewHolder(private val imageView: ImageView) : ViewHolder<ImageView> {
812

913
override fun getSize(): ViewSize {
10-
val w = imageView.measuredWidth.takeIf { it > 0 }
11-
?: imageView.resources.displayMetrics.widthPixels
12-
val h = imageView.measuredHeight.takeIf { it > 0 }
13-
?: imageView.resources.displayMetrics.heightPixels
14-
return ViewSize(w, h)
14+
optSize()?.let { return it }
15+
16+
var viewSize = ViewSize(0, 0)
17+
val latch = CountDownLatch(1)
18+
19+
val viewTreeObserver = imageView.viewTreeObserver
20+
val preDrawListener = object : ViewTreeObserver.OnPreDrawListener {
21+
private var isResumed = false
22+
23+
override fun onPreDraw(): Boolean {
24+
val size = optSize()
25+
if (size != null) {
26+
viewSize = size
27+
viewTreeObserver.removeOnPreDrawListener(this)
28+
29+
if (!isResumed) {
30+
isResumed = true
31+
latch.countDown()
32+
}
33+
}
34+
return true
35+
}
36+
}
37+
viewTreeObserver.addOnPreDrawListener(preDrawListener)
38+
39+
latch.await()
40+
return viewSize
41+
}
42+
43+
override fun optSize(): ViewSize? {
44+
val width = (
45+
imageView.layoutParams?.width?.takeIf { it > 0 }
46+
?: imageView.width.takeIf { it > 0 }
47+
?: MATCH_PARENT
48+
)
49+
.takeIf { it != WRAP_CONTENT }
50+
?: imageView.context.resources.displayMetrics.widthPixels
51+
val height = (
52+
imageView.layoutParams?.height?.takeIf { it > 0 }
53+
?: imageView.height.takeIf { it > 0 }
54+
?: MATCH_PARENT
55+
)
56+
.takeIf { it != WRAP_CONTENT }
57+
?: imageView.context.resources.displayMetrics.heightPixels
58+
return ViewSize(width, height).takeIf { width > 0 && height > 0 }
1559
}
1660

1761
override var tag: Any?

0 commit comments

Comments
 (0)