Skip to content

Commit

Permalink
added touch dispatch cancelling, fixed scrolling in ScrollView
Browse files Browse the repository at this point in the history
  • Loading branch information
ZieIony committed Mar 23, 2020
1 parent 7c24e15 commit 2f496c9
Show file tree
Hide file tree
Showing 15 changed files with 111 additions and 43 deletions.
38 changes: 22 additions & 16 deletions app/src/main/java/comprise/test/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -34,30 +34,36 @@ class MainActivity : CompriseActivity() {
card = makeCard()

setContentView(
Column(
Stack(
width = LayoutSize.MATCH_PARENT,
height = LayoutSize.MATCH_PARENT,
name = "main layout",
children = listOf(
makeActionBar(),
Stack(
Padding(
width = LayoutSize.MATCH_PARENT,
height = LayoutSize(300.dp),
children = listOf(
ImageView(
width = LayoutSize.MATCH_PARENT,
height = LayoutSize.MATCH_PARENT,
drawable = ColorDrawable(0xffafafaf.toInt())
),
ScrollView(
name = "scroll view",
child = Padding(
height = LayoutSize(356.dp),
paddingTop = 56.dp,
child = Stack(
width = LayoutSize.MATCH_PARENT,
height = LayoutSize(300.dp),
children = listOf(
ImageView(
width = LayoutSize.MATCH_PARENT,
padding = 16.dp,
child = makeContent()
height = LayoutSize.MATCH_PARENT,
drawable = ColorDrawable(0xffafafaf.toInt())
),
ScrollView(
name = "scroll view",
child = Padding(
width = LayoutSize.MATCH_PARENT,
padding = 16.dp,
child = makeContent()
)
)
)
)
)
),
makeActionBar()
)
)
)
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/comprise/test/SearchToolbar.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import android.graphics.drawable.Drawable
import comprise.material.IconButton
import comprise.material.Toolbar
import comprise.material.ToolbarStyle
import comprise.theme.dp
import comprise.dp
import comprise.view.Clip
import comprise.view.LayoutSize
import comprise.view.ViewContainer
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package comprise.theme
package comprise

import android.content.res.Resources

Expand All @@ -11,4 +11,12 @@ val Int.sp: Int
val Float.dp: Float
get() = (this * Resources.getSystem().displayMetrics.density)
val Float.sp: Float
get() = (this * Resources.getSystem().displayMetrics.scaledDensity)
get() = (this * Resources.getSystem().displayMetrics.scaledDensity)

inline fun <T, R> T?.letElse(ifNotNull: (T) -> R, ifNull: () -> R): R {
return if (this != null) {
ifNotNull(this)
} else {
ifNull()
}
}
4 changes: 2 additions & 2 deletions lib/src/main/java/comprise/material/ActionBar.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package comprise.material
import android.graphics.Path
import android.graphics.RectF
import android.graphics.drawable.Drawable
import comprise.theme.dp
import comprise.dp
import comprise.view.LayoutSize
import comprise.view.View
import comprise.view.ViewContainer
Expand Down Expand Up @@ -52,7 +52,7 @@ class ActionBar(

var background by ChildPropertDelegate<Drawable?>(toolbar::background)

var elevation by ChildPropertDelegate<Drawable?>(shadow::elevation)
var elevation by ChildPropertDelegate<StateList<Float>>(shadow::elevation)

init {
child = shadow
Expand Down
2 changes: 1 addition & 1 deletion lib/src/main/java/comprise/material/IconButton.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package comprise.material

import android.graphics.drawable.Drawable
import comprise.theme.dp
import comprise.dp
import comprise.view.LayoutSize
import comprise.view.Padding
import comprise.view.Ripple
Expand Down
2 changes: 1 addition & 1 deletion lib/src/main/java/comprise/material/MaterialButton.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import android.graphics.RectF
import android.graphics.drawable.Drawable
import android.view.MotionEvent
import comprise.theme.ButtonStyle
import comprise.theme.dp
import comprise.dp
import comprise.view.*
import comprise.widget.Button
import comprise.widget.Shadow
Expand Down
2 changes: 1 addition & 1 deletion lib/src/main/java/comprise/material/MaterialIcon.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package comprise.material

import android.graphics.drawable.Drawable
import comprise.theme.dp
import comprise.dp
import comprise.view.LayoutSize
import comprise.widget.ImageView

Expand Down
2 changes: 1 addition & 1 deletion lib/src/main/java/comprise/material/MaterialTextButton.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import android.content.res.ColorStateList
import android.graphics.drawable.Drawable
import android.text.Layout
import android.view.MotionEvent
import comprise.theme.dp
import comprise.dp
import comprise.view.LayoutSize
import comprise.widget.TextView
import comprise.widget.TextStyle
Expand Down
2 changes: 1 addition & 1 deletion lib/src/main/java/comprise/material/MaterialTheme.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import android.content.Context
import android.content.res.ColorStateList
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import comprise.theme.dp
import comprise.dp
import comprise.widget.StateList
import comprise.widget.TextStyle

Expand Down
2 changes: 1 addition & 1 deletion lib/src/main/java/comprise/material/Toolbar.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package comprise.material
import android.graphics.Path
import android.graphics.RectF
import android.graphics.drawable.Drawable
import comprise.theme.dp
import comprise.dp
import comprise.view.*
import comprise.widget.ImageView
import comprise.widget.Stack
Expand Down
47 changes: 38 additions & 9 deletions lib/src/main/java/comprise/view/ViewGroup.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package comprise.view

import android.graphics.Canvas
import android.view.MotionEvent
import comprise.letElse

abstract class ViewGroup(
width: LayoutSize = LayoutSize.WRAP_CONTENT,
Expand All @@ -14,6 +15,8 @@ abstract class ViewGroup(

val children = ViewList(this)

private var touchReceiver: View? = null

init {
this.children.addAll(children)
}
Expand All @@ -28,17 +31,43 @@ abstract class ViewGroup(
}

override fun touchEvent(ev: MotionEvent): Boolean {
children.forEach {
val event = MotionEvent.obtain(ev)
event.setLocation(event.x - it.x.toFloat(), event.y - it.y.toFloat())
if (event.x >= 0 && event.y >= 0 && event.x <= it.width && event.y <= it.height) {
if (it.touchEvent(event)) {
event.recycle()
return true
touchReceiver.letElse({
val result: Boolean
if (ev.action == MotionEvent.ACTION_DOWN) {
val event = MotionEvent.obtain(ev)
event.action = MotionEvent.ACTION_CANCEL
result = it.touchEvent(event)
event.recycle()
touchReceiver = null
} else if (ev.action == MotionEvent.ACTION_UP) {
val event = MotionEvent.obtain(ev)
event.setLocation(event.x - it.x.toFloat(), event.y - it.y.toFloat())
result = it.touchEvent(event)
touchReceiver = null
event.recycle()
} else {
val event = MotionEvent.obtain(ev)
event.setLocation(event.x - it.x.toFloat(), event.y - it.y.toFloat())
result = it.touchEvent(event)
if (!result)
touchReceiver = null
event.recycle()
}
return result
}, {
children.forEach {
val event = MotionEvent.obtain(ev)
event.setLocation(event.x - it.x.toFloat(), event.y - it.y.toFloat())
if (event.x >= 0 && event.y >= 0 && event.x <= it.width && event.y <= it.height) {
if (it.touchEvent(event)) {
touchReceiver = it
event.recycle()
return true
}
}
event.recycle()
}
event.recycle()
}
})
return super.touchEvent(ev)
}
}
2 changes: 1 addition & 1 deletion lib/src/main/java/comprise/widget/Border.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package comprise.widget
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.Path
import comprise.theme.dp
import comprise.dp
import comprise.view.LayoutSize
import comprise.view.View
import comprise.view.ViewContainer
Expand Down
33 changes: 29 additions & 4 deletions lib/src/main/java/comprise/widget/ScrollView.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import android.view.MotionEvent
import comprise.view.LayoutSize
import comprise.view.View
import comprise.view.ViewContainer
import kotlin.math.abs
import kotlin.math.max
import kotlin.math.min

Expand All @@ -19,6 +20,8 @@ class ScrollView(
child: View? = null
) : ViewContainer(width, height, minWidth, minHeight, name, child) {

private val currentScroll = PointF()
private var scrolling = false
val scroll = PointF()

override fun draw(canvas: Canvas, editMode: Boolean, debugMode: Boolean) {
Expand All @@ -43,12 +46,30 @@ class ScrollView(
private val prevTouch = PointF()
override fun touchEvent(ev: MotionEvent): Boolean {
child?.let {
if (ev.action == MotionEvent.ACTION_MOVE) {
if (ev.action == MotionEvent.ACTION_DOWN) {
scrolling = false
currentScroll.x = scroll.x
currentScroll.y = scroll.y
} else if (ev.action == MotionEvent.ACTION_MOVE) {
val maxScrollX = (it.width - width).toFloat()
scroll.x = max(0.0f, min(scroll.x + ev.x - prevTouch.x, maxScrollX))
currentScroll.x = max(0.0f, min(scroll.x + ev.x - prevTouch.x, maxScrollX))
val maxScrollY = (it.height - height).toFloat()
scroll.y = max(-maxScrollY, min(scroll.y + ev.y - prevTouch.y, 0.0f))
requestDraw()
currentScroll.y = max(-maxScrollY, min(scroll.y + ev.y - prevTouch.y, 0.0f))
if (abs(currentScroll.x - scroll.x) > SCROLL_TRESHOLD ||
abs(currentScroll.y - scroll.y) > SCROLL_TRESHOLD
) {
scrolling = true
val event = MotionEvent.obtain(ev)
event.action = MotionEvent.ACTION_CANCEL
event.offsetLocation(-currentScroll.x, -currentScroll.y)
it.touchEvent(event)
event.recycle()
}
if (scrolling) {
scroll.x = currentScroll.x
scroll.y = currentScroll.y
requestDraw()
}
}
prevTouch.x = ev.x
prevTouch.y = ev.y
Expand All @@ -59,4 +80,8 @@ class ScrollView(
event.recycle()
return result
}

companion object {
const val SCROLL_TRESHOLD = 5.0f
}
}
2 changes: 1 addition & 1 deletion lib/src/main/java/comprise/widget/Shadow.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import android.graphics.Color
import android.graphics.Paint
import android.graphics.Path
import android.view.MotionEvent
import comprise.theme.dp
import comprise.dp
import comprise.view.LayoutSize
import comprise.view.View
import comprise.view.ViewContainer
Expand Down
2 changes: 1 addition & 1 deletion lib/src/main/java/comprise/widget/TextView.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import android.graphics.*
import android.text.Layout
import android.text.StaticLayout
import android.text.TextPaint
import comprise.theme.sp
import comprise.sp
import comprise.view.LayoutSize
import comprise.view.View
import kotlin.math.abs
Expand Down

0 comments on commit 2f496c9

Please sign in to comment.