Не удается разрешить символ setOnTouchListener

Я хочу установить событие касания, которое происходит только при касании объекта игрока. Но почему мой класс игрока до сих пор не может использовать метод setOnTouchListener? Я поместил его в основной класс, который расширяет SurfaceView и реализует SurfaceHolder.Callback, он говорит, что не может разрешить символ на

player.setOnTouchListener(new View.OnTouchListener){
        public boolean onTouch(View v, MotionEvent event) {
            return true;
        }
    }; 

Мой класс игрока расширяет GameObject (это просто абстрактный класс, содержащий свойства объекта) и реализует View.OnTouchListener. Я также переопределил метод в самом классе игрока.

@Override
    public boolean onTouch(View v, MotionEvent event) {
        return true;
    }

Есть идеи? Спасибо.

РЕДАКТИРОВАТЬ:

@Override
public void surfaceCreated(SurfaceHolder holder){
    bg = new Background(BitmapFactory.decodeResource(getResources(),R.drawable.background));
    player = new Player(BitmapFactory.decodeResource(getResources(),R.drawable.character),WIDTH/2,HEIGHT/2+40,80,75,14);
    safeArea = new SafeArea(WIDTH/2,HEIGHT/2,100,40);
    bouncer = new ArrayList<Bouncer>();

    thread = new MainThread(getHolder(), this);

    //Start the game loop
    thread.setRunning(true);
    thread.start();
    setOnTouchListener(player);
}

person user3411184    schedule 28.05.2015    source источник
comment
Как выглядит ваш импорт?   -  person Kristy Welsh    schedule 28.05.2015
comment
в классе игрока: import android.graphics.Bitmap; импортировать android.graphics.Canvas; импортировать android.view.MotionEvent; импортировать android.view.View; @KristyWelsh   -  person user3411184    schedule 28.05.2015


Ответы (2)


Как вы сказали, класс player реализует View.OnTouchListener. Очевидно, что class View.OnTouchListener не имеет метода setOnTouchListener().

Вы должны пересмотреть свое намерение. Вы хотите, чтобы player вместо этого реализовывал View? Или чей OnTouchListener вы хотите установить на самом деле?

Поскольку ваш «основной класс» расширяет SurfaceView, похоже, вам может понадобиться

setOnTouchListener(player);

который устанавливает player в качестве OnTouchListener экземпляра «основного класса», который также является SurfaceView и, следовательно, View.

Чтобы определить player.onTouch(), вы должны определить его внутри класса Player, например:

class Player implements View.OnTouchListener // extends GameObject ?
{
    // ...
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return true;
    }
}
person timrau    schedule 28.05.2015
comment
Я попытался реализовать только View, но он говорит, что здесь ожидается интерфейс, поэтому вместо этого я попытался реализовать View.OnTouchListener и подумал, что это будет то же самое. Тогда мой плохой, так есть ли какое-нибудь решение для этого? Спасибо - person user3411184; 28.05.2015
comment
@ user3411184 Обновлено. View можно только расширить, но вы расширили GameObject. Таким образом, я угадываю ваше намерение, как описано в моем ответе. - person timrau; 28.05.2015
comment
вау, спасибо, я думаю, что это начинает работать, но еще один шаг, как вызвать функцию onTouch? так как теперь мы больше не устанавливаем функцию onTouch внутри метода setOnClickListener. - person user3411184; 28.05.2015
comment
С setOnTouchListener(player); player.onTouch() вызывается, когда событие касания отправляется в представление, представленное вашим экземпляром основного класса, как описано в Документация по Android. - person timrau; 28.05.2015
comment
Извините за незнание, но какой элемент мне нужно передать в параметр события View v и MotionEvent метода onTouch? Я также написал общедоступное логическое значение onTouch (View v, событие MotionEvent) {return true;} - person user3411184; 28.05.2015
comment
Вы не звоните onTouch() сами. Система Android вызывает его для вас, когда происходит событие. - person timrau; 28.05.2015
comment
Извините, я сейчас не совсем ясно выразился, но я отредактировал свой пост, чтобы вы могли видеть мой основной класс. проблема, с которой я столкнулся сейчас, заключается в том, что он говорит, что метод onTouch никогда не используется. Есть ли еще что-то, что я сделал неправильно? Я также запустил свой код и сделал Toast.makeText, чтобы увидеть, работает ли он, но это не так. Спасибо! - person user3411184; 28.05.2015
comment
Я запутался в том, что вы хотите. Если вы хотите, чтобы основной класс onTouch() вызывался, когда происходит событие касания (не player.onTouch()!), тогда вы должны сделать основной класс, реализующий interface View.OnTouchListener и вызывающий setOnTouchListener(this). Пожалуйста, убедитесь, кто должен быть слушателем, чтобы соответствовать вашим намерениям. - person timrau; 28.05.2015
comment
Мне очень жаль, вы правильно поняли мое намерение, я забыл написать player.onTouch() вместо onTouch(). но это все еще не работает, не могли бы вы снова увидеть мой отредактированный пост и сказать мне, как это исправить? Большое спасибо и извините - person user3411184; 28.05.2015
comment
@user3411184 user3411184 Описал, как правильно определить Player.onTouch(). - person timrau; 28.05.2015

Попробуй это

    OnTouchListener X_ol = new OnTouchListener() {
   @Override

    public boolean onTouch(View p_v, MotionEvent p_event) {

       if (event.getAction() == MotionEvent.ACTION_DOWN ) {
        //Insert desired code here
        return true;
    }
    return false;
    }
};

player.setOnTouchListener(X_ol);

 }
person jalu    schedule 13.09.2017