- Экран ушел вправо как вернуть на место
- Другие способы управлять изображением экрана
- Описание
- Как я решил проблему?
- Общая методика устранения проблем монитора
- Стабилизация экрана в Android
- Существующие решения
- Теория
- Хорошо, но что насчет определения перемещения?
- Реализация
- 1. Специальный элемент который мы будем двигать. Это синий блок с текстом внутри контейнера:
- 2. Подпишемся на события датчика ускорения:
- 3. И самое главное: слушатель изменений. Его базовая реализация:
- План реализации следующий:
- Сейчас я просто расскажу как я решил эти задачи.
- Вы можете найти детальную информацию и исходный код на GitHub
- Заключение
Экран ушел вправо как вернуть на место
Зачем может понадобиться эта опция? Первый вариант ответа: для просмотра изображений большого размера в нужном ракурсе. Так, к примеру, поступают разработчики игровой продукции, рассчитанной на игру в проекции на вертикально расположенный дисплей. Фото, сделанное с неправильного ракурса и помещенное на рабочий стол, также нуждается в коррекции положения.
Кроме того, некоторые современные мониторы могут сами быть установлены по-разному. Можно придумать еще с десяток ситуаций, при которых поворот экрана может понадобиться пользователю. Итак, как же повернуть изображение на дисплее? Это и есть предмет нашей небольшой заметки. Как обычно, существует несколько различных вариантов проделать одно и то же действие.
Способ первый и самый простой: воспользоваться сочетаниями клавиш на клавиатуре. Вот рисунок это поясняющий:
Однако этот вариант срабатывает далеко не на всех компьютерах. Убедиться в доступности функции проще всего опытным путем. Нажмите одновременно «Ctrl» + «Alt» + клавишу стрелки и полюбуйтесь на полученный результат.
Если на экране ничего не изменилось, значит, попробуйте иные варианты, о которых мы расскажем ниже.
Другие способы управлять изображением экрана
Некоторую пользу в плане решения нашей задачи можно получить при помощи окошка «Screen Resolution».
Добраться до него в Windows 7 и Windows 8 проще простого: нужно только щелкнуть по пустому месту рабочего стола и в открывшемся контекстном меню выбрать пункт с одноименным названием.
Появится окошко примерно такого вида:
Манипулируя списком «Orientation», можно добиться нужного эффекта.
В Windows XP та же опция доступна в окошке свойств рабочего стола (делаем щелчок по пустому месту на экране и выбираем пункт меню «Свойства»).
Далее переходим на страницу «Параметры» и щелкаем по кнопке «Дополнительно».
Следующий способ сдвинуть экран на ПК или ноутбуке влево или в любом другом направлении заключается в использовании возможностей не самой ОС Windows, а опций видеокарты.
Инсталлируя драйвер к современному видеоадаптеру, мы обычно устанавливаем и некоторое другое программное обеспечение наподобие панели управления видеокартой.
Покопайтесь в ее опциях – и вы обязательно найдете там нечто для регулирования ориентации. А еще лучше просто прочтите документацию к такой программе.
Здравствуйте! Сегодня будет небольшая заметка о такой бытовой проблеме, которая, может, и не часто распространена, но раздражает прилично. Если отбросить словосочетание в скобках заглавия статьи, то данную тему и в ряде обширных статей полностью раскрыть невозможно. На самом деле я расскажу об одной маленькой проблемке и направлениях, куда следует копать при возникновении других проблем.
Описание
Настраивая роутер, столкнулся со следующей проблемой – изображение монитора было смещено на пару миллиметров влево. И курсор также “уплывал” левее, не задерживаясь о грань монитора. Причем это было как в программах, так и на рабочем столе. А справа образовалась черная полоска шириной в те же пару миллиметров. Да что тут рассказывать, смотрите сами (правый нижний угол и вылезание папки за край):
На скриншоте это показать невозможно, потому что скриншот “фотографирует” активную область, управляемую системой. А тут такое ощущение, что пиксели перестали работать.
Как я решил проблему?
Все оказалось очень просто. Достаточно было поменять частоту монитора (монитор ЖК). Теперь покажу, как это делается.
1) Заходим в контекстное меню рабочего стола, Разрешение экрана (в Windows 7).
2) Появится меню с настройками экрана. Нажимаем на “Дополнительные параметры”.
3) Появятся характеристики вашего видеоадаптера (видеокарты).
Переходим во вкладку “Монитор”. Здесь важное выпадающее меню – “Частота обновления экрана”. Выставляем максимальную частоту обновления экрана. По дефолту у меня стояло 60 Гц, что и было причиной проблемы.
После этого изображение должно переместиться на свое место.
Общая методика устранения проблем монитора
1) Смотрим на физическое подключение монитора к разъему материнской платы. Пробуем вытянуть и вставить кабель заново.
2) Проверяем руками исправность кабеля (нет ли изломов).
3) Проверяем подключение питания монитора.
4) Если изображение на мониторе не появилось, то скорее всего накрылась видеокарта. Нужно взять другую и попробовать, заработает ли с ней монитор. Если нет, то тогда пришел конец монитору.
5) Если изображение вы все-таки увидели, но оно с искажениями, то идем опять же в контекстное меню рабочего стола – Разрешение экрана. Здесь нужно выставить стандартное разрешение вашего монитора, указанное в инструкции.
Если ЭЛТ мониторы (похожие на телевизоры) позволяют без особых проблем изменять разрешение, то в их ЖК собратьях должно быть только стандартное. Иначе изображение получится размытым.
6) Если изображение выглядит в виде лесенки, как здесь (лучше всего видно на ярлыке корзины):
то заходим в дополнительные параметры (как в пункте 2 решения моей проблемы), идем на вкладку “Монитор” и внизу там есть переключатель режимов качества цветопередачи. Так вот там нужно выбрать 32 бита (True Color):
Тогда изображение станет плавным и градиенты будут незаметными:
плавное изображение с нормальными градиентами
7) Если текст все равно выглядит нечетким, скомканным, как отпечатанный принтером, в котором заканчивается краска, то скорее всего у вас отключен режим Clear Type. Для его включения все в той же настройке экрана внизу нажимаем на “Сделать текст и другие элементы больше или меньше”. Появится панелька:
сделать текст и другие элементы больше или меньше
Слева в меню заходим в “Настройка текста ClearType”. И в появившемся окне ставим галочку “Включить ClearType”. При этом на мониторе сразу можно увидеть изменения и понять, что к чему. Нажимаем кнопку далее и выбираем наилучшие для вас варианты текста. Там не сложно, поэтому скриншоты приводить не буду.
настройка текста ClearType
8) Если элементы интерфейса на экране выглядят маленькими, то в меню, в которое мы зашли в 7- пункте, выбираем “Другой размер шрифта (точек на дюйм)”. Появится окошко выбора масштаба:
В среднем окне заходим в видеоадапетры и нажимаем на название видеокарты. В выскочившем окне переходим во вкладку “Драйвер”.
Такая ситуация говорит о том, что кто-то лазил в настройках монитора (сенсорная или кнопочная панель сбоку, сзади или на передней панели монитора) и случайно, или специально, перенастроил положение экрана.
Но это в лучшем случае т.к. вполне возможно, что начались проблемы с монитором и он не запоминает настройки положения экрана, а значит что-то вышло из строя и его необходимо вести в ремонт. Но для начала не будем паниковать. Просто зайдите в настройки монитора, выберите меню положение и отрегулируйте так, как Вам необходимо, или же можно выбрать автоматическую настройку экрана, выбрав соответствующий пункт в меню монитора, или нажав клавишу ввода на мониторе вне меню (закройте меню монитора, чтобы был чистый экран) – все зависит от модели.
Меню монитора примерно выглядит так:
Если все получилось и часть экрана больше не пропадает, попробуйте на некоторое время выключить монитор из розетки и заново его включить. Если все будет в порядке то беспокоиться не о чем, а если положение снова сбросится и экран будет смещен в одну из сторон, то лучше пораньше сдать монитор в ремонт т.к. неизвестно, к чему может привести такая проблема в дальнейшем. Удачи!
Ах да, не спешим расставаться. Поменять положение экрана можно также в панели управления видеокартой, поэтому зайдите в меню видеокарты (ПКМ на рабочем столе и найдите Nvidia/AMD). Найдите в панели настройки экрана и выполните сброс по умолчанию. Вот теперь все.
Источник
Стабилизация экрана в Android
Пробовали ли Вы читать книгу или статью вроде этой в автобусе или идя по улице? Могу поспорить пробовали! В этом случае Вы должны были заметить что чтение текста таким образом является не лучшей идеей из-за постоянной тряски. Похоже что тряска экрана является достаточно серьезной проблемой и устранение ее может дать очень хорошее улучшение UX. Моя идея состоит в том, чтоб использовать датчики ускорения для компенсации тряски так-же как зеркальные камеры стабилизируют сенсор или линзы. Технически это возможно так что почему бы не попробовать сделать это самому!
Существующие решения
Для начала давайте посмотрим на существующие решения. В Сети есть несколько интересных статей на такую-же тематику.
- NoShake: Content Stabilization for Shaking Screens of Mobile Devices от Lin Zhong, Ahmad Rahmati и Clayton Shepard об стабилизации экрана для iPhone (3) опубликованная в 2009 г. Статья подытоживает что стабилизация экрана работает и дает заметные результаты, но алгоритм потребляет “в среднем 30% мощности у 620 МГц ARM процессора”. Это делает эту реализацию непрактичной для реального применения. И хотя современные айфоны могут легко справится с данной задачей авторы не предоставили ни исходников ни собранного приложения чтоб можно было попробовать это в деле.
Walking with your Smartphone: Stabilizing Screen Content от Kevin Jeisy. Эта статься была опубликована в 2014 и имеет хорошее математическое обоснование. Статья подытоживает что «используя скрытую марковскую модель мы получили хорошую стабилизацию в теории». К сожалению не предоставлено ни исходные кодов, ни собранного приложения, так что посмотреть не получится.
Эти статьи дают хорошее объяснение темы нашей статьи но к сожалению не дают ни исходных кодов, ни скомпилированных приложений чтоб посмотреть на это в живую. Давайте попробуем изобрести колесо заново и реализуем стабилизацию экрана по своему.
Теория
Датчик ускорения может быть использован для определения перемещения устройства. Но судя по названию этот датчик предназначен все таки для определения ускорения. Чтоб ответить на вопрос «как определить перемещение имея ускорение», давайте посмотрим на устройства с датчиками:
Как видно там есть есть три оси, соответственно датчик дает три значения на выходе. Технически датчик состоит из трех датчиков расположенных по разным осям, но давайте воспринимать его как единое целое.
Три значения на выходе обозначают ускорение вдоль соответствующей оси:
Ускорение меряется в “м/с2”. Как можно видеть там есть некоторое ускорение вдоль оси Y. На самом деле это ускорение свободного падения и любой поворот устройства изменит все три значения:
Вы можете представить себе его как шар привязанный к устройству веревкой. Это достаточно хорошее объяснение так как если замените шар стрелкой, то получите вектор ускорения.
Хорошо, но что насчет определения перемещения?
Я не могу показать какой-то наглядный пример, но если Вы немного переместите устройство, то вектор изменится: на самом деле он будет состоять из двух векторов: 1) вектор земного притяжения как и раньше; 2) вектор ускорения устройства из-за перемещения вдоль соответствующих осей. Самое интересное для нас это «чистый» вектор перемещения. Его достаточно просто просто получить путем вычитания вектора земного притяжения из результирующего вектора, но как определить истинный вектор земного притяжения? Эта задача может быть решена разными путями, но к счастью Андроид имеет специальный датчик линейного ускорения который делает как раз то, что нам нужно. В нормальных условиях выходные значения у датчика 0, и только перемещая устройство можно получить не нулевые значения. Здесь его исходный код если интересно. Мы на один шаг ближе к определению перемещения устройства. Давайте начнем программировать что нибудь.
Реализация
Чтоб найти как высчитать перемещение устройства давайте разработаем одно простое приложение с одной активити. Это приложение будет мониторить изменение ускорения и двигать специальный вью элемент соответствующим образом. Также оно будет показывать «сырые» значения ускорения на графике:
Я покажу только ключевые примеры кода. Полностью весь код есть в GIT репозитории. Ключевые вещи следующие:
1. Специальный элемент который мы будем двигать. Это синий блок с текстом внутри контейнера:
Для перемещения layout_sensor мы будем использовать методы View.setTranslationX и View.setTranslationY.
Также подпишемся на событие нажатия на какой-либо элемент для сброса внутренних значений в 0 потому что на первых порах они могут быть очень непослушными:
2. Подпишемся на события датчика ускорения:
3. И самое главное: слушатель изменений. Его базовая реализация:
Давайте разберемся что здесь происходит. Метод onSensorChanged вызывается каждый раз когда значение ускорения изменяется (прим. переводчика: ну на самом деле он вызывается по таймеру не зависимо от того какие значения ускорения). Первым делом вы проверяем инициализирована ли переменная timestamp. В этом случае мы просто инициализируем основные переменные. В случае если метод вызван повторно, мы производим вычисления использую следующую формулу:
Вы должны были заметить интересную константу 10000. Воспринимайте ее как некое магическое число.
Как видно текущая реализация имеет две проблемы:
- Дрифтинг и уползание значений
- Контрольный элемент не возвращается в 0
На самом деле решение для обоих проблем есть общее — нужно ввести в формулу торможение. Измененная формула выглядит так:
Хорошо. Текущая реализация выглядит неплохо. Я бы добавил некоторые косметические улучшения типа низкочастотного фильтра для сглаживания, отрезание недопустимых значений и настройки программы.
Готовое приложение находится в репозитории в ветке “standalone_app”.
Мы разработали базовый алгоритм стабилизации и сделали демонстрационное приложение которое показывает, что стабилизация экрана возможна. Теперь мы можем применить нашу работу к устройству в целом. Это непростая задача, но тем интереснее будет ее решать.
Эта задача требует некоторого опыта в сборке AOSP. Google предоставляет всю необходимую документацию. В общем нужно скачать исходные коды Андроид для выбранного Nexus устройства. Собрать прошивку для Nexus и прошить ее. Не забывайте включить все необходимые драйвера перед сборкой.
Как только получится собрать стоковую прошивку, можно приступать к разработке и интеграции стабилизации экрана.
План реализации следующий:
Сейчас я просто расскажу как я решил эти задачи.
1. Первый файл для исследования DisplayDevice.cpp который контролирует параметры экрана. Метод на который нужно смотреть void DisplayDevice::setProjection(int orientation, const Rect& newViewport, const Rect& newFrame). Самое интересное находится в строке 483:
где финальная матрица преобразований образуется из других компонентов. Все эти переменные являются экземплярами класса Transform. Этот класс предназначен для обработки преобразований и имеет несколько перегруженных операторов (например *). Чтоб добавить сдвиг добавим новый элемент:
Если Вы скомпилируете и прошьете Ваше устройство, экран там будет смещен на translateX пикселей по горизонтали и translateY пикселей по вертикали. В конечном итоге нам нужно добавить новый метод void setTranslate(int x, int y); который будет отвечать за матрицу сдвига.
2. Второй интересный файл SurfaceFlinger.cpp. Этот файл есть ключевым в создании API для доступа к параметрам экрана. Просто добавим новый метод:
который будет вызывать метод setTranslate для всех дисплеев. Другая часть выглядит немного странной, но я объясню это позже. Нам нужно модифицировать метод status_t SurfaceFlinger::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) добавив новую секцию в конструкцию switch:
Этот код является точкой входа в наше улучшение.
3. Служба обработки данных достаточно простая: она использует алгоритм разработанный ранее для получения значений смещения. Дальше эти значения через IPC передаются в SurfaceFlinger:
ServiceManager не распознается Android Studio потому что он недоступен для не системных приложений. Системные приложения должны собираться вместе с AOSP с помощью системы сборки makefile. Это позволит нашему приложению получить необходимые права доступа в скрытым API Андроид. Чтоб получить доступ к службе SurfaceFlinger приложение должно обладать правами “android.permission.ACCESS_SURFACE_FLINGER”. Эти права могут иметь только системные приложения (см. далее). Чтоб иметь право вызывать наше API с кодом 2020, приложение должно иметь правами “android.permission.HARDWARE_TEST”. Эти права также могут иметь только системные приложения. И что в конце концов сделать наше приложение системным, модифицируйте его манифест следующим образом:
Также создаете соответствующий makefile:
Остальные вещи в приложении (broadcast receiver загрузки, настройки, другое) достаточно стандартные и я не буду из касаться здесь. Осталась показать как сделать это приложение предустановленным (т.е. вшитым в прошивку). Просто разместите исходный код в каталоге
Вы можете найти детальную информацию и исходный код на GitHub
Там есть приложение ScreenStabilization которое должно быть размещено в каталоге
Прошивка для Nexus 2013 Mobile собрана в конфигурации “userdebug” так что она больше подходит для тестирования. Чтоб прошить прошивку загрузитесь в режим загружчика удерживая кнопку “volume down” и нажимая кнопку “power” одновременно. Дальше введите:
Эта процедура удалит все существующие данные на Вашем устройстве. Имейте ввиду что для того чтоб прошить любую нестандартную прошивку Вы должны разблокировать загружчик командой:
Заключение
Эта статья показывает как реализовать простой алгоритм стабилизации экрана и применить его ко всему устройству путем модификации исходных кодов Андроид и сборки пользовательской прошивки. Алгоритм не идеальный но достаточный для целей демонстрации. Мы создали модифицированную прошивку для устройства Nexus 2013 Mobile, но наш исходный код может быть применен к любому Nexus устройству и даже к любой AOSP системе типа CyanogenMod что делает возможным интеграцию стабилизации экрана в новые устройства.
Источник