代码之家  ›  专栏  ›  技术社区  ›  Sephy

设置视图的绝对位置

  •  172
  • Sephy  · 技术社区  · 14 年前

    是否可以在Android中设置视图的绝对位置(我知道有一个 AbsoluteLayout

    例如,如果我有一个240x320px的屏幕,如何添加一个 ImageView 哪个是20x20px,中心在(100100)位置?

    8 回复  |  直到 8 年前
        1
  •  279
  •   Andy Zhang    14 年前

    你可以使用RelativeLayout。假设您希望在布局中的位置(50,60)处有一个30x40的ImageView。在你的活动中:

    // 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);
    

    更多示例:

    分别在(50,60)和(80,90)处放置两个30x40图像视图(一个黄色,一个红色):

    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);
    

    相对于 黄色图像视图:

    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);
    
        2
  •  71
  •   bonnyz    10 年前

    通过指定leftMargin和topMargin属性,可以使用FrameLayout作为容器在特定位置添加视图

    以下示例将使用FrameLayout作为全屏容器将20x20px图像视图放置在位置(100200)处:

    <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)坐标,而不需要相对布局:

    enter image description here

        3
  •  16
  •   Excrubulent    13 年前

    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变量,则可以在将其添加到rl后随时更改iv的布局。

        4
  •  5
  •   Hari Krishna Ganji    10 年前

    我想定位一个对话框(我在飞行中充气)正下方点击按钮。

    然后就这样解决了:

        // 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文件设置的任何布局参数,而不是在Java代码中硬编码那些像素/dp。

        5
  •  1
  •   gotwo    5 年前

    Check screenshot

    对你的愿望有什么看法吗 & 是的 指向

    <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);
        }
    }
    

        6
  •  0
  •   praveenb    7 年前

    为了以防万一,你也可以试试这个动画师 ViewPropertyAnimator 如下所示

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

    注意:此像素与视图无关。这个像素就是那个像素 在屏幕中的位置。

    贷记 bpr10 answer

        7
  •  -1
  •   duggu Neeraj Nama    9 年前

    尝试使用以下代码在特定位置设置视图:-

                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);
    
        8
  •  -1
  •   Asim Khan    8 年前

    沙马林 , 框架布局 为此,以下是我的代码:

                   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;
                        }
    
                }
    
            }
    

    这对我很有用,因为我需要视图的属性根据它们的外观彼此重叠,例如视图 .