OnTouchListener reagiert nicht

  • Antworten:3
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 8

08.06.2016, 12:00:42 via Website

Hallo, ich bin gerade dabei ein Ping Pong Spiel zu programmieren und die Schläger mittels OnTouchListener zu bewegen. Leider klappt das noch nicht so ganz. Wenn ich das Programm starte, werden zwar die Schläger angezeigt und der Ball flitzt hin und her, aber die App reagiert auf keine der TouchEvents.
Hier mein Code:

public class MainActivity extends AppCompatActivity implements View.OnTouchListener{

float x, y;
Grafik grafik;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    grafik = new Grafik(this);

    grafik.setOnTouchListener(this);
    Log.d("Test","Bin im onCreate, Klasse Main", null);


}

@Override
public boolean onTouch(View v, MotionEvent event) {
    int action = event.getAction();
    Log.d("Test","Bin im onTouch, Klasse Main", null);
    switch (action){
        case MotionEvent.ACTION_DOWN:
            grafik.paddleOneX = event.getX();
            grafik.paddleOneY = event.getY();
            Toast.makeText(getApplicationContext(),"Action Down", Toast.LENGTH_SHORT).show();
            break;
        case MotionEvent.ACTION_MOVE:
            grafik.paddleOneX = event.getX();
            grafik.paddleOneY = event.getY();
            break;
        case MotionEvent.ACTION_UP:
            grafik.paddleOneX = event.getX();
            grafik.paddleOneY = event.getY();

            break;
    }

    return true;
}

}

public class Grafik extends View{

Bitmap ball, paddleOne, paddleTwo;
int x, y;
boolean directionXPlus = true;
boolean directionXMinus = true;
final String TAG = "Tescht";
float posX, posY;
float paddleOneX, paddleOneY, paddleTwoX, paddleTwoY;

public Grafik(Context context) {
    super(context);
    init(null, 0);
}

public Grafik(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(attrs, 0);
}

public Grafik(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(attrs, defStyleAttr);
}

private void init(AttributeSet attrs, int i) {

    paddleOne = BitmapFactory.decodeResource(getResources(), R.drawable.tennisschlaeger);
    paddleTwo = BitmapFactory.decodeResource(getResources(), R.drawable.tennisschlaeger);



    ball = BitmapFactory.decodeResource(getResources(), R.drawable.tennisball);
    x = y = 0;
    paddleOneX = 300;
    paddleOneY = 30;
    paddleTwoX = 300;
    paddleTwoY = 800;
    Log.d("Test","Bin im init, Klasse Grafik", null);
    Toast.makeText(getContext(),"paddleOneX = " + paddleOneX, Toast.LENGTH_LONG).show();
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    canvas.drawColor(Color.BLACK);

    if (((x < (canvas.getWidth()) - ball.getWidth())) && directionXPlus == true )
    {
        x += 5;

    }else{
        x = x - 5;
        directionXPlus = false;
    }
    if ((x > 0) && directionXPlus == false ){
        x -= 5;

    }else{
        x = x + 5;
        directionXPlus = true;
    }

    if ((y < (canvas.getHeight()) - ball.getHeight()) && directionXMinus == true ){
        y += 5;

    }else{
        y -= 5;
        directionXMinus = false;
    }
    if ((y > 0) && directionXMinus == false ){
        y -= 5;

    }else{
        y += 5;
        directionXMinus = true;
    }

    canvas.drawBitmap(ball, x, y, null);
    canvas.drawBitmap(paddleOne, paddleOneX, paddleOneY, null);
    canvas.drawBitmap(paddleTwo, paddleTwoX, paddleTwoY, null);
    Log.d("Test","Bin im onDraw, Klasse Grafik", null);

    invalidate();

}

}
Und noch die XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.vince.myapplication.MainActivity">

