Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 18.11.2016
Сообщений: 7
1

Узнать доступные координаты (размер экрана)

21.11.2016, 15:21. Просмотров 1247. Ответов 9
Метки нет (Все метки)

Всем привет. Мне нужно в программе сделать случайное перемещение ImageButton, сейчас у меня заданы жесткие координаты которые подобраны методом тыка.
Java
1
2
3
public int getRandomCoordinateWidth() { //!!поменять значения до какого рандом может меняться, так как не знаю полные координаты
        return random.nextInt(575);
    }
Координаты кнопки меняю так
i
Java
1
mageButton.setX(getRandomCoordinateWidth());
Соответственно программа нормально работает только на одном устройстве. Как мне узнать доступные координаты программно?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.11.2016, 15:21
Ответы с готовыми решениями:

Как узнать размер экрана из VBA?
Наглухо автоматизированная база данных - требуется при запуске определить размер экрана и запустить...

Как узнать размер экрана у пользователя?
Знаю, что вопрос этот неоднократно встречался в форуме и набил уже аскомину, но, вроде, все делаю...

Как получить все доступные разрешения для экрана?
Добрый день, уважаемые форумчане. Заметил, что некоторые приложения при запуске показывают...

Как узнать доступные скорости COM-порта?
Здравствуйте!!! Долго не мог выбрать на форуме подходящий для данного вопроса раздел и решил...

9
104 / 103 / 29
Регистрация: 13.03.2016
Сообщений: 474
21.11.2016, 15:32 2
Переопределить метод onMeasure у View, на которой кнопка.
0
2870 / 2282 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
21.11.2016, 15:34 3
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.Button;
 
import java.util.Random;
 
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
 
    private static final Random r = new Random();
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(this);
    }
 
    @Override
    public void onClick(View v) {
        final ViewParent parent = v.getParent();
        if (parent instanceof ViewGroup) calcNewPos((ViewGroup) parent, v);
    }
 
    private void calcNewPos(ViewGroup parent, View v) {
        int pw = parent.getMeasuredWidth() - v.getMeasuredWidth();
        int ph = parent.getMeasuredHeight() - v.getMeasuredHeight();
        int nx = r.nextInt(pw);
        int ny = r.nextInt(ph);
        v.setTranslationX(nx);
        v.setTranslationY(ny);
    }
}
XML
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="hit me" />
 
</FrameLayout>
1
0 / 0 / 0
Регистрация: 18.11.2016
Сообщений: 7
21.11.2016, 16:33  [ТС] 4
В примере данном выше я так понимаю можно узнавать размер только в обработчики нажатия. А можно ли это сделать в onCreate, до нажатия на кнопку? Если можно какой нибуть самый простейший пример. Я так понимаю вместе viev нужно подставить layout?

вот так вот не прокатывает
Java
1
2
3
        View  aq=findViewById(R.id.activity_main);
        int pWidth=aq.getMeasuredWidth();
        int pHeight=aq.getMeasuredHeight();
0
2870 / 2282 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
21.11.2016, 17:29 5
Цитата Сообщение от Catchermax Посмотреть сообщение
А можно ли это сделать в onCreate, до нажатия на кнопку?
в onCreate нет, потому что в этот может еще не просчитаны размеры, но можно сделать так
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class MainActivity extends AppCompatActivity implements ViewTreeObserver.OnGlobalLayoutListener {
 
    private static final Random r = new Random();
    private Button button;
    private ViewGroup rootLayout;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        rootLayout = (ViewGroup) findViewById(R.id.root);
        rootLayout.getViewTreeObserver().addOnGlobalLayoutListener(this);
    }
 
    @Override
    public void onGlobalLayout() {
        int pw = rootLayout.getMeasuredWidth() - button.getMeasuredWidth();
        int ph = rootLayout.getMeasuredHeight() - button.getMeasuredHeight();
        int nx = r.nextInt(pw);
        int ny = r.nextInt(ph);
        button.setTranslationX(nx);
        button.setTranslationY(ny);
    }
}
1
8 / 12 / 0
Регистрация: 18.10.2016
Сообщений: 115
21.11.2016, 19:44 6
или попробуйте событие:
Java
1
2
3
    public void onWindowFocusChanged(boolean hasFocus) {
 
    }
1
89 / 84 / 12
Регистрация: 08.08.2013
Сообщений: 667
21.11.2016, 19:53 7
я делаю так в onCreate

Java
1
2
3
4
Point size = new Point();
display.getSize(size);
widthDisplay = size.x;
heightDisplay = size.y;
Но это не parent, у меня перемещение по корневому relativeLayout
1
2870 / 2282 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
21.11.2016, 20:16 8
это размер экрана, он 100% не равен лаяуту, даже если это корневой лаяут
там как минимум status bar съест немного + тулбар
1
0 / 0 / 0
Регистрация: 18.11.2016
Сообщений: 7
21.11.2016, 22:03  [ТС] 9
Всем спасибо, в итоге я воспользовался этим способом
Java
1
2
3
4
Point size = new Point();
display.getSize(size);
widthDisplay = size.x;
heightDisplay = size.y;
этот способ наименее простой но и не совсем правильный, выдает размер больше чем реальный размер layout, методом опять же тыка немного уменьшил это значение до приемлемых. Сейчас от программы не требуется доскональной работы, поэтому пока сойдет.

С остальными выходили какие то проблемы, то R.id.root не видит, то ещё что нибуть, видимо я что то делал не правильно.
0
2870 / 2282 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
22.11.2016, 11:27 10
Цитата Сообщение от Catchermax Посмотреть сообщение
то R.id.root не видит, то ещё что нибуть, видимо я что то делал не правильно.
неужели так сложно понять, что root - это id корневого лаяута, или лаяута в котором надо вытягивать координаты
id задается в xml
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.11.2016, 11:27

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Перевести 3d координаты объекта в 2d координаты экрана на VB.vet
Подскажите пожалуйста может у кого есть код на vb.net, мне нужно перевести 3d координаты объекта в...

Авторазмер экрана эксель, под размер экрана монитора
Здравствуйте, подскажите пожалуйста, можно ли как то сделать так, чтоб эксель подстроился под экран...

Как подгонять размер диалоговых окон по размер экрана?
Здравствуйте! Как подгонять размер диалоговых окон по размер экрана? У меня есть класс,...

Размер stage, под размер экрана устройства, возможно?
Как указать размер stage, чтобы оно было равно размеру экрана пользователя? :)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.