Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自定义视图已调用setOnTouchListener,但未重写performClick(类扩展活动而不是视图)_Java_Android_Opencv - Fatal编程技术网

Java 自定义视图已调用setOnTouchListener,但未重写performClick(类扩展活动而不是视图)

Java 自定义视图已调用setOnTouchListener,但未重写performClick(类扩展活动而不是视图),java,android,opencv,Java,Android,Opencv,我创建了一个Android活动,实现了一点OpenCV。它所做的只是创建一个自定义的相机视图,当触摸屏幕时,照片将被保存 我唯一的问题是代码mOpenCvCameraView.setOnTouchListener(MainActivity.this)包含警告 mOpenCvCameraView.setOnTouchListener(MainActivity.this)警告 自定义视图com/example/zcameratestv2/Version2CameraView已对其调用setOnTou

我创建了一个Android活动,实现了一点OpenCV。它所做的只是创建一个自定义的相机视图,当触摸屏幕时,照片将被保存

我唯一的问题是代码
mOpenCvCameraView.setOnTouchListener(MainActivity.this)包含警告

mOpenCvCameraView.setOnTouchListener(MainActivity.this)警告

自定义视图com/example/zcameratestv2/Version2CameraView已对其调用setOnTouchListener,但未覆盖performClick

与其他问题不同,我的类扩展了活动而不是视图,因此当我尝试重写函数
private boolean performClick(){…super.performClick();}
时,无法识别它。这是我的课

package com.example.zcameratestv2;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.core.Mat;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnTouchListener;
import android.widget.Toast;

public class MainActivity extends Activity implements CvCameraViewListener, OnTouchListener {

private Version2CameraView mOpenCvCameraView;
private static final String TAG = "Version 2::Activity";

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status) {
            case LoaderCallbackInterface.SUCCESS:
            {
                Log.i(TAG, "OpenCV loaded successfully");
                mOpenCvCameraView.enableView();
                mOpenCvCameraView.setOnTouchListener(MainActivity.this);
            } break;
            default:
            {
                super.onManagerConnected(status);
            } break;
        }
    }
};

public MainActivity() {
    Log.i(TAG, "Version 2 Class instantiated");
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    setContentView(R.layout.activity_main);

    mOpenCvCameraView = (Version2CameraView) findViewById(R.id.java_surface_view);

    mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);

    mOpenCvCameraView.setCvCameraViewListener(this);

}

public void onPause()
{
    super.onPause();
    if (mOpenCvCameraView != null)
        mOpenCvCameraView.disableView();
}

@Override
public void onResume()
{
    super.onResume();
    OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
}

public void onDestroy() {
    super.onDestroy();
    if (mOpenCvCameraView != null)
        mOpenCvCameraView.disableView();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
public void onCameraViewStarted(int width, int height) {
    // TODO Auto-generated method stub

}

@Override
public void onCameraViewStopped() {
    // TODO Auto-generated method stub

}

@Override
public Mat onCameraFrame(Mat inputFrame) {
    // TODO Auto-generated method stub
    return null;
}

@SuppressLint("SimpleDateFormat")
@Override
public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        //some code....
        break;
    case MotionEvent.ACTION_UP:
        Log.i(TAG,"onTouch event");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
        String currentDateandTime = sdf.format(new Date());
        String fileName = Environment.getExternalStorageDirectory().getPath() +
                               "/sample_picture_" + currentDateandTime + ".jpg";
        mOpenCvCameraView.takePicture(fileName);
        Toast.makeText(this, fileName + " saved", Toast.LENGTH_SHORT).show();
        v.performClick();
        break;
    default:
        break;
    }
    return true;
 }


}
以前,
公共布尔onTouch(视图v,MotionEvent事件)
事件有一个类似于OnTouchListener的警告,它显示我应该使用performClick();方法,但我无法重写它,因为我扩展到
活动
而不是
视图
。我发现应用
v.PerformClick()修复了这个问题

另一个类处理摄影机进程

