how to use OnClick,OnLongClick And OnTouch On Same View In android?

150 views Asked by At

i am developing android app in which, need to implement OnClick,OnLongClick And OnTouch on same view then searched lot and at the end got the result which i am sharing with you with example.

1

There are 1 answers

0
Chirag Thummar On

you have to add the below listener to the view its required.

        yourview.setOnClickListener(new FrameLayout.OnClickListener() {
            @Override
            public void onClick(View v) {
                parentCardLayout_OnClick();
            }
        });

        yourview.setLongClickable(true);

        yourview.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                showCameraSettingDialog();
                return false;
            }
        });

enable the view dragging like below using function.

viewDragUtil.makeDraggable(parentCardLayout, Draggable.STICKY.NONE, false, this);
viewDragUtil.isDragEnabled = true;

the below code is for OnTouchListener of view so that i have made it in separate class.

import android.os.Handler;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

import static android.content.ContentValues.TAG;

public class DraggableUtils {

    //Draggable view code
    float widgetInitialX = 0f;
    float widgetDX = 0f;
    float widgetInitialY = 0f;
    float widgetDY = 0f;
    public static boolean isDragEnabled = true;

    /**
     * VARIABLE USED IN ON CLICK CUSTOM LOGIC
     */
    private float initialTouchX;
    private float initialTouchY;

    public boolean goneFlag = false;

    public void makeDraggable(View view, Draggable.STICKY stickyAxis, boolean animated, DraggableListener mDraggableListener) {

        view.setOnTouchListener(new View.OnTouchListener() {


            final Handler handler = new Handler();
            Runnable mLongPressed = new Runnable() {
                public void run() {
                    goneFlag = true;
                    //Code for long click
                    Log.e("TAG", "run: LOOOOOOO");
                    view.performLongClick();
                }
            };


            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (isDragEnabled) {
                    View viewParent = (View) v.getParent();
                    float parentHeight = viewParent.getHeight();
                    float parentWidth = viewParent.getWidth();
                    float xMax = parentWidth - v.getWidth();
                    float xMiddle = parentWidth / 2;
                    float yMax = parentHeight - v.getHeight();
                    float yMiddle = parentHeight / 2;
                    switch (event.getActionMasked()) {
                        case MotionEvent.ACTION_DOWN:

                            goneFlag = false;
                            widgetDX = v.getX() - event.getRawX();
                            widgetDY = v.getY() - event.getRawY();
                            widgetInitialX = v.getX();
                            widgetInitialY = v.getY();

                            initialTouchX = event.getRawX();
                            initialTouchY = event.getRawY();
                            handler.postDelayed(mLongPressed, 500);
                            break;
                        case MotionEvent.ACTION_MOVE:
                            int Xdiff = (int) (event.getRawX() - initialTouchX);
                            int Ydiff = (int) (event.getRawY() - initialTouchY);

                            Log.e(TAG, "onTouch: initialTouchX " + initialTouchX);
                            Log.e(TAG, "onTouch: Xdiff " + Xdiff);
                            Log.e(TAG, "onTouch: event.getRawX() " + event.getRawX());


                            if (!(Math.abs(Xdiff) < 10 && Math.abs(Ydiff) < 10)) {

                                float newX = event.getRawX() + widgetDX;
                                newX = Math.max(0F, newX);
                                newX = Math.min(xMax, newX);
                                v.setX(newX);

                                float newY = event.getRawY() + widgetDY;
                                newY = Math.max(0F, newY);
                                newY = Math.min(yMax, newY);
                                v.setY(newY);
                                mDraggableListener.onPositionChanged(v);

                                //
                                goneFlag = false;
                                Log.e("TAG", "onTouch: Else");
                                handler.removeCallbacks(mLongPressed);
                            }
                            break;
                        case MotionEvent.ACTION_UP:
                            handler.removeCallbacks(mLongPressed);

                            int Xdiff1 = (int) (event.getRawX() - initialTouchX);
                            int Ydiff1 = (int) (event.getRawY() - initialTouchY);
                            if ((Math.abs(Xdiff1) < 10 && Math.abs(Ydiff1) < 10) && !goneFlag) {
                                v.performClick();
                            }
                            break;
                        default:
                            return false;
                    }
                    return true;
                }
                return false;
            }
        });
    }
}