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

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

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

Всем привет. Мне нужно в программе сделать случайное перемещение ImageButton, сейчас у меня заданы жесткие координаты которые подобраны методом тыка.
Java
1
2
3
public int getRandomCoordinateWidth() { //!!поменять значения до какого рандом может меняться, так как не знаю полные координаты
        return random.nextInt(575);
    }
Координаты кнопки меняю так
i
Java
1
mageButton.setX(getRandomCoordinateWidth());
Соответственно программа нормально работает только на одном устройстве. Как мне узнать доступные координаты программно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2016, 15:21
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Узнать доступные координаты (размер экрана) (Программирование Android):

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

Размер экрана
Нашел приложение. Когда запускаю его на Bluestacks размер Bluestacks...

Физический размер экрана
Пишу на OpenGL ES DisplayMetrics metrics = new DisplayMetrics();...

Размер экрана без шапки
Создаю диалог вручную. Нужно знать точный размер экрана без учета панели с...

Максимальный размер картинок для экрана
Всем привет! Задал картинку с drawable в background LinerLayout. В некторых...

Как узнать разрешение экрана
Пробовал Display display = ((WindowManager)...

9
OlegJV
103 / 103 / 28
Регистрация: 13.03.2016
Сообщений: 474
21.11.2016, 15:32 #2
Переопределить метод onMeasure у View, на которой кнопка.
0
Pablito
2652 / 2134 / 726
Регистрация: 12.05.2014
Сообщений: 7,450
Завершенные тесты: 1
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
Catchermax
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
Pablito
2652 / 2134 / 726
Регистрация: 12.05.2014
Сообщений: 7,450
Завершенные тесты: 1
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
Antohsa
8 / 12 / 0
Регистрация: 18.10.2016
Сообщений: 115
21.11.2016, 19:44 #6
или попробуйте событие:
Java
1
2
3
    public void onWindowFocusChanged(boolean hasFocus) {
 
    }
1
_Night_Scream_
77 / 75 / 9
Регистрация: 08.08.2013
Сообщений: 623
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
Pablito
2652 / 2134 / 726
Регистрация: 12.05.2014
Сообщений: 7,450
Завершенные тесты: 1
21.11.2016, 20:16 #8
это размер экрана, он 100% не равен лаяуту, даже если это корневой лаяут
там как минимум status bar съест немного + тулбар
1
Catchermax
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
Pablito
2652 / 2134 / 726
Регистрация: 12.05.2014
Сообщений: 7,450
Завершенные тесты: 1
22.11.2016, 11:27 #10
Цитата Сообщение от Catchermax Посмотреть сообщение
то R.id.root не видит, то ещё что нибуть, видимо я что то делал не правильно.
неужели так сложно понять, что root - это id корневого лаяута, или лаяута в котором надо вытягивать координаты
id задается в xml
0
22.11.2016, 11:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2016, 11:27
Привет! Вот еще темы с решениями:

Узнать размер view
Как узнать размер view, если он лежит в layout, и обрезается им (размер view...

RecyclerView создает Item на размер экрана, как исправить?
Аномалии, сменил версию RecyclerView с 21.0.+ на 23.3.0. Теперь он создает 1...

Yandex mapkit узнать координаты адреса
Доброго времени суток. Только начал работать с yandex map kit и не могу найти...

Как программно узнать ppi экрана?
Как программно узнать ppi экрана?


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

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

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