Страницы

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

вторник, 25 декабря 2018 г.

Android. Как сделать активным касание в любую часть экрана?

У меня на экране есть несколько edit кнопок. После их заполнения нужно, чтобы весь экран стал активным и при нажатии на любую часть экрана переходило на следующий экран. Как это сделать?


Ответ

MainActivity.class
public class MainActivity extends AppCompatActivity{
EditText et; EditText et_2; LinearLayout main_layout;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_layout);
et = (EditText) findViewById(R.id.editText); et_2 = (EditText) findViewById(R.id.editText2); main_layout = (LinearLayout) findViewById(R.id.main_layout);
main_layout.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (et.getText().length() > 0 && et_2.getText().length() > 0) { Toast.makeText(getApplicationContext(), "onTouch работает", Toast.LENGTH_SHORT).show(); } return false; } }); } }
main_layout.xml


Нахождение положительных пиков функции


Требуется программно найти количество и местоположение положительных пиков на графике. Известно, что количество пиков нечетное. Обычно 3, 5 или 7. В данном случае 3. Также известно, что за каждым положительным пиком следует отрицательный. Как лучше решить такую проблему на Python? Желательно без подбора коэффициентов Дополнение: Данные всегда начинаются с положительного пика и заканчиваются отрицательным. Данные представляют собой вертикальную проекцию изображения, обработанную функцией np.gradient(projection)/projection. То есть отношение второй производной функции к её высоте.


Ответ

Поскольку просто локальный экстремум не устраивает, надо добавить проверку превышения порога для отбраковки мелких пиков и артефактов. Порог можно вычислить как СКО выборки, умноженное на некоторую константу, соответствующую доверительному интервалу для математического ожидания. На практике эту константу принимают равной 2.5
UPD С учётом дополнительных условий задачи пиком следует считать максимум на отрезке от "верха" (начальной точки или первого значения выше q) до "низа" (первого значения ниже -q). При этом для массива размерности n возможен следующий алгоритм:
Найти СКО выборки и вычислить порог q Положить top=0 Найти координату bottom первой точки отрезка [top, n-1] со значением меньше -q. Если такой точки нет, перейти к п.7. Найти координату максимума на отрезке [top, bottom-1]. Если значение максимума больше q, записать его в массив пиков. Найти координату top первой точки отрезка [bottom+1, n-1] со значением больше q. Если такой точки нет, перейти к п.7. Перейти к п.3. Использовать массив пиков.

Как запустить файл с рабочего стола?

Есть файл на рабочем столе.
$ file dash-qt dash-qt: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=43eb2b921a6519a2d2de1f30969182f597a13ac7, stripped
Я без проблем запускаю его из терминала командой ./dash-qt
Как запустить его двойным щелчком по иконке?


Ответ

попробуйте создать там же файл с произвольным именем, содержащим суффикс .desktop (bla.bla.desktop, например) и с таким содержимым:
[Desktop Entry] Name=blablabla Exec="/полный/путь/к/вашему/файлу/dash-qt" Terminal=false Type=Application
если программа требует для работы эмулятор терминала, замените в соответствующей строчке false на true
вот по этому файлу и «щёлкайте дважды».
дополнение: вроде бы, нынче некоторые «особо умные» de (desktop environments) начинают «вставлять палки в колёса», сообщая какой-то бред про «запуск недоверенной программы» (или что-то в этом духе), если у данного файла не стоит битов исполнимости. потому, на всякий случай, лучше их поставить:
$ chmod +x bla.bla.desktop
дополнение 2: можно сделать и без desktop-файла, манипулируя mime-типами: Запустить исполняемый файл в kubuntu

dp и dip в values/dimens

В чем разница между:
4.0dip
и
4dp
?


Ответ

Нет никакой разницы. Это абсолютно равнозначные величины.
dp = dip - density independent pixels, независимые от плотности пиксели. Абстрактная единица измерения, основанная на физической плотности экрана с разрешением 160 dp.
При плотности экрана 160dpi 1dp = 1пикселю.

