it-swarm.com.ru

Установить абсолютную позицию вида

Можно ли установить абсолютную позицию вида в Android? (Я знаю, что есть переменная AbsoluteLayout, но она устарела ...)

Например, если у меня экран 240x320px, как я могу добавить ImageView размером 20x20px, чтобы его центр находился в позиции (100,100)?

170
Sephy

Вы можете использовать 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);

Больше примеров:

Размещает два ImageViews 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);

Помещает один 30x40 желтый ImageView в (50,60) и другой 30x40 красный ImageView <80,90> относительно желтый 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);
255
Andy Zhang

В общем, вы можете добавить View в определенную позицию, используя FrameLayout в качестве контейнера, указав атрибуты leftMargin и topMargin .

Следующий пример поместит ImageView размером 20x20 пикселей в позицию (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) координаты без RelativeLayout:

enter image description here

59
bonnyz

Просто добавьте к ответу Энди Чжана, приведенному выше, если вы хотите, вы можете задать параметр для 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.

16
Excrubulent

Более чистый и динамичный способ без жесткого кодирования любых значений пикселей в коде.

Я хотел расположить диалог (который я раздуваю на лету) точно ниже нажатой кнопки.

и решил это так:

    // 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.

5
Hari Krishna Ganji

Check screenshot

Разместите любой взгляд по вашему желаниюX&Ypoint

файл макета

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

Готово

1
Hiren Patel

На всякий случай это может помочь кому-то, вы также можете попробовать этот аниматор ViewPropertyAnimator как показано ниже

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

myView.animate().translateX(pixelInScreen) 

Примечание. Этот пиксель не относится к представлению. Этот пиксель является пикселем положение на экране.

кредиты bpr10 ответ

0
praveenb