Search code examples
javaandroidandroid-studiodrag-and-dropdraggable

Drag button called view whats wrong and how to solve it


Hi guys can plz help me in this case i want to drag a button called view , i set up the code like u see down there , but i still can't drag it , can u give me diffident solutions plz with a good explication

public class MainActivity extends Activity {

    private Timer _timer = new Timer();

    private LinearLayout linear1;
    private Button view;
    private Button btn2;
    private Button widgets;
    private TextView textview1;

    private TimerTask mm;
    @Override
    protected void onCreate(Bundle _savedInstanceState) {
        super.onCreate(_savedInstanceState);
        setContentView(R.layout.main);
        initialize();
        initializeLogic();
    }

    private void initialize() {

        linear1 = (LinearLayout) findViewById(R.id.linear1);
        view = (Button) findViewById(R.id.view);
        btn2 = (Button) findViewById(R.id.btn2);
        widgets = (Button) findViewById(R.id.widgets);
        textview1 = (TextView) findViewById(R.id.textview1);

        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                view.setOnDragListener( new View.OnDragListener() {
                    PointF DownPT = new PointF();
                    PointF StartPT = new PointF();
                    @Override public boolean onDrag(View v, android.view.DragEvent event) {
                        int dragEvent = event.getAction();
                        switch (dragEvent) {
                            case android.view.DragEvent.ACTION_DRAG_STARTED :
                            DownPT.x = event.getX();
                            DownPT.y = event.getY();
                            StartPT = new PointF( view.getX(), view.getY() ); break;

                            case android.view.DragEvent.ACTION_DRAG_LOCATION :
                            PointF mv = new PointF( event.getX() - DownPT.x, event.getY() - DownPT.y);
                            view.setX((int)(StartPT.x+mv.x)); view.setY((int)(StartPT.y+mv.y));
                            StartPT = new PointF( view.getX(), view.getY() ); break;

                            case android.view.DragEvent.ACTION_DRAG_ENTERED :

                            case android.view.DragEvent.ACTION_DRAG_EXITED :
                            break;
                            case android.view.DragEvent.ACTION_DROP : break;
                            default : break;
                        }
                        return true;
                    }
                });

i need a good explication guys , cause i need to understand the problem , thank u for taking time to help me ! and i need to know whats the different solution to fix this problem guys


Solution

  • Implement this outside the onClick method :-

      view.setOnDragListener( new View.OnDragListener() {
                    PointF DownPT = new PointF();
                    PointF StartPT = new PointF();
                    @Override public boolean onDrag(View v, android.view.DragEvent event) {
                        int dragEvent = event.getAction();
                        switch (dragEvent) {
                            case android.view.DragEvent.ACTION_DRAG_STARTED :
                            DownPT.x = event.getX();
                            DownPT.y = event.getY();
                            StartPT = new PointF( view.getX(), view.getY() ); break;
    
                            case android.view.DragEvent.ACTION_DRAG_LOCATION :
                            PointF mv = new PointF( event.getX() - DownPT.x, event.getY() - DownPT.y);
                            view.setX((int)(StartPT.x+mv.x)); view.setY((int)(StartPT.y+mv.y));
                            StartPT = new PointF( view.getX(), view.getY() ); break;
    
                            case android.view.DragEvent.ACTION_DRAG_ENTERED :
    
                            case android.view.DragEvent.ACTION_DRAG_EXITED :
                            break;
                            case android.view.DragEvent.ACTION_DROP : break;
                            default : break;
                        }
                        return true;
                    }
                });
    

    Not inside the onClick(). Hope this helps.