WedX - журнал о программировании и компьютерных науках

Получить абсолютную ширину строки сетки

Я пытаюсь имитировать iOS UICollectionView для жестко закодированных данных. На самом деле мне просто нужно отобразить 5 квадратов в сетке из 2 столбцов и 3 строк (последний - наполовину ... полный)

Ширина каждого столбца должна составлять половину экрана, что делается с помощью Star (*). И мне нужно, чтобы высота всегда была немного меньше ширины. Идея состоит в том, чтобы иметь толстые прямоугольники.

Прямо сейчас сетка находится внутри прокрутки, я не уверен, что это актуально, но мы никогда не узнаем. Я делаю это для того, чтобы на небольших телефонах всегда можно было прокручивать сетку, а на других могло быть просто пустое пространство.

Я возился, пытаясь получить размер экрана или ширину столбца. Я не могу получить ни абсолютное значение ширины столбца, ни ширину экрана (всегда -1!?). Я могу легко получить звездное значение моих элементов сетки, равное 1, но мне действительно нужен только размер кадра, значение double, поэтому я могу просто изменить размер своей сетки в конструкторе своего представления и присвоить ему абсолютное значение.

Вопросы :

  1. Как получить абсолютную ширину столбца? Или как мне установить высоту моей строки на значение, связанное с шириной столбца?

  2. Если это невозможно, как мне получить ширину экрана, чтобы я мог сделать ужасный rowheight = screenWdith/2 - padding?

  3. Может быть, есть другой очень простой способ сделать этот процесс тривиальным?

Или это вообще возможно?



Ответы:


1

Я пойду с ответом №2, получите ширину и высоту экрана, вам понадобится служба зависимостей, для этого вам понадобится что-то вроде этого:

interface IScreen
    {
        double Width { get; }
        double Height { get; }
        double convertPx(int px);
        string locationName(double latitude, double longitude);
        Task<string> locationNameAsync(double latitude, double longitude);
        string Version { get; }

        void ShowAlertMessage(string aTitle, string aMessage);

    }

Android:

class Screen_Android : Java.Lang.Object, IScreen
    {
        public Screen_Android() { }

        public double Width
        {
            get
            {
                var ctx = Forms.Context;
                var metrics = ctx.Resources.DisplayMetrics;
                return (ConvertPixelsToDp(metrics.WidthPixels));
            }
        }

        public double Height
        {
            get
            {
                var ctx = Forms.Context;
                var metrics = ctx.Resources.DisplayMetrics;

                return (ConvertPixelsToDp(metrics.HeightPixels));
            }
        }

        private static int ConvertPixelsToDp(float pixelValue)
        {
            var ctx = Forms.Context;
            var dp = (int)((pixelValue) / ctx.Resources.DisplayMetrics.Density);
            return dp;
        }

        public double convertPx(int px)
        {
            var ctx = Forms.Context;

            //var dp = (int)((px) / ctx.Resources.DisplayMetrics.Density);

            //return (int)((dp * ctx.Resources.DisplayMetrics.Density) + 0.5);

            double density = ctx.Resources.DisplayMetrics.Density;
            if (density >= 4.0)
            {
                //"xxxhdpi";
                return px * 4;
            }
            if (density >= 3.0 && density < 4.0)
            {
                //"xxhdpi";
                return px * 3;
            }
            if(density >= 2.0)
            {
                //xhdpi
                return px * 2;
            }
            if(density >= 1.5 && density < 2.0)
            {
                //hdpi
                return px * 1.5;
            }
            if(density >= 1.0 && density < 1.5)
            {
                //mdpi
                return px * 1;
            }
            return px;


            //return (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, px, ctx.Resources.DisplayMetrics);

            //var resources = ctx.Resources;
            //var metrics = resources.DisplayMetrics;
            //int dp = px * ((int)metrics.DensityDpi / 160);
            //return dp;
        }


        public string locationName(double latitude, double longitude)
        {
            //List<Address> addresses;
            Geocoder geocoder = new Geocoder(Forms.Context, Locale.Default);

            try
            {
                var addresses = geocoder.GetFromLocation(latitude, longitude, 10);
                if (addresses.All(item => item == null)) return "";
                string address = addresses[0].GetAddressLine(0);
                string city = addresses[0].GetAddressLine(1);
                string country = addresses[0].GetAddressLine(2);

                return address + " " + city + " " + country;
            }
            catch
            {
                return "";
            }
        }


        public string Version
        {
            get { throw new NotImplementedException(); }
        }


        public void ShowAlertMessage(string aTitle, string aMessage)
        {
            Toast.MakeText(Forms.Context, aMessage, ToastLength.Short).Show();
        }


        public System.Threading.Tasks.Task<string> locationNameAsync(double latitude, double longitude)
        {
            throw new NotImplementedException();
        }

iOS:

public class Screen_iOS : IScreen
    {
        public double Width
        {
            get
            {
                return UIScreen.MainScreen.Bounds.Width;
            }
        }

        public double Height
        {
            get
            {
                return UIScreen.MainScreen.Bounds.Height;
            }
        }

        public double convertPx(int px)
        {
            throw new NotImplementedException();
        }

        public string locationName(double latitude, double longitude)
        {
            string locationName = "";

            CLLocation c = new CLLocation(Math.Round(latitude, 2), Math.Round(longitude, 2));

            CLGeocoder geocoder = new CLGeocoder();
            geocoder.ReverseGeocodeLocation(c, (placemarks, error) =>
            {
                if ((placemarks != null) && (placemarks.Length > 0))
                    locationName = placemarks[0].Name + placemarks[0].PostalCode + placemarks[0].AdministrativeArea + placemarks[0].Country;

            });

            return locationName;

        }


        public string Version
        {
            get
            {
                NSObject ver = NSBundle.MainBundle.InfoDictionary["CFBundleShortVersionString"];
                return ver.ToString();
            }
            //get { throw new NotImplementedException(); }
        }


        public void ShowAlertMessage(String aTitle, string aMessage)
        {
            UIAlertView error = new UIAlertView(aTitle, aMessage, null, "OK" , null);
            error.Show();
        }


        public async Task<string> locationNameAsync(double latitude, double longitude)
        {

            string locationName = "";

            CLLocation loc = new CLLocation(latitude, longitude);

            CLGeocoder geocoder = new CLGeocoder();

            CLPlacemark[] r = null;
            var task = Task.Factory.StartNew(() =>
            {
                r = geocoder.ReverseGeocodeLocationAsync(loc).Result;
                Console.WriteLine("it ran! {0}", r.Length);
            });

            task.Wait(TimeSpan.FromSeconds(10));

            if ((r != null) && (r.Length > 0))
            locationName = r[0].Name + r[0].PostalCode + r[0].AdministrativeArea + r[0].Country;

            return locationName;
        }
    }
21.12.2015
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

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

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]