<com.example.vince.myapplication.Grafik
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="Spieler 1"
    android:id="@+id/tv_player_1"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true"
    android:layout_marginStart="36dp"
    android:layout_marginTop="35dp"
    android:textColor="#ffffff" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="Spieler 2"
    android:id="@+id/tv_player_2"
    android:layout_alignParentBottom="true"
    android:layout_alignParentEnd="true"
    android:layout_marginEnd="29dp"
    android:layout_marginBottom="31dp"
    android:textColor="#ffffff" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="Score"
    android:id="@+id/tv_score_2"
    android:textColor="#ffffff"
    android:layout_alignTop="@+id/tv_player_1"
    android:layout_alignEnd="@+id/tv_player_2" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="Score"
    android:id="@+id/tv_score_1"
    android:textColor="#ffffff"
    android:layout_alignTop="@+id/tv_player_2"
    android:layout_alignStart="@+id/tv_player_1" />

Hat einer von euch einen Tipp für mich wo der oder die Fehler liegt/liegen?

Grüß euch

Vincenzo

Antworten
  • Forum-Beiträge: 359

08.06.2016, 13:26:10 via Website

Wir die Ontouch methode überhaupt nicht aufgerufen?
Kannst du den Listener nicht direkt auf die Aktivity setzten mal schauen was dann passiert?
Noch was....
der Stil ist grausig....
Versuche wenigstens das MVC einzuhalten. Und schreibe keine Inneren Klassen wenn nicht notwenig...
Da geht ja alles kreuz und quer XD

Gruß

— geändert am 08.06.2016, 13:27:11

Antworten
  • Forum-Beiträge: 8

08.06.2016, 13:54:46 via Website

Hallo Fabian,
die Klasse Grafik ist keine innere Klasse und wird der Listener nicht mit "grafik.setOnTouchListener(this);" in der onCreate Methode der Activity aufgerufen?

Grüße

Antworten
  • Forum-Beiträge: 8

08.06.2016, 17:12:34 via Website

Hallo,
hab es selbst hingekriegt, indem ich den onTouch Listener auf das Relative Layout gesetzt hab.

public class MainActivity extends AppCompatActivity {
RelativeLayout layout;
ImageView imageOne, imageTwo;

DisplayMetrics displaymetrics = new DisplayMetrics();

//getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
float height;
float width;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
    getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
    height = displaymetrics.heightPixels - 150;
    width = displaymetrics.widthPixels;

    layout = (RelativeLayout) findViewById(R.id.layout);
    imageOne = (ImageView) findViewById(R.id.paddle_one);
    imageTwo = (ImageView) findViewById(R.id.paddle_two);

    Log.d("Test","Canvas Breite ist gleich " + width, null);
    Log.d("Test","Canvas Höhe ist gleich " + height, null);

    layout.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            int action = event.getAction();

            switch (action){
                case MotionEvent.ACTION_DOWN:
                    if (event.getY() < height/3) {
                        imageOne.setX(event.getX());
                        imageOne.setY(event.getY());
                    }else if (event.getY() > (height - height/3)){
                        imageTwo.setX(event.getX());
                        imageTwo.setY(event.getY());
                    }
                    Log.d("Test","Bin im ActionDown, Klasse Main", null);
                    break;
                case MotionEvent.ACTION_UP:
                    if (event.getY() < height/3) {
                        imageOne.setX(event.getX());
                        imageOne.setY(event.getY());
                    }else if (event.getY() > (height - height/3)){
                        imageTwo.setX(event.getX());
                        imageTwo.setY(event.getY());
                    }
                    break;
                case MotionEvent.ACTION_MOVE:
                    if (event.getY() < height/3) {
                        imageOne.setX(event.getX());
                        imageOne.setY(event.getY());
                    }else if (event.getY() > (height - height/3)){
                        imageTwo.setX(event.getX());
                        imageTwo.setY(event.getY());
                    }
                    break;
            }

            return true;

Antworten

Empfohlene Artikel