<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btnFloat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="拖拽我" />
</RelativeLayout>
Button btn = findViewById(R.id.btnFloat);
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) btn.getLayoutParams();
lp.leftMargin = 200; // 距左邊距
lp.topMargin = 300; // 距上邊距
btn.setLayoutParams(lp);
btn.setOnTouchListener((v, event) -> {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
dX = v.getX() - event.getRawX();
dY = v.getY() - event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
v.animate()
.x(event.getRawX() + dX)
.y(event.getRawY() + dY)
.setDuration(0)
.start();
break;
}
return true;
});
v.animate().x()/y() 修改視圖在父容器中的座標,配合 setDuration(0) 即時跟隨手指。
SYSTEM_ALERT_WINDOW 權限(Android 6.0+ 需用戶授權)。