Разные действия Click, LongClick и Touch на одно и то же место

Есть определенные сомнения, но все таки вдруг такое поведение возможно. Суть: у меня есть FrameLayout (отсюда) с событием onTouch для зуминга. В этом Frame есть несколько элементов, которые принимают события onClick и onLongClick:
for (int i = 0; i < locations.size(); i++) { locations.get(i).getView().setOnClickListener(onPoleClick); locations.get(i).getView().setOnLongClickListener(onPoleLongClick); }
если я выставляю слушателя на клик - перестает действовать MyFrame.onTouch и поле не зумится. Если убираю - соответственно, сижу без кликов, но с зумящимся полем. Если ставлю return false; в MyFrame.onTouch, он также перестает работать. Пробовал заменить locations.get(i).onClick на onTouch (MotionEvent.UP) - при return true клик до Frame не доходит, при return false MotionEvent.UP не срабатывает. MotionEvent.DOWN не даст обработать onLongClick...
Дудочка и кувшинчик, в общем. Может быть есть какой-то способ, чтобы onTouch срабатывал "сквозь" клики?


Ответ

Можно попробовать вот так:
public class ZoomFrameLayout extends FrameLayout { public ZoomFrameLayout(Context context) { super(context); }
public ZoomFrameLayout(Context context, AttributeSet attrs) { super(context, attrs); }
public ZoomFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); }
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { boolean upper = super.onInterceptTouchEvent(ev); if (!upper) { // Детектим жесты здесь стандартным детектором // и если зум - отрабатываем и выставляем return true } return upper; } }
Т.е. вид ZoomFrameLayout будет забирать себе только зум, а клики уйдут детишкам.
И кстати при таком использовании ScaleDetector будут все события перехватываться (там return true в конце). Можно попробовать что-нибуть вроде if (scaleDetector.isInProgress()) return true;

Как правильно работать со строками неопределенной длины на С?

Как правильнее работать со строками, длина которых заранее неизвестна?
Т.е. допустим есть функция, которая возврвращает какое-то сообщение. Сообщение может быть очен длинным.
char* get_hello() { char buffer[1024000]; memset(buffer, 0, 1024000 * sizeof(char)); ... while(fgets(...) != NULL) { sprintf(buffer, "%s%s", buffer, row); } ... char* result = malloc(sizeof(buffer) + 1); strncpy(buffer, result, sizeof(buffer)); result[strlen(buffer)] = '\0'; return result; }
Что здесь можно улучшить?


Ответ

У вас непонятно, хотите ли вы считывать весь файл или только строку - до первого
. Если это файл, и весь - то лучше запросить его размер, выделить соответствующий буфер и считать все и сразу.
Если это файл непонятной длины (типа stdin) или вам надо остановиться по прочтении
- то я бы выделил память (не в стеке, а сразу в куче - к чему эти лишние пересылки?) некоторой длины (грубо, каких нибудь 256 байт), и начал бы читать с помощью fgets. Ну, если буфера не хватает - увеличивал бы с помощью realloc, причем сразу в 2 раза, чтоб амортизированное количество переносов сделать O(1) и накапливал считанные куски строки в нем.
Примерно так.
Код нужен или реализуете сами? :)
Update: По просьбам трудящихся :) примерный набросок:
char* getString(FILE* f) { int size = 16, // размер буфера curpos = 0; // текущая позиция char * buf = malloc(size); // if (buf == NULL) - все проверки допишите сами while(fgets(buf+curpos,size-curpos,f)) { curpos += strlen(buf + curpos); if (*(buf+curpos-1) == '
') return buf; if (size - curpos < 2) { buf = realloc(buf,size*=2); } } return buf; };

Как сверстать элемент в виде капли?

Посоветуйте как или помогите сверстать вот такой эллипс


Ответ

Попробуйте так:
.vashElement { border-radius: 50% 0 50% 50%; }