mirror of
https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy.git
synced 2024-11-07 03:07:26 +01:00
Movable FAB in ViewPostDetailActivity.
This commit is contained in:
parent
ce04d2bd77
commit
a8d8e08323
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -39,7 +39,7 @@
|
|||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
|
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:id="@+id/fab_view_post_detail_activity"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
Loading…
Reference in New Issue
Block a user