8 ответов:
вы можете использовать RelativeLayout. Допустим, вы хотели 30x40 ImageView в позиции (50,60) внутри вашего макета. Где-то в вашей деятельности:
// 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);
примеры:
помещает два изображения 30x40 (один желтый, один красный) в (50,60) и (80,90) соответственно:
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);места 30х40 желтый графическое представление в (50,60) и другое 30х40 Красной книги по отношению к желтый ImageView:
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);
В общем, вы можете добавить представление в определенном положении, используя FrameLayout в качестве контейнера, указав атрибуты leftMargin и topMargin.
следующий пример разместит 20x20px ImageView в позиции (100,200), используя FrameLayout в качестве полноэкранного контейнера:
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>активность / фрагмент / пользовательский вид
//... 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); //...это будет делать трюк, потому что поля могут быть использованы как абсолютные (X,Y) координаты без относительного вывода:
просто чтобы добавить к ответу Энди Чжана выше, если вы хотите, вы можете дать param rl.addView, а затем внести изменения в него позже, так что:
params = new RelativeLayout.LayoutParams(30, 40); params.leftMargin = 50; params.topMargin = 60; rl.addView(iv, params);С тем же успехом можно было бы написать так:
params = new RelativeLayout.LayoutParams(30, 40); rl.addView(iv, params); params.leftMargin = 50; params.topMargin = 60;поэтому, если вы сохраняете переменную params, вы можете изменить макет iv в любое время после добавления его в rl.
более чистый и динамичный способ без жесткого кодирования любых значений пикселей в коде.
Я хотел разместить диалог (который я надуваю на лету)точно под нажатой кнопкой.
и решил его таким образом:
// 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; }однако вы должны убедиться, что родительский макет
myViewпримерRelativeLayout.более полный код :
// 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; }таким образом, вы все еще можете ожидать целевое представление для настройки на любые параметры макета, установленные с помощью XML-файлов макета, вместо жесткого кодирования этих пикселей / dps в коде Java.
поместите любой вид на ваше желание X & Y точка
шаблон
<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>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); } }сделал
на всякий случай, если это может кому-то помочь, вы также можете попробовать этот аниматор ViewPropertyAnimator ниже
myView.animate().x(50f).y(100f); myView.animate().translateX(pixelInScreen)Примечание: этот пиксель не относится к представлению. Этот пиксель в пиксель положение на экране.
кредиты bpr10 ответ
попробуйте ниже код, чтобы установить вид на определенном месте : -
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);
мой код Xamarin, Я использую FrameLayout для этой цели и ниже мой код:
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; } } }Это было полезно для меня, потому что мне нужно было свойство view перекрывать друг друга на основе их внешнего вида, например, представления get сложены один над другим.


Comments