Модераторы: javastic
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вычисление размеров 
:(
    Опции темы
math64
Дата 11.8.2012, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 1
Всего: 72



1. В верхней части экрана (портретная ориентация) или в левой (ландшафт) xoчу разместить квадратный GridView.
Определяю размеры экрана и выставляю размеры по минимальной размерности.
Но для ландшафта нужно вычесть высоту заголовка. Как её узнать (или узнать размеры рабочей области окна для Activity, а не всего экрана)?
2. Внутри Grid хочу разместить квадратные ячейки. Как узнать размеры, оставшиеся под ячейку, с учетом всех margin и padding?
3. Определились с размером ячейки. Как определить размер шрифта, которым можно вывести одну букву внутри ячейки?

PS: Все нормальные Layout'ы считают наоборот - исходя из размера шрифта определяется размер ячейки, исходя из размеров ячейки - размер грида, если грид не влезает в экран - на тебе прокрутку, или пустое место внизу экрана.

Сейчас всё сделано с использованием "магических" констант для конкрентого экрана.
PM   Вверх
PiyodaiSiyo
Дата 12.8.2012, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 31.12.2009

Репутация: 1
Всего: 2




в res
папке сделаешь
layout/main.xml для портрета

и


layout-land/main.xml для лэндскейпа

размеры в density independent pixels
PM MAIL   Вверх
math64
Дата 12.8.2012, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 1
Всего: 72



Естественно, есть отдельные layout для портрета и ландшафта.
Вопрос как вычислить размеры.
Размеры можно прописать в dimens.xml, чтобы не плодить много layout'ов - но тогда на каждый экран нужно по два dimen.xml - для ладшафта и портрета.
В тоже время можно обойтись двумя layout'ами, если научиться вычислять размеры.
PM   Вверх
PiyodaiSiyo
Дата 12.8.2012, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 31.12.2009

Репутация: 1
Всего: 2



Цитата

1...Но для ландшафта нужно вычесть высоту заголовка. Как её узнать (или узнать размеры рабочей области окна для Activity, а не всего экрана)?

я так понимаю нужен  уст.  AbsluteLayout.
итак в манифесте в тегах activity нужно проставить
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
с активити
Код

//getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);

теперь есть полный доступ к экрану.
Цитата

2. Внутри Grid хочу разместить квадратные ячейки. Как узнать размеры, оставшиеся под ячейку, с учетом всех margin и padding?

от пэдингов и маржинов в лэйаутах прийдется отказаться
в onCreate
Код


setContentView(R.layout.main); 
mAbsoluteLayout=(AbsoluteLayout)findViewById(R.id.absolute_layout);

для грида например
Код

gridLayout=(AbsoluteLayout)findViewById(R.id.grid_layout);
absoluteLayout.removeAllViews();
makeCalculations();
mainWindow();

в makeCalculations()
Код

private void makeCalculations() {
Display display=getWindowManager().getDefaultDisplay();
displayWidth = display.getWidth();
displayHeight = display.getHeight();
gridX0=(int)(screenWidth*2f/200f);
gridY0=(int)(screenHeight*12f/120f);
gridX1=(int)(screenWidth*125f/200f);
gridY1=(int)(screenHeight*108f/120f);
gradeWidth=gridX1-gridX0;
gradeHeight=gridY1-gridY0;    

200 и 120 от балды.ну например размер имиджа  пнж в пикселах
теперь после размеров решетки
в mainWindow()
Код
 закрепляем
absoluteLayout.addView( gridLayout,
             new AbsoluteLayout.LayoutParams(gridX1-gridX0,gridY1-gridY0,gridX0,gridY0));
         

все .  решетка имеет размеры пропоционально равные на всех экранах и вот она
Код

gridLayout.inflate(this,R.layout.grid, gridLayout);

Цитата

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

Код

gridview = (GridView) findViewById(R.id.grid_id);
gridview.setHorizontalSpacing(horizontalItemInterval);
    //gridLayout.addView(gridview);
gridview.setAdapter(new TextViewAdapter(this,gradeWidth,gradeHeight,horizontalItemInterval));


Код

public class TextViewAdapter extends  BaseAdapter {
.............
public TextViewAdapter(Context c,int gradeWidth,int gradeHeight,int horizontalItemInterval) {
        super();
        this.gradeWidth=gradeWidth;
        this.gradeHeight=gradeHeight;
        this.horizontalItemInterval=horizontalItemInterval;
        mContext = c;
       
    }
private void calculateItemSize() {
        int horizontalInterval=(int)(gradeWidth*6/115f);
        
        int verticalItemInterval=0;
        itemWidth=(int)(gradeWidth/3f)-horizontalItemInterval;
        itemHeight=(int)(gradeHeight/13f);
        textSize=(int)(itemHeight/3f);

    }

для текстВью
Код

@Override
    public View getView(int position, View convertView, ViewGroup arg2) {
        
        
        if (convertView == null) {  // if it's not recycled, initialize some attributes
         textView = new MyTextView(mContext);
         calculateItemSize();
         textView.setLayoutParams(new GridView.LayoutParams(itemWidth,itemHeight));
         textView.setTextSize(textSize);//for a writing e.g. samonline.uz
         //textView.setPadding(3,3,3,3);
        } else {
         textView = (MyTextView) convertView;
         
         
        }
textView.setBackgroundResource(R.drawable.adapter_drawable_levels);
        drawable=textView.getBackground();
        switch(position){       
        case 0:{
         textView.setText(R.string.bt);
         gr();
..........
return textView;

где gr()
Код

public void rd(){
        drawable.setLevel(1);
        textView.setTextColor(0xfffff000);
    }

для элементов ImageView сам разрулишь
но если честно тяжеловато  лучше уж папки для всех экранов и денсити
всего 8 если не ошибаюсь


Это сообщение отредактировал(а) PiyodaiSiyo - 12.8.2012, 22:50
PM MAIL   Вверх
math64
Дата 13.8.2012, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 1
Всего: 72



Магических констант у тебя тоже много.
Если уж убирать заголовки - AbsoluteLayout не нужен, используется LinearLayout - хотя коду без разницы
Код

        final int MAGIC_HEADER_HEIGHT = 0; // При FLAG_FULLSCREEN
        // final int MAGIC_HEADER_HEIGHT = 30; // При FEATURE_NO_TITLE но без FLAG_FULLSCREEN
        GridView mainGrid = (GridView) findViewById(R.id.mainGrid);
        ViewGroup.LayoutParams lp = mainGrid.getLayoutParams();
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        int sz = Math.min(dm.widthPixels, dm.heightPixels - MAGIC_HEADER_HEIGHT);
        lp.width = sz;
        lp.height = sz;
        mainGrid.setLayoutParams(lp);

альтернатива - создать свой класс Board extend GridView и переопределить метод onMeasure() - так бы и сделал, если бы это решало все проблемы.
Все паддинги и марджины - нуле. Для GridView задаю цвет background - чтобы было видно, что поля добавлены именно GridView.
Код

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/vertLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <GridView
        android:id="@+id/mainGrid"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="0dp"
        android:background="#80E0FF"
        android:horizontalSpacing="0dp"
        android:isScrollContainer="false"
        android:numColumns="6"
        android:padding="0dp"
        android:scrollbars="none"
        android:verticalSpacing="0dp" />
    ...
</LinearLayout>

Всё равно поля есть. Может какие пропустил? И на скроллинг всё-равно реагирует, хотя скроллировать нечего.
Код

private final int COLCOUNT = 6;
private final int MAGIC_PADDING = 3;
private final float MAGIC_FONT_SIZE_MULTIPLIER = 0.55;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
        Cell cell = getItem(position);
        View view = super.getView(position, convertView, parent);
        int w = parent.getWidth();
        int h = parent.getHeight();
    int szx = w / COLCOUNT - MAGIC_PADDING;
    int szy = h / COLCOUNT - MAGIC_PADDING;
    view.setMinimumHeight(szx);
    view.setMinimumWidth(szy);
    final TextView tv = (TextView) view.findViewById(R.id.tv);
    tv.setMinimumHeight(szx);
    tv.setMinimumWidth(szy);
    tv.setTextSize(szy * MAGIC_FONT_SIZE_MULTIPLIER);
    LayoutParams lp = tv.getLayoutParams();
    lp.height = szy;
    lp.width = szx;
    tv.setLayoutParams(lp);
    ...
    if (cell.toOpen() && !cell.isOpen()) {
        // добавляю анимацию из соседней темы
        cell.setOpen(true);
    }
    return view;
}



Это сообщение отредактировал(а) math64 - 13.8.2012, 08:31
PM   Вверх
PiyodaiSiyo
Дата 13.8.2012, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 31.12.2009

Репутация: 1
Всего: 2



то что я выложил  работает на  всех экранах кроме Honeycomb,там бар трея не нашел как убрать.Это из эппа которая 'прошла'.
да,на скроллинг реагирует но только  в эмуляторе попробуй на устройстве.
касательно магических констант, 120/200 это помоему было стандартное отношение сторон экрана и все на этом держится. Там же пропорции....
Пардон если чего не уловил.  8/
PM MAIL   Вверх
math64
Дата 13.8.2012, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 1
Всего: 72



Чаще рапространены экраны с пропорциями 3:5, например у меня - 480x800, диагональ 4". Но все параметры экрана доступны в DisplayMetrics.
Поэтому 120/200 заменить не проблема.
Я про другие константы - 2f, 3f, 12f, 13f, 15f, 108f, 115f, 125f - откуда они? У меня таких констант 3 (при полноэкранном режиме останется 2)
textSize ты получаешь из высоты ячейки делением на 3. А нужно делить примерно на 2 (точнее умножать примерно на 0.55f, подобранно экспериментально для своего экрана, но эта константа зависит от шрифта). Тестирую, как правило, на устройстве - эмулятор слишком медленный.
Про скроллинг жалуюсь в своём коде, как в твоём - не знаю,

PM   Вверх
PiyodaiSiyo
Дата 13.8.2012, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 31.12.2009

Репутация: 1
Всего: 2



да все просто. открываешь пэинтнет
 и масштабируешь фоновую картинку.
т.е .200 х 120
включаешь координатную сетку.
и вот откуда появляются кастомные циферки, просто представляешь себе этот грид на фоне тупо отсчитываешь х0, х1,у0 и у1  . ты ведь получаешь например
Х0=ширина эк * х0/200 в эппе. 
а зачем там  нпр.13f не упомню.
кроме грида много чего было рядом.
касательно ячеек - получено на подгонке.


PM MAIL   Вверх
math64
Дата 13.8.2012, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 1
Всего: 72



Сделал всё-таки класс Board - он теперь в onMeasure() вычисляет свои размеры, Теперь MAGIC_HEADER_HEIGHT не нужен. он оказался равен 38.
Код

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        // int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
        int size = Math.min(widthSize, heightSize);
        if (size <= 0) {
            DisplayMetrics dm = new DisplayMetrics();
            ((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(dm);
            size = Math.min(dm.widthPixels, dm.heightPixels);
        }
        Log.d("Board", widthSize + "x" + heightSize + "=>" + size);
        widthMeasureSpec = MeasureSpec.makeMeasureSpec(size,
                MeasureSpec.EXACTLY);
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(size,
                MeasureSpec.EXACTLY);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

Причем при редактировании main.xml в графическом виде Board теперь выглядит так, как будет выглядеть при запуске (если с конструкторе подключить адаптер).
PS: лишние поля возникали из-за селектора, который больше размера ячейки (задаётся с помощью .9.png). Заменил своим селектором, который не вылезает за размеры ячейки - поля пропали. Размер грида в коде выше нужно окуглить, чтобы делился на число колонок/строк.
Остаётся вычисление высоты шрифта.


Это сообщение отредактировал(а) math64 - 13.8.2012, 21:23
PM   Вверх
PiyodaiSiyo
Дата 13.8.2012, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 31.12.2009

Репутация: 1
Всего: 2



ок. я рад за тебя , проверь на всех размерах и android версиях все равно
(зы: и всетаки папки лучше  smile  ) 

Это сообщение отредактировал(а) PiyodaiSiyo - 13.8.2012, 22:06
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Android | Следующая тема »


 




[ Время генерации скрипта: 0.0698 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.