Fix delete button collision detection.
This commit is contained in:
parent
1b924c606a
commit
d1fd70a807
3 changed files with 16 additions and 32 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Add table
Reference in a new issue