2016-08-31 2 views
-1

Я только начал разрабатывать приложение с помощью java, и у меня только есть опыт работы с C. В моем коде в Activity.java (в студии android) у меня есть такие вещи, как дать несколько примеров:сделать xy работать одинаково на всех устройствах Android-студии

meteorite1.setX(meteoritePlacementX(meteorite1.getX())); 
    meteorite1.setY(-2000); 
    gnome.setX(330); 
    gnome.setY(800); 
    meteorite2.setX(meteoritePlacementX(meteorite2.getX())); 
    meteorite2.setY(meteoritePlacementY(meteorite1.getY())); 
    meteorite3.setX(meteoritePlacementX(meteorite3.getX())); 
    meteorite3.setY(meteoritePlacementY(meteorite2.getY())); 
    meteorite4.setX(meteoritePlacementX(meteorite4.getX())); 
    meteorite4.setY(meteoritePlacementY(meteorite3.getY())); 
    meteorite5.setX(meteoritePlacementX(meteorite5.getX())); 
    meteorite5.setY(meteoritePlacementY(meteorite4.getY())); 

    meteoritedestruction1.setX(0); 
    meteoritedestruction1.setY(-2000); 
    meteoritedestruction2.setX(0); 
    meteoritedestruction2.setY(-2000); 
    meteoritedestruction3.setX(0); 
    meteoritedestruction3.setY(-2000); 
    meteoritedestruction4.setX(0); 
    meteoritedestruction4.setY(-2000); 
    meteoritedestruction5.setX(0); 
    meteoritedestruction5.setY(-2000); 

    star1.setX(300); 
    star2.setX(150); 
    star3.setX(50); 
    star4.setX(500); 
    star5.setX(600); 
    star6.setX(350); 
    star7.setX(80); 
    star8.setX(450); 
    tinystar1.setX(302); 
    tinystar2.setX(240); 
    tinystar3.setX(57); 
    tinystar4.setX(660); 
    tinystar5.setX(400); 

    star1.setY(300); 
    star2.setY(-300); 
    star3.setY(-100); 
    star4.setY(100); 
    star5.setY(300); 
    star6.setY(500); 
    star7.setY(700); 
    star8.setY(900); 
    tinystar1.setY(300); 
    tinystar2.setY(-400); 
    tinystar3.setY(-200); 
    tinystar4.setY(150); 
    tinystar5.setY(30);  

и

public float meteoritePlacementX(float X){ 

    float MeteoriteNewX = 0f; 

    int random = (int)(Math.random() * 480 - 50); 

    MeteoriteNewX = random; 

    return MeteoriteNewX; 
} 

Какой workes хорошо, но только на моем телефоне (720 х 1280 пикселей (~ 294 точек на дюйм плотность пикселей)), который я тестировал мой код в. Теперь я опубликовал свое приложение, но на другом устройстве макет приложения полностью не синхронизирован (что имеет смысл для меня сейчас, потому что x и y разные для каждого экрана). Кнопки и изображения работают нормально, но движущийся объект, например,

meteorite1.setY(meteorite1.getY() + 20); 

, где я использую x и y, разбиты на другие устройства. Я использую относительный макет.

Короче говоря, Есть ли способ изменить x и y, поэтому он становится относительно экрана? В противном случае мне нужно изменить весь код.

ответ

0

В целом использование размещения на основе значений жестко закодированных пикселей не является хорошей практикой. Мало того, что это сломается с обратной совместимостью, но также подумайте о том, что вам нужно будет делать, когда появятся телефоны 2k +, вам понадобится целый рефактор. Посмотрите на вопрос this и ответ Guillaume Perrot вы можете получить максимальные и минимальные значения пикселей относительно телефона пользователя и использовать их вместо 480-50 и ваши функции набора звезд.

Для движения сделать

DisplayMetrics displayMetrics = new DisplayMetrics(); 
WindowManager wm = (WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE); // the results will be higher than using the activity context object or the getWindowManager() shortcut 
wm.getDefaultDisplay().getMetrics(displayMetrics); 
int maxWidth = displayMetrics.widthPixels; 
//Make this percentage whatever you want 
float movementPercentage = 0.02 
//Will move the object 2 percent up the y axis 
meteorite1.setY(meteorite1.getY() + maxWidth*movementPercentage); 
+0

Да вы совершенно правы! Но если я изменяю значения x и y, я делаю его совместимым с другим устройством, но мое оригинальное устройство не может нормально запускать приложение, верно? Как я могу заменить как meteorite1.setY (meteorite1.getY() + 20); поэтому он становится относительным? С разрешением dpi? –

+0

@KingRool Обновлен мой ответ – CodeMonkey