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/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 a8595e8..212b15d 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,8 @@ 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 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 @@ -52,6 +50,19 @@ internal fun View.setupDraggable( val marginEnd = marginEnd() val marginBottom = marginBottom() + val viewState = DraggableViewState( + isMoving = false, + isLongPressRegistered = false + ) + val gestureDetector = + GestureDetectorCompat(this.context, object : GestureDetector.SimpleOnGestureListener() { + override fun onLongPress(e: MotionEvent?) { + if (viewState.isMoving) return + viewState.isLongPressRegistered = true + draggableListener?.onLongPress(this@setupDraggable) + } + }) + setOnTouchListener { v, event -> val viewParent = v.parent as View val parentHeight = viewParent.height @@ -61,8 +72,11 @@ internal fun View.setupDraggable( val yMax = parentHeight - v.height - marginBottom val yMiddle = parentHeight / 2 + 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 @@ -72,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) { @@ -188,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/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..fdfac63 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; @@ -13,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 @@ -32,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"); } }); @@ -43,4 +46,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) { + toast(this,"Long press view : " + view.getId()); + } } 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?) {