package com.example.zcameratestv2;

import java.io.FileOutputStream;

import org.opencv.android.JavaCameraView;

import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.util.AttributeSet;
import android.util.Log;

public class Version2CameraView extends JavaCameraView implements PictureCallback {

private static final String TAG = "Version2::CameraView";
private String mPictureFileName;

public Version2CameraView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public void takePicture(final String fileName) {
    Log.i(TAG, "Taking picture");
    this.mPictureFileName = fileName;
    // Postview and jpeg are sent in the same buffers if the queue is not empty when performing a capture.
    // Clear up buffers to avoid mCamera.takePicture to be stuck because of a memory issue
    mCamera.setPreviewCallback(null);

    // PictureCallback is implemented by the current class
    mCamera.takePicture(null, null, this);
}

@Override
public void onPictureTaken(byte[] data, Camera camera) {
    Log.i(TAG, "Saving a bitmap to file");
    // The camera preview was automatically stopped. Start it again.
    mCamera.startPreview();
    mCamera.setPreviewCallback(this);

    // Write the image in a file (in jpeg format)
    try {
        FileOutputStream fos = new FileOutputStream(mPictureFileName);

        fos.write(data);
        fos.close();

    } catch (java.io.IOException e) {
        Log.e("PictureDemo", "Exception in photoCallback", e);
    }

}
}
我已经在清单文件中包括了所需的权限,如摄像头和写入外部存储

有人能确定这个问题吗?我需要你的帮助。提前谢谢

onTouch()
方法从底层视图获取尚未标记为“已处理”的每个触摸事件。如果您的
Version2CameraView
不处理触摸事件,则会在活动中处理这些事件,并且您的
Version2CameraView
将作为
View v
参数传递

不幸的是,您的
JavaCameraView
没有覆盖
performClick()
,但您正在尝试在此视图上调用它。解决方案将此方法添加到
Version2CameraView
类:

@Override
public boolean performClick() {
    // do what you want
    return true;
}

您需要添加一个方法来处理触摸事件,因为您的视图已经调用了
setOnTouchListener()
,添加对默认方法的覆盖,确保在内部调用super方法以避免类似“方法不覆盖其超类中的方法”这样的错误,如果您不打算在其中处理触摸事件,则可以将其保留为我的示例:

@Override
public boolean performClick() {
    super.performClick();
    return true;
}

我觉得有点晚了,但解决办法很简单。类,如
按钮
文本视图
视图
的子类,以及
SurfaceView
,后者是
JavaCameraView
Version2CameraView
子类的父类

那有什么区别呢? 区别在于
TextView
实现了一个“ViewTreeObserver.OnPreDrawListener”接口。因此,按钮(它是
TextView
的子类)可以覆盖
performClick()
方法

如何处理我的
Version2CameraView
类?
只需实现一个接口来重写
performClick()
方法

哪一个,
ViewTreeObserver.OnPreDrawListener
不,您应该像这样使用
SurfaceHolder.Callback

public class Version2CameraView extends JavaCameraView implements PictureCallback, SurfaceHolder.Callback 
{
    ...
   /**
     * Process the MotionEvent.
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        synchronized (getHolder()) {
            // Do something
            ...
            return true;
        }
    }

    @Override
    public boolean performClick() {
        // Calls the super implementation, which generates an AccessibilityEvent
        // and calls the onClick() listener on the view, if any
        super.performClick();

        // Handle the action for the custom click here

        return true;
    }
    ...
}

此解决方案必须删除您的警告。

当我在类中添加performClick函数(如上所述)时,它会显示“方法不会从其超类重写方法”(错误)和“performClick从未使用”。我的类实现了onTouchListener,我使用v.perfumrclick()实现了onTouch函数;在…内我错过了什么?在上次Android Studio更新之前,它运行良好……你找到解决方案了吗?这是谷歌的狗屎。在方法定义之前使用@SuppressLint(“ClickableViewAccessibility”),或创建自定义视图: