Android: Drag và Drop đến vị trí bất kỳ
Giải phóng thời gian, khai phóng năng lực
File activity_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/view_root" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#26ce61"> <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginTop="188dp" android:src="@drawable/ic_launcher_background" android:layout_alignParentStart="true" android:layout_marginLeft="123dp" android:layout_marginStart="123dp" android:layout_alignParentLeft="true"/> </RelativeLayout>
File MainActivity.java:
package v1study.com.draganddropv1study; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.View.OnTouchListener; import android.widget.ImageView; import android.widget.RelativeLayout; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private ImageView img; private ViewGroup rootLayout; private int _xDelta; private int _yDelta; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rootLayout = findViewById(R.id.view_root); img = rootLayout.findViewById(R.id.imageView); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(150, 150); img.setLayoutParams(layoutParams); img.setOnTouchListener(new ChoiceTouchListener()); } private final class ChoiceTouchListener implements OnTouchListener { public boolean onTouch(View view, MotionEvent event) { final int X = (int) event.getRawX(); final int Y = (int) event.getRawY(); switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) view.getLayoutParams(); _xDelta = X - lParams.leftMargin; _yDelta = Y - lParams.topMargin; break; case MotionEvent.ACTION_UP: break; case MotionEvent.ACTION_POINTER_DOWN: break; case MotionEvent.ACTION_POINTER_UP: break; case MotionEvent.ACTION_MOVE: RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view .getLayoutParams(); layoutParams.leftMargin = X - _xDelta; layoutParams.topMargin = Y - _yDelta; layoutParams.rightMargin = -250; layoutParams.bottomMargin = -250; view.setLayoutParams(layoutParams); break; } rootLayout.invalidate(); return true; } } }
Giải phóng thời gian, khai phóng năng lực