Правильная реализация передачи аргументов
Всех приветствую. Делаю приложение для управления кое-чем с геймпада или с тачскрина телефона.
Есть абстрактный класс Controller с абстрактными методами.
Для класса Gamepad нужен MotionEvent, чтобы определить положение стиков, триггеров и т.д
Для Touchpad нужны кнопки, Seekbar.
Для управления я создаю класс Controller, но вот вопрос:
Как правильно передать onGenericMotion классу Gamepad, а классу Touchpad - кнопку и seekbar?
Имею ввиду, передать так, чтобы в дальнейшем можно было расширить функциональность приложения.
Если как-то передать классу Touchpad прям конкретно 2 класса Seekbar и 1 кнопку - то для расширения функциональности нужно будет переписывать много чего.
Как лучше быть? Ведь не каждый контроллер это геймпад или тачпад
import com.spacetechnoogies.upvehcontroller.ControllerMessage;
public abstract class Controller {
ControllerMessage message;
public ControllerMessage getControllerMessage(){
return this.message;
}
public abstract float getMinThrottle();
public abstract float getMaxThrottle();
public abstract float getMinSteering();
public abstract float getMaxSteering();
}
public class Gamepad extends Controller implements MotionEventListener {
@Override
public void onMotionEvent(MotionEvent event){
if (event.getSource() != InputDevice.SOURCE_DPAD) {
float steering = event.getAxisValue(MotionEvent.AXIS_X);
float throttle = event.getAxisValue(MotionEvent.AXIS_RY);
float brake = event.getAxisValue(MotionEvent.AXIS_RX);
if (throttle > brake) {
message.setReverse(false);
message.setThrottle(throttle);
} else if (throttle < brake) {
message.setReverse(true);
message.setThrottle(brake);
} else {
message.setReverse(false);
message.setThrottle(0.0f);
}
message.setSteering(steering);
}
}
@Override
public float getMinThrottle() {
return 0.0f;
}
@Override
public float getMaxThrottle() {
return 1.0f;
}
@Override
public float getMinSteering() {
return 0.0f;
}
@Override
public float getMaxSteering() {
return 1.0f;
}
}
import android.view.MotionEvent;
import java.util.ArrayList;
import java.util.List;
public class ControllerEventManager {
private List<MotionEventListener> listeners = new ArrayList<>();
public void subscribe(MotionEventListener listener){
listeners.add(listener);
}
public void unsubscribe(MotionEventListener listener){
listeners.remove(listener);
}
public void notify(MotionEvent event){
for (MotionEventListener listener : listeners){
listener.onMotionEvent(event);
}
}
}
public interface MotionEventListener {
void onMotionEvent(MotionEvent event);
}
public class ControllerMessage {
private float throttle;
private float steering;
public float getThrottle() {
return throttle;
}
public void setThrottle(float throttle) {
this.throttle = throttle;
}
public float getSteering() {
return steering;
}
public void setSteering(float steering) {
this.steering = steering;
}
public boolean getIsReverse() {
return isReverse;
}
public void setReverse(boolean reverse) {
isReverse = reverse;
}
private boolean isReverse;
}