Définir la position absolue d'une vue

Est-il possible de définir la position absolue d'une vue dans Android? (Je sais qu'il existe un AbsoluteLayout , mais il est obsolète …)

Par exemple, si j'ai un écran 240x320px, comment puis-je ajouter un ImageView qui est 20x20px tel que son centre est à la position (100,100)?

  • Comment obtenir une valeur RVB à partir du code de couleur hexadécimal dans java
  • Android, Transparent sous-GLSurfaceView dans la mise en page?
  • Comment inclure la dépendance JAR dans une bibliothèque AAR
  • AnimatedVectorDrawable in Support Bibliothèque et animation de "pathData"
  • Continuer le rapport de couverture du code jacoco après un cas de test en panne
  • MediaPlayer arrête de jouer après environ 5 secondes
  • Ajout de bibliothèques de support au projet Android
  • Comment détecter que DrawerLayout a commencé à ouvrir?
  • Comment centrer le texte et les images dans un CompoundDrawable?
  • L'activité recherchable s'appelle deux fois
  • HttpsURLconnection pour publier et entrer dans Android
  • Comment changer la couleur de fond de la barre de snack?
  • 8 Solutions collect form web for “Définir la position absolue d'une vue”

    Vous pouvez utiliser RelativeLayout. Disons que vous vouliez un ImageView 30×40 à la position (50,60) dans votre mise en page. Quelque part dans votre activité:

     // Some existing RelativeLayout from your layout xml RelativeLayout rl = (RelativeLayout) findViewById(R.id.my_relative_layout); ImageView iv = new ImageView(this); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(30, 40); params.leftMargin = 50; params.topMargin = 60; rl.addView(iv, params); 

    Plus d'exemples:

    Localise deux images 30×40 (un jaune, un rouge) à (50,60) et (80,90), respectivement:

     RelativeLayout rl = (RelativeLayout) findViewById(R.id.my_relative_layout); ImageView iv; RelativeLayout.LayoutParams params; iv = new ImageView(this); iv.setBackgroundColor(Color.YELLOW); params = new RelativeLayout.LayoutParams(30, 40); params.leftMargin = 50; params.topMargin = 60; rl.addView(iv, params); iv = new ImageView(this); iv.setBackgroundColor(Color.RED); params = new RelativeLayout.LayoutParams(30, 40); params.leftMargin = 80; params.topMargin = 90; rl.addView(iv, params); 

    Place un 30×40 jaune ImageView à (50,60) et un autre 30×40 ImageView rouge <80,90> par rapport à l'ImageView jaune:

     RelativeLayout rl = (RelativeLayout) findViewById(R.id.my_relative_layout); ImageView iv; RelativeLayout.LayoutParams params; int yellow_iv_id = 123; // Some arbitrary ID value. iv = new ImageView(this); iv.setId(yellow_iv_id); iv.setBackgroundColor(Color.YELLOW); params = new RelativeLayout.LayoutParams(30, 40); params.leftMargin = 50; params.topMargin = 60; rl.addView(iv, params); iv = new ImageView(this); iv.setBackgroundColor(Color.RED); params = new RelativeLayout.LayoutParams(30, 40); params.leftMargin = 80; params.topMargin = 90; // This line defines how params.leftMargin and params.topMargin are interpreted. // In this case, "<80,90>" means <80,90> to the right of the yellow ImageView. params.addRule(RelativeLayout.RIGHT_OF, yellow_iv_id); rl.addView(iv, params); 

    En général, vous pouvez ajouter une vue dans une position spécifique à l'aide d'un FrameLayout en tant que conteneur en spécifiant les attributs leftMargin et topMargin .

    L'exemple suivant placera un ImageView 20x20px à la position (100 200) à l'aide d'un FrameLayout en tant que contenant en plein écran:

    XML

     <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/root" android:background="#33AAFF" android:layout_width="match_parent" android:layout_height="match_parent" > </FrameLayout> 

    Activité / Fragment / Vue personnalisée

     //... FrameLayout root = (FrameLayout)findViewById(R.id.root); ImageView img = new ImageView(this); img.setBackgroundColor(Color.RED); //..load something inside the ImageView, we just set the background color FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(20, 20); params.leftMargin = 100; params.topMargin = 200; root.addView(img, params); //... 

    Cela fera l'affaire car les marges peuvent être utilisées comme coordonnées absolues (X, Y) sans RelativeLayout:

    Entrez la description de l'image ici

    Juste pour ajouter à la réponse d'Andy Zhang ci-dessus, si vous le souhaitez, vous pouvez donner param to rl.addView, puis faire des modifications ultérieurement, alors:

     params = new RelativeLayout.LayoutParams(30, 40); params.leftMargin = 50; params.topMargin = 60; rl.addView(iv, params); 

    Peut aussi être écrit comme suit:

     params = new RelativeLayout.LayoutParams(30, 40); rl.addView(iv, params); params.leftMargin = 50; params.topMargin = 60; 

    Donc, si vous conservez la variable params, vous pouvez modifier la mise en page de iv à tout moment après l'avoir ajouté à rl.

    Un moyen plus propre et dynamique sans codage dur des valeurs de pixel dans le code.

    Je voulais positionner une boîte de dialogue (que je gonflé à la volée) exactement sous un bouton cliqué.

    Et l'a résolu ainsi:

      // get the yoffset of the position where your View has to be placed final int yoffset = < calculate the position of the view > // position using top margin if(myView.getLayoutParams() instanceof MarginLayoutParams) { ((MarginLayoutParams) myView.getLayoutParams()).topMargin = yOffset; } 

    Cependant, vous devez vous assurer que la disposition parent de myView est une instance de RelativeLayout .

    Code plus complet:

      // identify the button final Button clickedButton = <... code to find the button here ...> // inflate the dialog - the following style preserves xml layout params final View floatingDialog = this.getLayoutInflater().inflate(R.layout.floating_dialog, this.floatingDialogContainer, false); this.floatingDialogContainer.addView(floatingDialog); // get the buttons position final int[] buttonPos = new int[2]; clickedButton.getLocationOnScreen(buttonPos); final int yOffset = buttonPos[1] + clickedButton.getHeight(); // position using top margin if(floatingDialog.getLayoutParams() instanceof MarginLayoutParams) { ((MarginLayoutParams) floatingDialog.getLayoutParams()).topMargin = yOffset; } 

    De cette façon, vous pouvez toujours vous attendre à ce que la vue cible s'adapte à tous les paramètres de mise en page définis à l'aide de fichiers XML de mise en page, au lieu de coder ces pixels / dps dans votre code Java.

    Vérifier la capture d'écran

    Placez n'importe quelle vue sur votre désir X & Y point

    Fichier de mise en page

     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.test.MainActivity" > <AbsoluteLayout android:id="@+id/absolute" android:layout_width="match_parent" android:layout_height="match_parent" > <RelativeLayout android:id="@+id/rlParent" android:layout_width="match_parent" android:layout_height="match_parent" > <ImageView android:id="@+id/img" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/btn_blue_matte" /> </RelativeLayout> </AbsoluteLayout> </RelativeLayout> 

    Classe Java

     public class MainActivity extends Activity { private RelativeLayout rlParent; private int width = 100, height = 150, x = 20, y= 50; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); AbsoluteLayout.LayoutParams param = new AbsoluteLayout.LayoutParams(width, height, x, y); rlParent = (RelativeLayout)findViewById(R.id.rlParent); rlParent.setLayoutParams(param); } } 

    Terminé

    Au cas où cela pourrait aider quelqu'un, vous pouvez également essayer cet animateur ViewPropertyAnimator comme ci-dessous

     myView.animate().x(50f).y(100f); myView.animate().translateX(pixelInScreen) 

    Remarque: Ce pixel n'est pas relatif à la vue. Ce pixel est la position du pixel dans l'écran.

    Crédits à la réponse bpr10

    Essayez le code ci-dessous pour définir la vue sur un emplacement spécifique: –

      TextView textView = new TextView(getActivity()); textView.setId(R.id.overflowCount); textView.setText(count + ""); textView.setGravity(Gravity.CENTER); textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12); textView.setTextColor(getActivity().getResources().getColor(R.color.white)); textView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // to handle click } }); // set background textView.setBackgroundResource(R.drawable.overflow_menu_badge_bg); // set apear textView.animate() .scaleXBy(.15f) .scaleYBy(.15f) .setDuration(700) .alpha(1) .setInterpolator(new BounceInterpolator()).start(); FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams( FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT); layoutParams.topMargin = 100; // margin in pixels, not dps layoutParams.leftMargin = 100; // margin in pixels, not dps textView.setLayoutParams(layoutParams); // add into my parent view mainFrameLaout.addView(textView); 

    Mon code pour Xamarin , j'utilise FrameLayout à cette fin et suit mon code:

      List<object> content = new List<object>(); object aWebView = new {ContentType="web",Width="300", Height = "300",X="10",Y="30",ContentUrl="http://www.google.com" }; content.Add(aWebView); object aWebView2 = new { ContentType = "image", Width = "300", Height = "300", X = "20", Y = "40", ContentUrl = "https://www.nasa.gov/sites/default/files/styles/image_card_4x3_ratio/public/thumbnails/image/leisa_christmas_false_color.png?itok=Jxf0IlS4" }; content.Add(aWebView2); FrameLayout myLayout = (FrameLayout)FindViewById(Resource.Id.frameLayout1); foreach (object item in content) { string contentType = item.GetType().GetProperty("ContentType").GetValue(item, null).ToString(); FrameLayout.LayoutParams param = new FrameLayout.LayoutParams(Convert.ToInt32(item.GetType().GetProperty("Width").GetValue(item, null).ToString()), Convert.ToInt32(item.GetType().GetProperty("Height").GetValue(item, null).ToString())); param.LeftMargin = Convert.ToInt32(item.GetType().GetProperty("X").GetValue(item, null).ToString()); param.TopMargin = Convert.ToInt32(item.GetType().GetProperty("Y").GetValue(item, null).ToString()); switch (contentType) { case "web":{ WebView webview = new WebView(this); //webview.hei; myLayout.AddView(webview, param); webview.SetWebViewClient(new WebViewClient()); webview.LoadUrl(item.GetType().GetProperty("ContentUrl").GetValue(item, null).ToString()); break; } case "image": { ImageView imageview = new ImageView(this); //webview.hei; myLayout.AddView(imageview, param); var imageBitmap = GetImageBitmapFromUrl("https://www.nasa.gov/sites/default/files/styles/image_card_4x3_ratio/public/thumbnails/image/leisa_christmas_false_color.png?itok=Jxf0IlS4"); imageview.SetImageBitmap(imageBitmap); break; } } } 

    Cela m'a été utile parce que j'avais besoin de la propriété de la vue pour se chevaucher sur la base de leur apparence, par exemple, les vues sont empilées l'une au-dessus de l'autre .

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.