Fix delete button collision detection.

This commit is contained in:
Greyson Parrelli 2021-09-08 20:55:24 -04:00
parent 1b924c606a
commit d1fd70a807
3 changed files with 16 additions and 32 deletions

View file

@ -327,7 +327,7 @@ public final class ImageEditorView extends FrameLayout {
return false; return false;
} }
if (model.checkTrashIntersectsPoint(point, viewMatrix)) { if (model.checkTrashIntersectsPoint(point)) {
((TrashRenderer) model.getTrash().getRenderer()).expand(); ((TrashRenderer) model.getTrash().getRenderer()).expand();
return true; return true;
} else { } else {

View file

@ -184,14 +184,14 @@ public final class EditorModel implements Parcelable, RendererContext.Ready {
return editorElementHierarchy.getRoot().findElementAt(point.x, point.y, viewMatrix, outInverseModelMatrix); return editorElementHierarchy.getRoot().findElementAt(point.x, point.y, viewMatrix, outInverseModelMatrix);
} }
public boolean checkTrashIntersectsPoint(@NonNull PointF point, @NonNull Matrix viewMatrix) { public boolean checkTrashIntersectsPoint(@NonNull PointF point) {
EditorElement trash = editorElementHierarchy.getTrash(); EditorElement trash = editorElementHierarchy.getTrash();
if (trash.getFlags().isVisible()) { if (trash.getFlags().isVisible()) {
trash.getFlags() trash.getFlags()
.setSelectable(true) .setSelectable(true)
.persist(); .persist();
boolean isIntersecting = trash.findElementAt(point.x, point.y, viewMatrix, new Matrix()) != null; boolean isIntersecting = trash.findElementAt(point.x, point.y, new Matrix(), new Matrix()) != null;
trash.getFlags() trash.getFlags()
.setSelectable(false) .setSelectable(false)

View file

@ -13,8 +13,6 @@ import org.thoughtcrime.securesms.imageeditor.Renderer
import org.thoughtcrime.securesms.imageeditor.RendererContext import org.thoughtcrime.securesms.imageeditor.RendererContext
import org.thoughtcrime.securesms.mediasend.v2.MediaAnimations import org.thoughtcrime.securesms.mediasend.v2.MediaAnimations
import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.ViewUtil
import kotlin.math.pow
import kotlin.math.sqrt
internal class TrashRenderer : InvalidateableRenderer, Renderer, Parcelable { internal class TrashRenderer : InvalidateableRenderer, Renderer, Parcelable {
@ -25,7 +23,7 @@ internal class TrashRenderer : InvalidateableRenderer, Renderer, Parcelable {
strokeWidth = ViewUtil.dpToPx(15) / 10f strokeWidth = ViewUtil.dpToPx(15) / 10f
} }
private val dst = RectF() private val bounds = RectF()
private val diameterSmall = ViewUtil.dpToPx(41) private val diameterSmall = ViewUtil.dpToPx(41)
private val diameterLarge = ViewUtil.dpToPx(54) private val diameterLarge = ViewUtil.dpToPx(54)
@ -36,12 +34,9 @@ internal class TrashRenderer : InvalidateableRenderer, Renderer, Parcelable {
private var isExpanding = false private var isExpanding = false
private val origin = FloatArray(2) private val buttonCenter = FloatArray(2)
private val x = FloatArray(2)
private val a = FloatArray(2)
private val b = FloatArray(2)
constructor() {} constructor()
override fun render(rendererContext: RendererContext) { override fun render(rendererContext: RendererContext) {
super.render(rendererContext) super.render(rendererContext)
@ -54,17 +49,15 @@ internal class TrashRenderer : InvalidateableRenderer, Renderer, Parcelable {
val diameter = getInterpolatedDiameter(frameRenderTime - startTime) val diameter = getInterpolatedDiameter(frameRenderTime - startTime)
rendererContext.canvas.save() rendererContext.canvas.save()
rendererContext.mapRect(dst, Bounds.FULL_BOUNDS) rendererContext.mapRect(bounds, Bounds.FULL_BOUNDS)
buttonCenter[0] = bounds.centerX()
buttonCenter[1] = bounds.bottom - diameterLarge / 2f - padBottom
rendererContext.canvasMatrix.setToIdentity() rendererContext.canvasMatrix.setToIdentity()
rendererContext.canvasMatrix.mapPoints(origin, floatArrayOf(0f, 0f)) rendererContext.canvas.drawCircle(buttonCenter[0], buttonCenter[1], diameter / 2f, outlinePaint)
rendererContext.canvasMatrix.mapPoints(x, floatArrayOf(diameterLarge.toFloat(), 0f)) rendererContext.canvas.translate(bounds.centerX(), bounds.bottom - diameterLarge / 2f - padBottom)
rendererContext.canvasMatrix.mapPoints(a, floatArrayOf(0f, diameterLarge.toFloat() / 2f))
rendererContext.canvasMatrix.mapPoints(b, floatArrayOf(0f, padBottom.toFloat()))
rendererContext.canvas.drawCircle(dst.centerX(), dst.bottom - diameterLarge / 2f - padBottom, diameter / 2f, outlinePaint)
rendererContext.canvas.translate(dst.centerX(), dst.bottom - diameterLarge / 2f - padBottom)
rendererContext.canvas.translate(- (trashSize / 2f), - (trashSize / 2f)) rendererContext.canvas.translate(- (trashSize / 2f), - (trashSize / 2f))
trash.draw(rendererContext.canvas) trash.draw(rendererContext.canvas)
rendererContext.canvas.restore() rendererContext.canvas.restore()
@ -74,10 +67,6 @@ internal class TrashRenderer : InvalidateableRenderer, Renderer, Parcelable {
} }
} }
private fun distance(a: FloatArray, b: FloatArray): Float {
return sqrt((b[1] - a[1]).toDouble().pow(2.0) + (b[0] - a[0]).toDouble().pow(2.0)).toFloat()
}
private fun getInterpolatedDiameter(timeElapsed: Long): Float { private fun getInterpolatedDiameter(timeElapsed: Long): Float {
return if (timeElapsed >= DURATION) { return if (timeElapsed >= DURATION) {
if (isExpanding) { if (isExpanding) {
@ -122,16 +111,11 @@ internal class TrashRenderer : InvalidateableRenderer, Renderer, Parcelable {
private constructor(inParcel: Parcel?) private constructor(inParcel: Parcel?)
override fun hitTest(x: Float, y: Float): Boolean { override fun hitTest(x: Float, y: Float): Boolean {
val xDistance = distance(origin, this.x) val dx = x - buttonCenter[0]
val isXInRange = -xDistance <= x && x <= xDistance val dy = y - buttonCenter[1]
val radius = diameterLarge / 2
if (!isXInRange) { return dx * dx + dy * dy < radius * radius
return false
}
val yDistanceStart = dst.bottom - dst.centerY() - distance(origin, a) - distance(origin, b)
return y >= yDistanceStart
} }
override fun describeContents(): Int { override fun describeContents(): Int {