Страницы

Поиск по вопросам

Показаны сообщения с ярлыком widgets. Показать все сообщения
Показаны сообщения с ярлыком widgets. Показать все сообщения

понедельник, 13 апреля 2020 г.

Рисование на виджете канвасом

#widgets #android #java

                    
Всем привет. Я уже задавал такой вопрос, но ответа так и не получил, задаю еще раз
:) Я пытаюсь нарисовать на виджете линию, круг или прямоугольник через канву, но ничего
не получается....
UPD:
решение найдено http://dajver.blogspot.com/2012/04/canvas-android.html    


Ответы

Ответ 1



А причем тут AppWidgetProvider? AppWidgetProvider нечто похожее на BroadcastReceiver - по сути некий сервис, который говорит "я умею показывать виджет", но он сам не рисует виджет! Это провайдер! Чтобы нарисовать виджет надо составить кастомный класс наследующий от View и в его методе onDraw() написать то что хотите. Вам уже в прошлый раз камрады указывали на вашу ошибку. Есличо смотрите пример реализации кастомного виджета здесь Update public class MySuperPuperWidgetView extends SomeExistingWidgetView { @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //рисуем виджет //далее пишем свою хрень на канвасе } }

четверг, 19 марта 2020 г.

QML vs QPainter Widget - что производительнее?

#widgets #qt #cpp #qml


Собираясь разрабатывать новое приложение (на C++ и Qt), столкнулся перед выбором:
как реализовать интерфейс - на QML или сделать по старинке виджетами (будет виджет,
наследованный от QPainter на котором будут отрисовываться объекты да скроллироваться,
и еще несколько виджетов с различными текстовыми полями и кнопками). С QML у меня нет
никакого опыта, поэтому на виджетах я сделаю интерфейс намного быстрее. Однако, может
быть у QML есть какие-то плюсы по сравнению с традиционными виджетами? Так какие же?
Что из них производительнее?    


Ответы

Ответ 1



Вы пытаетесь сравнивать кислое с синим. Вот скажите мне, например, что производительнее - XML или Frostbite 2? QML - это удобный способ программировать виджеты, транзишны, разнообразные визуальные эффекты и стили оформления. Он парсится как язык, но в конечном счете отрисовывает то, что вы ему сообщили, с помощью того же самого QPainter'a: QML builds directly upon QGraphicsView, which in turn builds upon QPainter, which in turn builds upon QPaintEngine (and the internal QGraphicsSystem classes), which have various hardware accelerated implementations. Утверждается, что любой случай сложной разметки и логики на QML можно проэмулировать, вручную создавая элементы на QGraphicsView, и, соответственно, получить абсолютно одинаковую производительность.

Ответ 2



Вот, что мне ответили на Хабре: Насчёт производительности — разница только на старте, когда грузится и парсится QML. Далее на его основе создаются обычные «плюсовые» объекты в памяти, так что во время исполнения разницы не будет. А если ваш QML не супер-дупер навороченный, то вы и во время загрузки разницы не ощутите. Плюсы у QML — более компактное, более читабельное описание интерфейса, а также тот факт, что тенденция развития Qt однозначно идёт к QML. В Qt5 вроде бы от нативных виджетов понемногу отходят (тут врать не буду, возможно неправ).

четверг, 23 января 2020 г.

Custom fonts in widget

#android #android_studio #шрифты #widgets #typeface


Здесь написано, что чтобы использовать свои шрифты нужно их превращать в картинку
с помощью битмапа и вставлять в виджет эту картинку. Вопрос 5-и летней давности, неужели
эта проблема так и не решена? Английские шрифты в Android Studio приятные, а вот кириллические
шрифты явно не доработаны. Есть ли какой-то способ без костылей свои шрифты внедрить?
    


Ответы

Ответ 1



Есть способ, выдолжны добавить свои шрифты в папку assets в папке приложения (где хранится папка java и папка ресурсов), если её нету, то создайте в том месте где описано выше. Пример исползования: textView.setTypeface(Typeface.createFromAsset(getAssets(), "tahoma.ttf"));

четверг, 26 декабря 2019 г.

Как сделать прокрутку QListWidget свайпом

#android #cpp #qt #widgets


Пытаюсь разобраться с Qt под Android. На форме размещен QListWidget, при этом привычная
сенсорная прокрутка свайпом не работает. 

Собсвтенно как реализовать прокрутку свайпом?

Файл проекта .pro:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = AndroidMainWindow
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

CONFIG += mobility
MOBILITY = 


В .cpp только заполнение QListWidget больше никаких изменений




for( short i = 0; i < 50; i++ )
{
    QListWidgetItem * item = new QListWidgetItem();
    item->setSizeHint( QSize(0, 70) );
    item->setText( "Элемент списка номер " + QString::number(i) );
    ui->listWidget->addItem( item );
}

    


Ответы

Ответ 1



Вначале обработку сенсора надо включить с помощью функции QWidget::grabGesture: QListWidget * my_list = ... my_list->grabGesture(Qt::SwipeGesture); Второй вариант, использовать класс QScroller: QScroller::grabGesture(my_list, QScroller::LeftMouseButtonGesture); Если QScroller не устраивает можно обрабатывать события от сенсора QGestureEvent самостоятельно (пример с doc.qt.io): bool MyWidget::event(QEvent *event) { if (event->type() == QEvent::Gesture) return gestureEvent(static_cast(event)); return QWidget::event(event); } bool MyWidget::gestureEvent(QGestureEvent *event) { if (QGesture *swipe = event->gesture(Qt::SwipeGesture)) swipeTriggered(static_cast(swipe)); else if (QGesture *pan = event->gesture(Qt::PanGesture)) panTriggered(static_cast(pan)); if (QGesture *pinch = event->gesture(Qt::PinchGesture)) pinchTriggered(static_cast(pinch)); return true; } Более подробно обо всей кухне

пятница, 20 декабря 2019 г.

Отловить изменение содержимого div

#javascript #jquery #widgets #javascript_events


У меня есть div, содержимое которого может меняться различными способами: например,
весь его контент может быть изменён через innerHTML, или могут быть добавлены узлы
через DOM-методы. Это может произойти через собственный javascript или через вызовы
jQuery API, или через другие библиотеки.

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

Я использую jQuery. Есть ли способ отловить изменение содержимого div?
    


Ответы

Ответ 1



MutationObserver (поддержка) const observer = new MutationObserver(mutations => console.log(mutations)); observer.observe(test, { attributes: true, childList: true, characterData: true, subtree: true }); test.innerHTML = '1'; test.classList.add('test'); test.appendChild(document.createElement('br')); test.innerHTML += '2';


Ответ 2



Вы можете использовать DOMNodeInserted и DOMNodeRemoved, чтобы проверить, добавлены или удалены элементы. К сожалению, IE не поддерживает это. $('#myDiv').bind('DOMNodeInserted DOMNodeRemoved', function(event) { if (event.type == 'DOMNodeInserted') { alert('Content added! Current content:' + '\n\n' + this.innerHTML); } else { alert('Content removed! Current content:' + '\n\n' + this.innerHTML); } }); Можно сохранить исходное содержимое и будущие изменения с помощью .data(). Вот пример. var div_eTypes = [], div_changes = []; $(function() { $('#myDiv').each(function() { this['data-initialContents'] = this.innerHTML; }).bind('DOMNodeInserted DOMNodeRemoved', function(event) { div_eTypes.concat(e.type.match(/insert|remove/)); div_changes.concat(this.innerHTML); }); }); Пример вывода: > $('#myDiv').data('initialContents'); "

Привет мир!

Это пример.

" > div_eTypes; ["insert", "insert", "remove"] > div_changes; ["", "

IANA — Example domains

", "

IANA – Example domains

"] Возможно, вы захотите включить DOMSubtreeModified, так как DOMNodeInserted и DOMNodeRemoved не запускаются, если элементы заменены через innerHTML. Он не работает в IE, но, по крайней мере, он отлично работает в других браузерах.

четверг, 6 июня 2019 г.

QML vs QPainter Widget - что производительнее?

Собираясь разрабатывать новое приложение (на C++ и Qt), столкнулся перед выбором: как реализовать интерфейс - на QML или сделать по старинке виджетами (будет виджет, наследованный от QPainter на котором будут отрисовываться объекты да скроллироваться, и еще несколько виджетов с различными текстовыми полями и кнопками). С QML у меня нет никакого опыта, поэтому на виджетах я сделаю интерфейс намного быстрее. Однако, может быть у QML есть какие-то плюсы по сравнению с традиционными виджетами? Так какие же? Что из них производительнее?


Ответ

Вы пытаетесь сравнивать кислое с синим. Вот скажите мне, например, что производительнее - XML или Frostbite 2? QML - это удобный способ программировать виджеты, транзишны, разнообразные визуальные эффекты и стили оформления. Он парсится как язык, но в конечном счете отрисовывает то, что вы ему сообщили, с помощью того же самого QPainter'a: QML builds directly upon QGraphicsView, which in turn builds upon QPainter, which in turn builds upon QPaintEngine (and the internal QGraphicsSystem classes), which have various hardware accelerated implementations. Утверждается, что любой случай сложной разметки и логики на QML можно проэмулировать, вручную создавая элементы на QGraphicsView, и, соответственно, получить абсолютно одинаковую производительность.

понедельник, 8 апреля 2019 г.

Отловить изменение содержимого div

У меня есть div, содержимое которого может меняться различными способами: например, весь его контент может быть изменён через innerHTML, или могут быть добавлены узлы через DOM-методы. Это может произойти через собственный javascript или через вызовы jQuery API, или через другие библиотеки.
Я хочу выполнить некоторый код, когда содержимое div изменится, но я абсолютно не контролирую, когда он изменится. Действительно, я разрабатываю плагин, который может использоваться другими людьми, которые могут свободно изменять содержимое своих div'ов так, как они предпочитают. Когда внутреннее содержимое этого div изменяется, форма плагина также может быть обновлена.
Я использую jQuery. Есть ли способ отловить изменение содержимого div?


Ответ

MutationObserver (поддержка)
const observer = new MutationObserver(mutations => console.log(mutations)); observer.observe(test, { attributes: true, childList: true, characterData: true, subtree: true }); test.innerHTML = '1'; test.classList.add('test'); test.appendChild(document.createElement('br')); test.innerHTML += '2';


пятница, 15 марта 2019 г.

Custom fonts in widget

Здесь написано, что чтобы использовать свои шрифты нужно их превращать в картинку с помощью битмапа и вставлять в виджет эту картинку. Вопрос 5-и летней давности, неужели эта проблема так и не решена? Английские шрифты в Android Studio приятные, а вот кириллические шрифты явно не доработаны. Есть ли какой-то способ без костылей свои шрифты внедрить?


Ответ

Есть способ, выдолжны добавить свои шрифты в папку assets в папке приложения (где хранится папка java и папка ресурсов), если её нету, то создайте в том месте где описано выше. Пример исползования:
textView.setTypeface(Typeface.createFromAsset(getAssets(), "tahoma.ttf"));

четверг, 29 ноября 2018 г.

Как сделать прокрутку QListWidget свайпом

Пытаюсь разобраться с Qt под Android. На форме размещен QListWidget, при этом привычная сенсорная прокрутка свайпом не работает.
Собсвтенно как реализовать прокрутку свайпом?
Файл проекта .pro:
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = AndroidMainWindow TEMPLATE = app
SOURCES += main.cpp\ mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
CONFIG += mobility MOBILITY =
В .cpp только заполнение QListWidget больше никаких изменений

for( short i = 0; i < 50; i++ ) { QListWidgetItem * item = new QListWidgetItem(); item->setSizeHint( QSize(0, 70) ); item->setText( "Элемент списка номер " + QString::number(i) ); ui->listWidget->addItem( item ); }


Ответ

Вначале обработку сенсора надо включить с помощью функции QWidget::grabGesture
QListWidget * my_list = ... my_list->grabGesture(Qt::SwipeGesture);
Второй вариант, использовать класс QScroller
QScroller::grabGesture(my_list, QScroller::LeftMouseButtonGesture);
Если QScroller не устраивает можно обрабатывать события от сенсора QGestureEvent самостоятельно (пример с doc.qt.io):
bool MyWidget::event(QEvent *event) { if (event->type() == QEvent::Gesture) return gestureEvent(static_cast(event)); return QWidget::event(event); }
bool MyWidget::gestureEvent(QGestureEvent *event) { if (QGesture *swipe = event->gesture(Qt::SwipeGesture)) swipeTriggered(static_cast(swipe)); else if (QGesture *pan = event->gesture(Qt::PanGesture)) panTriggered(static_cast(pan)); if (QGesture *pinch = event->gesture(Qt::PinchGesture)) pinchTriggered(static_cast(pinch));
return true; }
Более подробно обо всей кухне