Movable FAB in ViewPostDetailActivity.

This commit is contained in:
Docile-Alligator 2022-07-18 23:06:08 +08:00
parent ce04d2bd77
commit a8d8e08323
2 changed files with 122 additions and 1 deletions

View File

@ -0,0 +1,121 @@
package ml.docilealligator.infinityforreddit.customviews;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
public class MovableFloatingActionButton extends FloatingActionButton implements View.OnTouchListener {
private final static float CLICK_DRAG_TOLERANCE = 50;
private long downTime = 0;
private boolean moved = false;
private boolean longClicked = false;
private float downRawX, downRawY;
private float dX, dY;
public MovableFloatingActionButton(Context context) {
super(context);
init();
}
public MovableFloatingActionButton(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MovableFloatingActionButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
setOnTouchListener(this);
}
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams)view.getLayoutParams();
int action = motionEvent.getAction();
if (action == MotionEvent.ACTION_DOWN) {
downTime = System.currentTimeMillis();
moved = false;
downRawX = motionEvent.getRawX();
downRawY = motionEvent.getRawY();
dX = view.getX() - downRawX;
dY = view.getY() - downRawY;
return true;
} else if (action == MotionEvent.ACTION_MOVE) {
if (!moved) {
if (System.currentTimeMillis() - downTime >= 300) {
if (!longClicked) {
longClicked = true;
return performLongClick();
} else {
moved = true;
}
}
float upRawX = motionEvent.getRawX();
float upRawY = motionEvent.getRawY();
float upDX = upRawX - downRawX;
float upDY = upRawY - downRawY;
if (Math.abs(upDX) < CLICK_DRAG_TOLERANCE && Math.abs(upDY) < CLICK_DRAG_TOLERANCE) {
return true;
} else {
moved = true;
}
}
int viewWidth = view.getWidth();
int viewHeight = view.getHeight();
View viewParent = (View)view.getParent();
int parentWidth = viewParent.getWidth();
int parentHeight = viewParent.getHeight();
float newX = motionEvent.getRawX() + dX;
newX = Math.max(layoutParams.leftMargin, newX); // Don't allow the FAB past the left hand side of the parent
newX = Math.min(parentWidth - viewWidth - layoutParams.rightMargin, newX); // Don't allow the FAB past the right hand side of the parent
float newY = motionEvent.getRawY() + dY;
newY = Math.max(layoutParams.topMargin, newY); // Don't allow the FAB past the top of the parent
newY = Math.min(parentHeight - viewHeight - layoutParams.bottomMargin, newY); // Don't allow the FAB past the bottom of the parent
view.animate()
.x(newX)
.y(newY)
.setDuration(0)
.start();
return true;
} else if (action == MotionEvent.ACTION_UP) {
if (longClicked) {
longClicked = false;
return true;
}
float upRawX = motionEvent.getRawX();
float upRawY = motionEvent.getRawY();
float upDX = upRawX - downRawX;
float upDY = upRawY - downRawY;
if (Math.abs(upDX) < CLICK_DRAG_TOLERANCE && Math.abs(upDY) < CLICK_DRAG_TOLERANCE) {
return System.currentTimeMillis() - downTime >= 300 ? performLongClick() : performClick();
} else {
return true;
}
} else {
return super.onTouchEvent(motionEvent);
}
}
}

View File

@ -39,7 +39,7 @@
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
<ml.docilealligator.infinityforreddit.customviews.MovableFloatingActionButton
android:id="@+id/fab_view_post_detail_activity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"