2014-01-08 2 views
0

Я хочу, чтобы мои RelativeLayouts были одинакового размера и положения независимо от размера экрана устройства (относительно). Например:RelativeLayout размер и позиция (поля)

Если устройство А имеет ширину экрана 480 и высоту 800 и устройства В имеет ширину экрана 720 и высотой 1280, мой RelativeLayout должен иметь, например, 160 и ширину 267 высота в устройство A и 240 ширина и 427 высота в устройство B. Это просто, просто получить ширину и высоту экрана и рассчитать процент, который вы хотите. Эта часть, которую я сделал с этим кодом ниже, и работает:

int width = methodToGetScreenWidth(); 
relativeOneWidth = ((width/100) * 90); // 90% of the screen width. 
relativeOneHeight = (int) (relativeOneWidth/1.75f); 
relativeTwoWidth = (relativeOneWidth/2); 
relativeTwoHeight = (relativeOneHeight/4); 
relativeThreeWidth = (relativeOneWidth/4); 
relativeThreeHeight = (relativeOneHeight/4); 

Он отлично работает на всех проверенных мной устройствах. Проблема заключается в положении. Я пробовал много вещей, чтобы рассчитать поля, но он не был в одном положении в каждом устройстве (чаще всего он очень близок к желаемой позиции, но не точно). Вот что я пробовал:

relativeOneLeftMargin = ((width - relativeOneWidth)/2); // The screen width - the relativeOne width/2, it should returns the relativeOne left margin, shouldn't it? 
relativeOneTopMargin = ((height - relativeOneHeight)/2); // And this, the relativeOne top margin, right? 
relativeTwoLeftMargin = (int) (relativeOneLeftMargin * 1.5f); 
relativeTwoTopMargin = (int) (relativeOneTopMargin * 0.78f); 
relativeThreeLeftMargin = relativeOneTopMargin + relativeOneHeight; 

PS: relativeOne находится в центре экрана:

relativeOne.addRule(RelativeLayout.CENTER_IN_PARENT); 

Я также попытался получить задворках таким образом, но она возвращает 0:

relativeOne.getLeft(); 
relativeOne.getTop(); 

Я действительно не знаю, почему это не в том же положении на всех устройствах. Любое предложение?

ответ

1

Во-первых, при использовании позиционирования в разных устройствах рекомендуется использовать DP (точки, зависящие от устройства). Вы можете увидеть, как использовать их в http://developer.android.com/guide/practices/screens_support.html

При использовании:

relativeOne.getLeft(); 
relativeOne.getTop(); 

Вы всегда получите 0, так как, в данный момент вы сделать этот призыв, Android не закончил рисунок родителя вашего макета , поэтому он не имеет информации об относительном позиционировании. Если вы хотите получить доступ к этой информации, вам необходимо сделать вызов после рисования. Один из способов сделать это с помощью метода пост класса Вид:

parent.post(new Runnable() { 
      @Override 
      public void run() { 
       relativeOne.getLeft(); 
       relativeOne.getTop(); 
      } 
     }); 

Таким образом, вы выполнить вызов после того, как макет был нарисован.

0

Я изменил этот код:

relativeTwoLeftMargin = (int) (relativeOneLeftMargin * 1.5f); 
relativeTwoTopMargin = (int) (relativeOneTopMargin * 0.78f); 

Для этого:

relativeTwoLeftMargin = Math.round(relativeOneLeftMargin * 1.5f); 
relativeTwoTopMargin = Math.round(relativeOneTopMargin * 0.78f); 

Теперь он работает. Я думаю, что int листы не вернули точно значение.

Смежные вопросы