2016-04-29 19 views
0

Ich habe einen Blick in ein RelativeLayout mit layout_alignParentBottom und layout_alignParentRight Attribute auf true wie folgt festgelegt:Android View.getLayoutParams() und leftmargin topmargin geben 0

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/rlroot" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin"> 

<View 
     android:id="@+id/v_green" 
     android:layout_height="@dimen/square_size" 
     android:layout_width="@dimen/square_size" 
     android:background="@color/green" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" 
     /> 
</RelativeLayout> 

ich diese Ansicht in der Lage sein, sich zu bewegen. Ich versuche, dass wie unten zu erreichen:

@Override 
    public boolean onTouch(View v, MotionEvent event) { 

     final int X = (int) event.getRawX(); 
     final int Y = (int) event.getRawY(); 
     switch (event.getAction() & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_DOWN: 
       RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) v.getLayoutParams(); 
       xDelta = X - lParams.leftMargin; 
       yDelta = Y - lParams.topMargin; 
       Log.d("MainActivity","Action_Down:X="+X+",Y="+Y+",xD="+xDelta+",yD="+yDelta+",lm="+lParams.leftMargin+",tm="+lParams.topMargin);    
       break; 
      case MotionEvent.ACTION_UP: 
       Log.d("MainActivity","Action_up"); 
       break; 
      case MotionEvent.ACTION_POINTER_DOWN: 
       Log.d("MainActivity","Action_Pointer_Down"); 
       break; 
      case MotionEvent.ACTION_POINTER_UP: 
       Log.d("MainActivity","Action_Pointer_Up"); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) v.getLayoutParams(); 
       layoutParams.leftMargin = X - xDelta; 
       layoutParams.topMargin = Y - yDelta; 
       layoutParams.rightMargin = -250; 
       layoutParams.bottomMargin = -250; 

       v.setLayoutParams(layoutParams); 

       Log.d("MainActivity","Action_Move:X="+X+",Y="+Y+",xD="+xDelta+",yD="+yDelta); 
       break; 
     } 
     rootLayout.invalidate(); 
     return true; 
    } 

Das Problem ist, dass layoutParams.leftMargin und layoutParams.topMargin sind 0 sein gefunden (von log gefunden) so in dem Moment bin ich der Ansicht berühren springt linke Ecke nach oben dann kann ich es richtig bewegen. Warum ist es 0, wenn es in der unteren rechten Ecke von RelativeLayout ist? Thing ist, ich habe vier Ansichten in vier Ecken des Bildschirms in RelativeLayout und ich möchte in der Lage sein, sie herum zu bewegen. Alle haben dasselbe Problem.

Antwort

0

Endlich habe ich eine Lösung gefunden. Das Problem bestand darin, dass die Ansichtsattribute wie alignParentBottom oder alignParentTop gleich true waren. Ich habe es verifiziert, indem ich diese Attribute aus der Ansicht entfernt habe und sie ziehen konnte. Was ich also getan habe, war innerhalb von ACTION_DOWN von onTouch. Ich habe überprüft, ob eines der 4 alignParentXXXX-Attribute für die Ansicht wahr ist. Wenn festgestellt wird, dass es auf "True" gesetzt ist, setze ich es auf "False" und füge die erforderliche Initial Margin hinzu. Unten ist der Beispielcode für 2 Attribute:

Und ähnlich für andere 2 Attribute. Und das funktioniert jetzt für mich. Ich habe auch vollständigen Code in meinem blog für den Fall geschrieben, dass jemand dieses Problem in Zukunft hat.