2013-05-28 16 views
6

Ich versuche, ein Bild in einer Android-Aktivität dynamisch zu erstellen und dann zu verschieben. Die Methoden setX() und setY() scheinen jedoch nicht korrekt zu funktionieren. Es legt die Position eines Bildes korrekt fest, wenn es erstellt und platziert wird, aber jeder Versuch, es zu aktualisieren, führt dazu, dass das Bild an der falschen Stelle platziert wird. Zum Beispiel bewegt sich das Bild auf dem folgenden Code:Android setX() und setY() verhält sich seltsam

ImageView image; 
RelativeLayout layout = (RelativeLayout)findViewById(R.id.activity_this); 

if(action == MotionEvent.ACTION_DOWN){ 

    image = new ImageView(MyClass.this);        
    layout.addView(image, width, height); 
    image.setX(206); 
    image.setY(206); 
} 
else if(action == MotionEvent.ACTION_MOVE){ 

    if(image != null){ 
     image.setX(206); 
     image.setY(206); 
    } 
} 

Auf ACTION_MOVE wird das Bild bewegt, obwohl der x- und y-Positionswert gleich bleiben. Der Elternteil des Bildes bleibt gleich. Die Größe bleibt gleich. Wenn ich die x- und y-Werte erhalte, wird es immer noch 206 heißen, aber es wird nicht mehr bei (206, 206) auf der Aktivität platziert. Ich bin verloren, warum dies geschieht. Ich kann keinen Hinweis darauf finden, dass das Bild verändert wurde, außer dass es seinen Standort physisch ändert.

Antwort

13

Eigentlich sollte dies nicht passieren. Versuchen Sie alternativ, eine andere Variable zu setzen und x und y darauf zu setzen, oder holen Sie sich x und erhalten Sie y, und fügen Sie jedem einzelnen eine 0 für dieselbe Position hinzu.

Wie in Android - Use of view.setX() and setY in api 8 angegeben, wenn Sie gesucht haben, ist es eine andere Lösung, die vor api 8. LayoutParams funktioniert wie das funktioniert sogar auch -

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); //WRAP_CONTENT param can be FILL_PARENT 
params.leftMargin = 206; //XCOORD 
params.topMargin = 206; //YCOORD 
childView.setLayoutParams(params); 

Es gibt weitere Informationen. Ich hoffe, das hilft

+1

Tyvm für die Antwort. Params funktioniert für mich. Ich bin immer noch neugierig, was mit setX und Y los ist. Ich habe alles versucht, aber jedes Mal, wenn ich einen Wert festlege, nachdem er bereits im Ereignis down gesetzt wurde (egal wie ich den neuen Wert einstelle), wird das Bild an die falsche Stelle verschoben. Es ist durch einen konstanten Wert um 30 Pixel zu weit oben und links auf dem Emulator, mit dem ich gerade teste. Ich dachte, es müsste die Eltern der Ansicht ändern oder so etwas, aber das ist es nicht. Es gibt buchstäblich nichts anderes, was ich finden kann. – user2423199

+0

Könnte es Dichte sein? Wenn Sie Zahlen programmatisch setzen, sollten Sie mit getResources() multiplizieren. GetDisplayMetrics(). Dichte, um px-Werte in dp-Werte zu ändern – marmor

1

Run in das gleiche Problem. View.setLeft(int)/View.setTop(int) arbeitete für mich

+0

Hat bei mir nicht funktioniert. Gerade streckte meine Ansicht vertikal – tieorange

+1

@tieorange down vote? Ich glaube, du solltest das gleiche für jede Antwort tun, die nicht für dich funktioniert hat. Aber im Allgemeinen, je mehr unterschiedliche Antworten da draußen sind, desto höher ist die Chance, dass Sie Ihre Zeit sparen, indem Sie ein Problem mit Hilfe anderer lösen, da ein ähnliches Problem tatsächlich andere Lösungen haben kann und man für Sie arbeiten kann. Oder vielleicht nicht. In diesem Fall graben Sie einfach weiter. Daher kann ich keinen praktischen Grund sehen, die Antwort abzuraten, wenn es für Ihren speziellen Fall nicht funktioniert, da es für andere immer noch hilfreich sein kann. Ermutigen Sie, verschiedene Lösungen zu teilen, indem Sie abstimmen, was für Sie und nicht umgekehrt funktioniert hat –

0

Ist Ihre Aktivität im Vollbildmodus? Wenn nicht versuchen, es auf Vollbild zu machen, und es sollte Ihr Problem lösen.

0

Ziemlich spät zu beantworten, aber wenn jemand anderes mit dem gleichen Problem konfrontiert ist. Dies regelte es für mich die Polsterungen in der Layout-Datei waren:

android:paddingBottom="16dp" 
android:paddingLeft="16dp" 
android:paddingRight="16dp" 
android:paddingTop="16dp" 
0

Als jemand, der tatsächlich mit diesem Problem konfrontiert, ich habe dieses Problem zu lösen, indem jede Polsterung im parentView entfernen. Die Auffüllung scheint eine Veränderung der Layoutgröße zu verursachen

Verwandte Themen