Wie kann ich verhindern dass sich eine ImageView aus dem Bildschirm bewegt?

  • 12 Antworten
  • Neuster Beitrag
  • Schlagworte
    bewegung
D

DerEntwickler

Neues Mitglied
Threadstarter
Hallo,
Ich programmiere momentan ein Spiel in dem sich eine ImageView je nach Neigung des Gerätes nach links oder rechts bewegt. Und jetzt das Problem:

Wenn ich die ImageView nach rechts bewegen lasse ist sie kurz darauf am Rand angelangt und bewegt sich dann aus dem Bildschirm links konnte ich das Problem beheben aber rechts bin ich mittlerweile Ratlos.


Vielen Dank schon mal
Der Entwickler
 
swa00

swa00

Moderator
Teammitglied
Hallo Entwickler,

ohne deinem Animation-Code können wir hier Dir nicht helfen .
Unsere Kristallkugel ist da schon ein wenig leistungsschwach ... :)
 
D

DerEntwickler

Neues Mitglied
Threadstarter
@swa00

Hier ist mein Code:

private void move(){
player.setX(Px);
player.setY(Py);
container.invalidate();
}

Runnable moveRunnable = new Runnable() {

@override
public void run()
{
if(Px >= 0){
if(x >= 1){
Px -= geschwindigkeit;
}else if(x <=-1){
Px += geschwindigkeit;
}
//Anti nicht bewegbar

if(Px == 10){
Px += 10;
}
}


handler = new Handler();
handler.postDelayed(moveRunnable, 50);
move();

}
};
 
swa00

swa00

Moderator
Teammitglied
Hallo,

ich vermisse bei deinem Code zwei Dinge :

a) einen richtigen Thread, damit die UI frei arbeiten kann
b) die Begrenzung ( z.b. eine Abfrage der Bildschirm-Dimensions) - Ohne die wirst du ja nicht wissen können wo schluss ist
 
D

DerEntwickler

Neues Mitglied
Threadstarter
Hier ist deine ganze Code der MainActivity:

int geschwindigkeit = 10;
float x;
float y;
float z;
float MaxX;

Sensor sensor;
SensorManager sensorManager;
Handler handler;
LinearLayout container;
int Px = 550;
int Py = 1500;
ImageView player;
int pixels;


@override
protected void onCreate(Bundle savedInstanceState)
{

super.onCreate(savedInstanceState);
setContentView(R.layout.main);
container = (LinearLayout)this.findViewById(R.id.container);
player = (ImageView)this.findViewById(R.id.img);
move();
handler = new Handler();
handler.postDelayed(moveRunnable, 5);



sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

}


private void move(){
player.setX(Px);
player.setY(Py);
container.invalidate();
}
Runnable moveRunnable = new Runnable() {

@override
public void run()
{
if(Px >= 0){
if(x >= 1){
Px -= geschwindigkeit;
}else if(x <=-1){
Px += geschwindigkeit;
}
//Anti nicht bewegbar

if(Px == 10){
Px += 10;
}
}


handler = new Handler();
handler.postDelayed(moveRunnable, 50);
move();

}
};



public void onResume() {
super.onResume();
sensorManager.registerListener(accelListener, sensor,
SensorManager.SENSOR_DELAY_GAME);
}

public void onStop() {
super.onStop();
sensorManager.unregisterListener(accelListener);
}

SensorEventListener accelListener = new SensorEventListener() {
public void onAccuracyChanged(Sensor sensor, int acc) { }

public void onSensorChanged(SensorEvent event) {
x = event.values[0];
y = event.values[1];
z = event.values[2];
}
};
}
 
swa00

swa00

Moderator
Teammitglied
Ich bleibe bei meinen zwei Aussagen von oben und wo fragst du die Dimensions ab ?
 
D

DerEntwickler

Neues Mitglied
Threadstarter
Wie geht das und wofür ist das gut
 
swa00

swa00

Moderator
Teammitglied
Na du musst doch wissen , wo deine horizontale X Begrenzung des Bildschirmes ist , dazu musst du dir die breite des Bildschirmes ermitteln ..

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
Wenn du schon deine Animation "Zu fuss" machst, dann musst du das Ganze auch in einen Thread setzen
Android background processing with Handlers, AsyncTask and Loaders - Tutorial

Du bekommst so Performance Probleme

Ansonsten würde ich eher zu einer Animation anraten
Adding Animations | Android Developers
 
D

DerEntwickler

Neues Mitglied
Threadstarter
Danke, probiere ich gleich aus
-- Dieser Beitrag wurde automatisch mit dem folgenden Beitrag zusammengeführt --
Das mit dem extra Thread klappt bei mir nicht.
Wie kann ich das Runnable noch einmal im Runnable selbst aufrufen über den Thread?
 
swa00

swa00

Moderator
Teammitglied
Das mit dem extra Thread klappt bei mir nicht.
Wie kann ich das Runnable noch einmal im Runnable selbst aufrufen über den Thread?
Wieso soll das nicht klappen ?
Threads sind eigentlich das A & O der Android Programmierung ...

Ein Runnable innerhalb eines Runnable ist nicht möglich
 
D

DerEntwickler

Neues Mitglied
Threadstarter
Aber wie soll ich die Bewegung dann regelmäßig aufrufen?
 
swa00

swa00

Moderator
Teammitglied
a) Du bastelst dir einen vernünfigen Thread.
b) Darin fragst du deine Sensoren ab und bewegst dein View

P.S Kann es sein , dass du noch recht neu in der Programmierung bist ?
Ich habe eben das Gefühl , dass Dir Grundlagen fehlen , ist das Richtig ?
 
D

DerEntwickler

Neues Mitglied
Threadstarter
Danke aber die meisten Grundlagen kenne ich schon.
Mit Thread und Bildschirm Koordinaten komme ich noch nicht so gut zurecht.
 
Oben Unten