How do you make a smooth display of the Drag and Drop?
-
There's two ImageView. 1a is a substrate, 2a is an object to be moved on the 1st ImageView with Drag and Drop. In my realization, ImageView moves with swings or steps, see. How do I get a smooth picture of displacement? There is also no possibility of accurate positioning of the disguised object in the current implementation. https://www.dropbox.com/s/15kphsztagwfx6a/device-2016-08-01-165716.mp4?dl=0
Layout with images
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:id="@+id/img_back_image_frag2" android:layout_width="wrap_content" android:layout_height="600dp" android:layout_gravity="center_horizontal" android:scaleType="fitStart"/>
<ImageView
android:id="@+id/img_watermark"
android:layout_width="wrap_content"
android:layout_height="100dp"/>
Source code of fragment
public class AddWatermarkFragment extends Fragment {
ImageView backImageView, watermarkImageView;
private static final int CHOOSE_BASE_PHOTO = 1001;@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_add_watermark, null);backImageView = (ImageView)v.findViewById(R.id.img_back_image_frag2); watermarkImageView = (ImageView)v.findViewById(R.id.img_watermark); if(WatermarkSettings.getInstance().getSelectedImageUri() != null) { Bitmap galleryBitmap = null; try { galleryBitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), WatermarkSettings.getInstance().getSelectedImageUri()); } catch (IOException e) { e.printStackTrace(); } backImageView.setImageBitmap(galleryBitmap); pickImageFromGallery(); } else { Toast.makeText(getActivity(),"Выберите фоновое изображение!",Toast.LENGTH_LONG).show(); } watermarkImageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getAction()){ case MotionEvent.ACTION_DOWN: View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); view.startDrag(null, shadowBuilder, view, 0); //view.setVisibility(View.INVISIBLE); break; case MotionEvent.ACTION_UP: //Toast.makeText(getActivity(), "ACTION_UP", Toast.LENGTH_SHORT).show(); break; case MotionEvent.ACTION_MOVE: //Toast.makeText(getActivity(), "ACTION_MOVE", Toast.LENGTH_SHORT).show(); break; } return true; } }); watermarkImageView.setOnDragListener(new View.OnDragListener() { @Override public boolean onDrag(View view, DragEvent dragEvent) { switch (dragEvent.getAction()) { case DragEvent.ACTION_DRAG_STARTED: Display display = getActivity().getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; int height = size.y; int x = (int)dragEvent.getX(); int y = (int)dragEvent.getY(); Log.d("Drad Log: ","Старт. Касание x: " + x + " y: " + y); Log.d("Drad Log: ","Размер экрана. ширина: " + width + " высота: " + height); break; case DragEvent.ACTION_DROP: break; case DragEvent.ACTION_DRAG_ENTERED: break; case DragEvent.ACTION_DRAG_EXITED: float X1 = dragEvent.getX(); float Y1 = dragEvent.getY(); view = (View) dragEvent.getLocalState(); view.setX(X1 - (view.getWidth() / 2)); view.setY(Y1 - (view.getHeight() / 2)); view.setVisibility(View.VISIBLE); break; case DragEvent.ACTION_DRAG_ENDED: break; default: break; } return true; } }); return v;
}
-
Try this code to move:
ImageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent event) { switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: dX = view.getX() - event.getRawX(); dY = view.getY() - event.getRawY(); break; case MotionEvent.ACTION_MOVE: view.animate() .x(event.getRawX() + dX) .y(event.getRawY() + dY) .setDuration(0) .start(); break; case MotionEvent.ACTION_UP: break; default: return false; } return true; }
});
I'm moving fairly smoothly in this way.