Android-студия SurfaceView onTouchEvent

У меня есть SurfaceView в моей активности xml, и я хочу получить некоторую информацию при нажатии на SurfaceView. Для этого у меня есть класс, как показано ниже

class ImageTable extends SurfaceView implements SurfaceHolder.Callback {

 public ImageTable(Context context, SurfaceView surfaceView) {
        super(context);

        surfaceHolder =  surfaceView.getHolder();//getHolder();//
        surfaceHolder.addCallback(this);
        this.context = context;
        setFocusable(true);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.i(TAG,String.valueOf( event.getAction())+"asd");
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                
                break;
            case MotionEvent.ACTION_MOVE:
                
                break;

            case MotionEvent.ACTION_UP:

                break;
        }
    return true;
    }
}


моя деятельность


public class SubmitActivity extends AppCompatActivity {

SurfaceView test;

protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_submit);
        test = findViewById(R.id.cylindersImage);
        context = this;

        imageTable = new ImageTable(this,test);
}
}

и xml-файл


<?xml version = "1.0" encoding = "utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    xmlns:app = "http://schemas.android.com/apk/res-auto"
    xmlns:tools = "http://schemas.android.com/tools"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent">


    <SurfaceView
        android:id = "@+id/cylindersImage"
        android:layout_width = "358dp"
        android:layout_height = "219dp"
        app:layout_constraintBottom_toBottomOf = "parent"
        app:layout_constraintEnd_toEndOf = "parent"
        app:layout_constraintHorizontal_bias = "0.49"
        app:layout_constraintStart_toStartOf = "parent"
        app:layout_constraintTop_toTopOf = "parent"
        app:layout_constraintVertical_bias = "0.05">

    </SurfaceView>
</androidx.constraintlayout.widget.ConstraintLayout>

onTouchEvent не работает таким образом, но если я устанавливаю его с помощью test.setOnTouchListener(...), он работает. Я думаю, что я должен связать тест SurfaceView с ImageTable, но я не знаю, как это сделать. Я также использую некоторые коды рисования в ImageTable, и они работают правильно, все отображается в тесте SurfaceView.

Если я не объявляю какой-либо SurfaceView в XML-файле и делаю setContenView(new ImageTable(...)) и устанавливаю SurfaceHolder как SurfaceHolder surfaceHolder = getHolder(), событие работает.

0
0
12
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Прежде всего, реализуйте интерфейс View.OnTouchListener в классе представления. После этого подключите представление и слушатель. Также не забывайте о случае ACTION_CANCEL

public class SubmitActivity extends AppCompatActivity implements View.OnTouchListener // implement interface {

SurfaceView test;

protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_submit);
        test = findViewById(R.id.cylindersImage);
        context = this;

        imageTable = new ImageTable(this,test);
        imageTable.setOnTouchListener(this) // connect interface and view
}

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.i(TAG,String.valueOf( event.getAction())+"asd");
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                
                break;
            case MotionEvent.ACTION_MOVE:
                
                break;

            case MotionEvent.ACTION_UP:

                break;
            case MotionEvent.ACTION_CANCEL:
                // usually handles when you make fast moves with finger
                // don't forget about it, it handles often
                break;
        }
    return true;
    }

}
 
class ImageTable extends SurfaceView implements SurfaceHolder.Callback {

 public ImageTable(Context context, SurfaceView surfaceView) {
        super(context);

        surfaceHolder =  surfaceView.getHolder();//getHolder();//
        surfaceHolder.addCallback(this);
        this.context = context;
        setFocusable(true);
    }
}

Итак, если вы хотите реализовать это в классе ImageTable, попробуйте сделать так

class ImageTable extends SurfaceView implements SurfaceHolder.Callback, View.OnTouchListener {

 public ImageTable(Context context, SurfaceView surfaceView) {
        super(context);

        surfaceHolder =  surfaceView.getHolder();//getHolder();//
        surfaceHolder.addCallback(this);
        this.context = context;
        setFocusable(true);


        surfaceView.setOnTouchListener(this);
    }
}

@Override
    public boolean onTouchEvent(MotionEvent event) {
    ...implement event....


Спасибо за этот полезный ответ. У меня это работает, но я хочу сделать это в ImageTable, так как я могу использовать this, поэтому я реализовал его в ImageTable, а затем переопределил функции. onTouch работал, но onTouchEvent снова не работал, могу ли я использовать onTouch вместо onTouchEvent? Или что мне делать, чтобы использовать onTouchEvent в ImageTable?

Wtow 15.05.2022 16:16

Я отредактировал свой основной ответ, попробуйте использовать последнее добавленное сообщение

Nursultan Almakhanov 15.05.2022 16:55

Спасибо за это, у вас есть какие-либо идеи о том, почему onTochEvent не работает, а onTouch работает?

Wtow 15.05.2022 17:38

Другие вопросы по теме