Skip to content

Commit

Permalink
Merge pull request #16 from sanyuankexie/develop
Browse files Browse the repository at this point in the history
优化代码结构
  • Loading branch information
LukeXeon committed Nov 16, 2019
2 parents 7088ddc + b3ff5af commit 3040c06
Show file tree
Hide file tree
Showing 10 changed files with 179 additions and 145 deletions.
2 changes: 1 addition & 1 deletion core/src/main/java/com/guet/flexbox/build/FrameFactory.kt
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ internal object FrameFactory : WidgetFactory<Row.Builder>(), ThreadFactory {
return
}
var width = if (attrs != null) {
dataBinding.tryGetValue(attrs["width"], Int.MIN_VALUE)
dataBinding.tryGetValue(attrs["borderWidth"], Int.MIN_VALUE)
} else {
Int.MIN_VALUE
}
Expand Down
13 changes: 1 addition & 12 deletions core/src/main/java/com/guet/flexbox/build/WidgetFactory.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import android.graphics.drawable.Drawable
import android.graphics.drawable.GradientDrawable
import android.view.View
import androidx.annotation.CallSuper
import com.bumptech.glide.request.target.Target
import com.facebook.litho.Component
import com.facebook.litho.ComponentContext
import com.facebook.litho.drawable.ComparableColorDrawable
Expand All @@ -24,7 +23,7 @@ internal abstract class WidgetFactory<T : Component.Builder<*>> : Transform {
internal val mappings = Mappings<T>()

init {
numberAttr<Double>("width") { _, _, it ->
numberAttr<Double>("borderWidth") { _, _, it ->
this.widthPx(it.toPx())
}
numberAttr<Double>("height") { _, _, it ->
Expand Down Expand Up @@ -163,18 +162,8 @@ internal abstract class WidgetFactory<T : Component.Builder<*>> : Transform {
if (backgroundELResult is ComparableGradientDrawable) {
backgroundDrawable = backgroundELResult
} else if (backgroundELResult is CharSequence && backgroundELResult.isNotEmpty()) {
var width = dataBinding.tryGetValue(attrs["width"], Target.SIZE_ORIGINAL)
if (width <= 0) {
width = Target.SIZE_ORIGINAL
}
var height = dataBinding.tryGetValue(attrs["height"], Target.SIZE_ORIGINAL)
if (height <= 0) {
height = Target.SIZE_ORIGINAL
}
backgroundDrawable = NetworkLazyDrawable(
c.androidContext,
width.toPx(),
height.toPx(),
backgroundELResult
)
}
Expand Down
32 changes: 23 additions & 9 deletions core/src/main/java/com/guet/flexbox/widget/BackgroundDrawable.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,33 @@ internal class BackgroundDrawable(
return true
}
if (other is BackgroundDrawable) {
var inner = wrappedDrawable
while (inner is DrawableWrapper<*>) {
inner = inner.wrappedDrawable
fun unwrap(drawable: BorderDrawable<*>): Drawable {
var innerDrawable: Drawable = drawable
while (innerDrawable is DrawableWrapper<*>) {
innerDrawable = innerDrawable.wrappedDrawable
}
return innerDrawable
}
var otherInner = other.wrappedDrawable
while (otherInner is DrawableWrapper<*>) {
otherInner = otherInner.wrappedDrawable
}
if (inner is ComparableDrawable && otherInner is ComparableDrawable) {
return ComparableDrawable.isEquivalentTo(inner, otherInner)

val border = wrappedDrawable
val otherBorder = other.wrappedDrawable
if (border.borderWidth == otherBorder.borderWidth
&& border.borderColor == otherBorder.borderColor
&& border.radius == otherBorder.radius) {
val left = unwrap(border)
val right = unwrap(otherBorder)
return if (left is ComparableDrawable && right is ComparableDrawable) {
ComparableDrawable.isEquivalentTo(left, right)
} else {
left == right
}
}
}
return false
}

override fun getWrappedDrawable(): BorderDrawable<*> {
return super.getWrappedDrawable() as BorderDrawable<*>
}

}
10 changes: 5 additions & 5 deletions core/src/main/java/com/guet/flexbox/widget/BorderDrawable.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import android.graphics.drawable.Drawable
internal open class BorderDrawable<T : Drawable>(
drawable: T,
radius: Int = 0,
var width: Int = 0,
var color: Int = Color.TRANSPARENT
var borderWidth: Int = 0,
var borderColor: Int = Color.TRANSPARENT
) : RoundedDrawable<T>(drawable, radius) {

private val paint = Paint().apply {
Expand All @@ -19,9 +19,9 @@ internal open class BorderDrawable<T : Drawable>(

override fun draw(canvas: Canvas) {
super.draw(canvas)
if (width > 0) {
paint.color = color
paint.strokeWidth = width.toFloat()
if (borderWidth > 0) {
paint.color = borderColor
paint.strokeWidth = borderWidth.toFloat()
canvas.drawPath(path, paint)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@

/**
* A Drawable that wraps another drawable.
* modify from{@link com.facebook.litho.MatrixDrawable}
*/
final class MatrixDrawable extends Drawable implements Drawable.Callback, Touchable {

Expand Down
24 changes: 8 additions & 16 deletions core/src/main/java/com/guet/flexbox/widget/NetworkImageSpec.kt
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,10 @@ internal object NetworkImageSpec {
fun onBoundsDefined(
c: ComponentContext,
layout: ComponentLayout,
layoutWidth: Output<Int>,
layoutHeight: Output<Int>,
horizontalPadding: Output<Int>,
verticalPadding: Output<Int>) {
horizontalPadding.set(layout.paddingLeft + layout.paddingRight)
verticalPadding.set(layout.paddingTop + layout.paddingBottom)
layoutWidth.set(layout.width)
layoutHeight.set(layout.height)
width: Output<Int>,
height: Output<Int>) {
width.set(layout.width - (layout.paddingLeft + layout.paddingRight))
height.set(layout.height - (layout.paddingTop + layout.paddingBottom))
}

@OnMount
Expand All @@ -59,16 +55,12 @@ internal object NetworkImageSpec {
@Prop(optional = true) blurRadius: Float,
@Prop(optional = true) blurSampling: Float,
@Prop(optional = true) scaleType: ScaleType,
@FromBoundsDefined layoutWidth: Int,
@FromBoundsDefined layoutHeight: Int,
@FromBoundsDefined horizontalPadding: Int,
@FromBoundsDefined verticalPadding: Int) {
@FromBoundsDefined width: Int,
@FromBoundsDefined height: Int) {
drawable.mount(
url,
layoutWidth,
layoutHeight,
horizontalPadding,
verticalPadding,
width,
height,
borderRadius,
borderWidth,
borderColor,
Expand Down
48 changes: 20 additions & 28 deletions core/src/main/java/com/guet/flexbox/widget/NetworkLazyDrawable.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,61 +5,53 @@ import android.graphics.Canvas
import android.graphics.drawable.Drawable
import android.text.TextUtils
import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.target.SizeReadyCallback
import com.bumptech.glide.request.transition.Transition
import com.facebook.litho.drawable.ComparableDrawable
import com.facebook.litho.drawable.ComparableDrawableWrapper
import java.util.concurrent.atomic.AtomicBoolean

internal class NetworkLazyDrawable(
c: Context,
private val width: Int,
private val height: Int,
private val url: CharSequence)
: ComparableDrawableWrapper(NoOpDrawable()) {
: ComparableDrawableWrapper(NoOpDrawable()), WrapperTarget {

private val loaded = AtomicBoolean(false)
private val trigger = AtomicBoolean(false)
private val context = c.applicationContext

override fun draw(canvas: Canvas) {
if (loaded.compareAndSet(false, true)) {
Glide.with(context).load(url)
.into(LazyTarget(width, height))
if (trigger.compareAndSet(false, true)) {
Glide.with(context).load(url).into(this)
} else {
super.draw(canvas)
}
}

override fun getSize(cb: SizeReadyCallback) {
cb.onSizeReady(bounds.width(), bounds.height())
}

override fun isEquivalentTo(other: ComparableDrawable?): Boolean {
if (other == this) {
return true
}
if (other is NetworkLazyDrawable) {
return width == other.width
&& height == other.height
&& TextUtils.equals(url, other.url)
return TextUtils.equals(url, other.url)
}
return false
}

internal inner class LazyTarget(
width: Int,
height: Int
) : CustomTarget<Drawable>(width, height) {
override fun onLoadCleared(placeholder: Drawable?) {
if (placeholder != null) {
onResourceReady(placeholder, null)
} else {
onResourceReady(NoOpDrawable(), null)
}
}
override fun onResourceReady(resource: Drawable, transition: Transition<in Drawable>?) {
resource.bounds = bounds
wrappedDrawable = WrapperTarget.transition(null, resource)
invalidateSelf()
}

override fun onResourceReady(
resource: Drawable,
transition: Transition<in Drawable>?) {
resource.bounds = bounds
wrappedDrawable = NetworkMatrixDrawable.transition(null, resource)
invalidateSelf()
override fun onLoadCleared(placeholder: Drawable?) {
if (placeholder != null) {
onResourceReady(placeholder, null)
} else {
onResourceReady(NoOpDrawable(), null)
}
}
}
Loading

0 comments on commit 3040c06

Please sign in to comment.