如何在android中的同一视图上使用OnClick、OnLongClick和OnTouch?

问题描述

我正在开发 android 应用程序,其中需要在同一视图上实现 OnClickOnLongClickOnTouch,然后搜索了很多,最后得到了我与您分享的结果举个例子。

解决方法

您必须将以下侦听器添加到所需的视图中。

        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;
            }
        });

使用函数启用如下所示的视图拖动。

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

以下代码用于 OnTouchListener 视图,因此我已将其放在单独的类中。

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;
            }
        });
    }
}