单击并按下同一按钮

Click and press-release on same button

我实现了自己的相机来捕捉图像和视频。我想在同一个按钮上执行两个操作。

  1. 单击按钮时我想执行图像捕获代码。
  2. 当我连续按下按钮时,我想开始录音,当我松开按钮时,我想停止录音。

假设我有 3 个方法来完成上述任务,即 captureImage()、startVideo() 和 stopVideo()。

如何在同一个按钮上实现以上两个动作?以上三种方法应该什么时候调用?

我尝试使用 onClick、ACTION_DOWN 和 ACTION_UP,但是,在这种情况下,永远不会调用 onClick。总是 ACTION_DOWN 和 ACTION_UP 被调用。

你可以使用onTouchListener

这将 return 具有所需事件的 MotionEvent ACTION_UP ACTION_DOWN ...

使用 OnTouchListener 和 OnClickListener :

View v = find....;
    v.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //capture();
        }
    });
    v.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            int action = motionEvent.getAction();

            if(action==MotionEvent.ACTION_DOWN)startRecording();
            if(action==MotionEvent.ACTION_UP)stopRecording();
            return true;//return true to avoid onClick...
        }
    });
}

我就是这样解决的。 On ACTION_DOWN 1 秒后开始录像。在 ACTION_UP 检查您是否正在捕获视频然后停止捕获,否则捕获图像并取消视频捕获处理程序。

private Runnable mRunnable = new Runnable() {
    @Override
    public void run() {
        isImage = false;
        startRecording();
    }
};


mCaptureButton.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    // Start recording after 1 sec
                    isImage = true;
                    mHandler = new Handler();
                    mHandler.postDelayed(mRunnable, 1000);
                    break;
                case MotionEvent.ACTION_UP:
                    // If video recording was started after 1 sec delay then stop recording
                    // otherwise capture image
                    if(isImage) {
                        // Cancel handler for video recording
                        mHandler.removeCallbacks(mRunnable);
                        // Capture image
                        mCamera.takePicture(null, null, mPicture);
                    } else {
                        // Stop video recording
                        stopRecording();

                    }
                    break;
            }
            return true;
        }
    });