From 2400ae9d81b84288b7e8e1c10d6e3e36f33e7d96 Mon Sep 17 00:00:00 2001 From: ekhiw Date: Fri, 18 Feb 2022 17:50:03 +0700 Subject: [PATCH 1/2] Add GestureDetector with onLongPress --- .../hyuwah/draggableviewlib/DraggableListener.kt | 2 ++ .../github/hyuwah/draggableviewlib/Extensions.kt | 16 ++++++++++++---- .../hyuwah/draggableview/BasicExampleActivity.kt | 5 +++++ .../hyuwah/draggableview/JavaMainActivity.java | 6 ++++++ .../hyuwah/draggableview/ScrollingActivity.kt | 5 +++++ 5 files changed, 30 insertions(+), 4 deletions(-) diff --git a/draggableviewlib/src/main/java/io/github/hyuwah/draggableviewlib/DraggableListener.kt b/draggableviewlib/src/main/java/io/github/hyuwah/draggableviewlib/DraggableListener.kt index a1b2619..e29fac4 100644 --- a/draggableviewlib/src/main/java/io/github/hyuwah/draggableviewlib/DraggableListener.kt +++ b/draggableviewlib/src/main/java/io/github/hyuwah/draggableviewlib/DraggableListener.kt @@ -6,4 +6,6 @@ interface DraggableListener { fun onPositionChanged(view: View) + fun onLongPress(view: View) + } \ No newline at end of file diff --git a/draggableviewlib/src/main/java/io/github/hyuwah/draggableviewlib/Extensions.kt b/draggableviewlib/src/main/java/io/github/hyuwah/draggableviewlib/Extensions.kt index a8595e8..0276d84 100644 --- a/draggableviewlib/src/main/java/io/github/hyuwah/draggableviewlib/Extensions.kt +++ b/draggableviewlib/src/main/java/io/github/hyuwah/draggableviewlib/Extensions.kt @@ -7,10 +7,7 @@ import android.animation.AnimatorListenerAdapter import android.graphics.PixelFormat import android.os.Build import android.util.Log -import android.view.MotionEvent -import android.view.View -import android.view.ViewGroup -import android.view.WindowManager +import android.view.* import io.github.hyuwah.draggableviewlib.Draggable.DRAG_TOLERANCE import io.github.hyuwah.draggableviewlib.Draggable.DURATION_MILLIS //import io.github.hyuwah.draggableviewlib.DraggableView.StickyRestSide @@ -52,6 +49,15 @@ internal fun View.setupDraggable( val marginEnd = marginEnd() val marginBottom = marginBottom() + + fun longClickSetup(v:View) : GestureDetector { + return GestureDetector(this.context,object : GestureDetector.SimpleOnGestureListener(){ + override fun onLongPress(e: MotionEvent?) { + draggableListener?.onLongPress(v) + } + }) + } + setOnTouchListener { v, event -> val viewParent = v.parent as View val parentHeight = viewParent.height @@ -61,6 +67,8 @@ internal fun View.setupDraggable( val yMax = parentHeight - v.height - marginBottom val yMiddle = parentHeight / 2 + longClickSetup(v).onTouchEvent(event) + when (event.actionMasked) { MotionEvent.ACTION_DOWN -> { widgetDX = v.x - event.rawX diff --git a/example/src/main/java/io/github/hyuwah/draggableview/BasicExampleActivity.kt b/example/src/main/java/io/github/hyuwah/draggableview/BasicExampleActivity.kt index 5035b4a..770cdb7 100644 --- a/example/src/main/java/io/github/hyuwah/draggableview/BasicExampleActivity.kt +++ b/example/src/main/java/io/github/hyuwah/draggableview/BasicExampleActivity.kt @@ -1,6 +1,7 @@ package io.github.hyuwah.draggableview import android.os.Bundle +import android.util.Log import android.view.View import android.widget.ArrayAdapter import android.widget.ImageView @@ -30,6 +31,10 @@ class BasicExampleActivity : AppCompatActivity() { tvLl2.text = "Y: ${view.y.toString().take(6)}" } } + + override fun onLongPress(view: View) { + toast("Long press view : ${view.id}") + } } override fun onCreate(savedInstanceState: Bundle?) { diff --git a/example/src/main/java/io/github/hyuwah/draggableview/JavaMainActivity.java b/example/src/main/java/io/github/hyuwah/draggableview/JavaMainActivity.java index c0f1408..1d31b35 100644 --- a/example/src/main/java/io/github/hyuwah/draggableview/JavaMainActivity.java +++ b/example/src/main/java/io/github/hyuwah/draggableview/JavaMainActivity.java @@ -6,6 +6,7 @@ import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import org.jetbrains.annotations.NotNull; @@ -43,4 +44,9 @@ public void onPositionChanged(@NotNull View view) { TextView textView = findViewById(R.id.tv_coordinate); textView.setText("X: " + view.getX() + "\tY: " + view.getY()); } + + @Override + public void onLongPress(@NonNull View view) { + + } } diff --git a/example/src/main/java/io/github/hyuwah/draggableview/ScrollingActivity.kt b/example/src/main/java/io/github/hyuwah/draggableview/ScrollingActivity.kt index dd7fbd8..243a1d7 100644 --- a/example/src/main/java/io/github/hyuwah/draggableview/ScrollingActivity.kt +++ b/example/src/main/java/io/github/hyuwah/draggableview/ScrollingActivity.kt @@ -9,6 +9,7 @@ import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import androidx.core.widget.NestedScrollView import io.github.hyuwah.draggableview.databinding.ActivityScrollingBinding +import io.github.hyuwah.draggableview.utils.toast import io.github.hyuwah.draggableview.utils.viewBinding import io.github.hyuwah.draggableviewlib.DraggableListener import io.github.hyuwah.draggableviewlib.DraggableView @@ -26,6 +27,10 @@ class ScrollingActivity : AppCompatActivity() { Y: ${view.y} """.trimIndent() } + + override fun onLongPress(view: View) { + toast("Long press view : ${view.id}") + } } override fun onCreate(savedInstanceState: Bundle?) { From a92aad7484e9f07e0943634e570b37f3eeb49fa5 Mon Sep 17 00:00:00 2001 From: Muhamad Wahyudin Date: Wed, 19 Jul 2023 18:01:35 +0700 Subject: [PATCH 2/2] refactor: add conditional to avoid long click listener being triggered everytime the view moves - also update examples for long click listener usage fix #13 --- .../hyuwah/draggableviewlib/DraggableView.kt | 12 ++++++++- .../draggableviewlib/DraggableViewState.kt | 9 +++++++ .../hyuwah/draggableviewlib/Extensions.kt | 26 ++++++++++++++----- .../draggableview/JavaMainActivity.java | 6 +++-- 4 files changed, 44 insertions(+), 9 deletions(-) create mode 100644 draggableviewlib/src/main/java/io/github/hyuwah/draggableviewlib/DraggableViewState.kt diff --git a/draggableviewlib/src/main/java/io/github/hyuwah/draggableviewlib/DraggableView.kt b/draggableviewlib/src/main/java/io/github/hyuwah/draggableviewlib/DraggableView.kt index 6e952fb..edbcd9f 100644 --- a/draggableviewlib/src/main/java/io/github/hyuwah/draggableviewlib/DraggableView.kt +++ b/draggableviewlib/src/main/java/io/github/hyuwah/draggableviewlib/DraggableView.kt @@ -171,7 +171,17 @@ class DraggableView private constructor( fun setStickyMode(mode: Mode) = apply { this.stickyMode = mode } fun setAnimated(value: Boolean) = apply { this.animated = value } - fun setListener(listener: DraggableListener?) = apply { this.listener = listener } + fun setListener(listener: DraggableListener?) = apply { + this.listener = listener + if (listener == null) { + targetView.setOnLongClickListener(null) + } else { + targetView.setOnLongClickListener { + listener.onLongPress(it) + true + } + } + } fun build() = DraggableView(targetView, stickyMode, animated, listener) } diff --git a/draggableviewlib/src/main/java/io/github/hyuwah/draggableviewlib/DraggableViewState.kt b/draggableviewlib/src/main/java/io/github/hyuwah/draggableviewlib/DraggableViewState.kt new file mode 100644 index 0000000..c394412 --- /dev/null +++ b/draggableviewlib/src/main/java/io/github/hyuwah/draggableviewlib/DraggableViewState.kt @@ -0,0 +1,9 @@ +package io.github.hyuwah.draggableviewlib + +/** + * State holder class for the draggable view + */ +internal data class DraggableViewState( + var isMoving: Boolean, + var isLongPressRegistered: Boolean, +) diff --git a/draggableviewlib/src/main/java/io/github/hyuwah/draggableviewlib/Extensions.kt b/draggableviewlib/src/main/java/io/github/hyuwah/draggableviewlib/Extensions.kt index 0276d84..212b15d 100644 --- a/draggableviewlib/src/main/java/io/github/hyuwah/draggableviewlib/Extensions.kt +++ b/draggableviewlib/src/main/java/io/github/hyuwah/draggableviewlib/Extensions.kt @@ -8,6 +8,7 @@ import android.graphics.PixelFormat import android.os.Build import android.util.Log import android.view.* +import androidx.core.view.GestureDetectorCompat import io.github.hyuwah.draggableviewlib.Draggable.DRAG_TOLERANCE import io.github.hyuwah.draggableviewlib.Draggable.DURATION_MILLIS //import io.github.hyuwah.draggableviewlib.DraggableView.StickyRestSide @@ -49,14 +50,18 @@ internal fun View.setupDraggable( val marginEnd = marginEnd() val marginBottom = marginBottom() - - fun longClickSetup(v:View) : GestureDetector { - return GestureDetector(this.context,object : GestureDetector.SimpleOnGestureListener(){ + val viewState = DraggableViewState( + isMoving = false, + isLongPressRegistered = false + ) + val gestureDetector = + GestureDetectorCompat(this.context, object : GestureDetector.SimpleOnGestureListener() { override fun onLongPress(e: MotionEvent?) { - draggableListener?.onLongPress(v) + if (viewState.isMoving) return + viewState.isLongPressRegistered = true + draggableListener?.onLongPress(this@setupDraggable) } }) - } setOnTouchListener { v, event -> val viewParent = v.parent as View @@ -67,10 +72,11 @@ internal fun View.setupDraggable( val yMax = parentHeight - v.height - marginBottom val yMiddle = parentHeight / 2 - longClickSetup(v).onTouchEvent(event) + gestureDetector.onTouchEvent(event) when (event.actionMasked) { MotionEvent.ACTION_DOWN -> { + viewState.isLongPressRegistered = false widgetDX = v.x - event.rawX widgetDY = v.y - event.rawY widgetInitialX = v.x @@ -80,17 +86,20 @@ internal fun View.setupDraggable( var newX = event.rawX + widgetDX newX = max(marginStart, newX) newX = min(xMax, newX) + if (abs(v.x - newX) > DRAG_TOLERANCE) viewState.isMoving = true v.x = newX var newY = event.rawY + widgetDY newY = max(marginTop, newY) newY = min(yMax, newY) + if (abs(v.y - newY) > DRAG_TOLERANCE) viewState.isMoving = true v.y = newY draggableListener?.onPositionChanged(v) // minimizeBtnListener.onPositionChanged(v, StickyRestSide.HIDE) } MotionEvent.ACTION_UP -> { + viewState.isMoving = false when (stickyAxis) { DraggableView.Mode.STICKY_X -> { if (event.rawX >= xMiddle) { @@ -196,6 +205,11 @@ internal fun View.setupDraggable( } } + if (viewState.isLongPressRegistered) { + // Don't register click + return@setOnTouchListener true + } + if (abs(v.x - widgetInitialX) <= DRAG_TOLERANCE && abs(v.y - widgetInitialY) <= DRAG_TOLERANCE) { performClick() } diff --git a/example/src/main/java/io/github/hyuwah/draggableview/JavaMainActivity.java b/example/src/main/java/io/github/hyuwah/draggableview/JavaMainActivity.java index 1d31b35..fdfac63 100644 --- a/example/src/main/java/io/github/hyuwah/draggableview/JavaMainActivity.java +++ b/example/src/main/java/io/github/hyuwah/draggableview/JavaMainActivity.java @@ -14,6 +14,8 @@ import io.github.hyuwah.draggableviewlib.DraggableListener; import io.github.hyuwah.draggableviewlib.DraggableView; +import static io.github.hyuwah.draggableview.utils.ExtensionsKt.toast; + public class JavaMainActivity extends AppCompatActivity implements DraggableListener { @Override @@ -33,7 +35,7 @@ protected void onCreate(Bundle savedInstanceState) { button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - Toast.makeText(JavaMainActivity.this, "Button Clicked", Toast.LENGTH_SHORT).show(); + toast(JavaMainActivity.this, "Button Clicked"); } }); @@ -47,6 +49,6 @@ public void onPositionChanged(@NotNull View view) { @Override public void onLongPress(@NonNull View view) { - + toast(this,"Long press view : " + view.getId()); } }