У меня есть 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()
, событие работает.
Прежде всего, реализуйте интерфейс 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....
Я отредактировал свой основной ответ, попробуйте использовать последнее добавленное сообщение
Спасибо за это, у вас есть какие-либо идеи о том, почему onTochEvent не работает, а onTouch работает?
Спасибо за этот полезный ответ. У меня это работает, но я хочу сделать это в ImageTable, так как я могу использовать
this
, поэтому я реализовал его в ImageTable, а затем переопределил функции. onTouch работал, но onTouchEvent снова не работал, могу ли я использовать onTouch вместо onTouchEvent? Или что мне делать, чтобы использовать onTouchEvent в ImageTable?