javaandroidmotioneventonlongclicklistenerontouch

Drag a view onLongClick and start activity onClick


I'm banging my head with this problem which probably is simple but since I'm new to this topic I somehow haven't been able to figure it out yet.

I've successfully implemented dragging a view with onTouch method. I've also successfully implemented onLongClick and onClick methods. But both of these functionalities were implemented separately.

The problem, like the title says is when I want to join these functionalities. I want the onTouch method to be called when a user long clicks a view and I want a new activity to start when a user clicks a view.

Here is the pseudo code:

  public class Website extends AppCompatActivity implements View.OnTouchListener{

    TextView longpress;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_website);

    longpress = (TextView) findViewById(R.id.longpress);
    longpress.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View view){
           //I don't really know how to do this part
           onTouch(View view, Motion Event event);
           return true;
        }
    });
    longpress.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
            //Code for new activity comes here (I know how to do this part)
        }
    });
    }

     public boolean onTouch(View view, MotionEvent event) {
        switch(event.getAction(){
           case MotionEvent.ACTION_DOWN:
                //Save initial coordinates of view <-- view.getX(), view.getY() 
                break;
           case MotionEvent.ACTION_MOVE:
                //Calculate dX and dY and setX and Y of the view (move view)
                break;
           case MotionEvent.ACTION_UP:
                //If view is certain distance away from initial points do something
                break;
        }
    }
}

Like I said, onTouch works on itself if I don't try to call it from onLongClick method. If I try to call onTouch(View view, MotionEvent event) from onLongClick method the problem occurs because onLongClick only receives one out of two arguments onTouch method should receive (onLongClick only receives view argument but it should also receive event argument).

Maybe I'm trying to do this in a totally wrong way but I have been looking at some documentation e.g. https://developer.android.com/training/gestures/ but still won't get an idea what to do.

(I would like to have a similar functionality to notifications on android phones)


Solution

  • So I've come to a solution which might or might not be a good one but for now it serves my functionality. If someone has a better solution and thinks mine is bad in some way please say so.

    Here is the code:

    boolean flag;
    public boolean onTouch(View view, MotionEvent event){
        int action = event.getAction() & MotionEvent.ACTION_MASK;
            if(action == MotionEvent.ACTION_DOWN){
                //do something on a down press
                flag = true;
                return true;
            }
            if(action == MotionEvent.ACTION_UP && flag == true){
                //do something if we move finger away from screen we 
                //didn't move the view first
    
                return true;
            }
            if(action == MotionEvent.ACTION_UP && flag == false){
                //do something if we move finger away from screen and we moved 
                //the view before we moved the finger away from screen
            }
            if(action == MotionEvent.ACTION_MOVE){
                //do something when moving the view
                flag = false;
            }