Страницы

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

вторник, 7 января 2020 г.

Зафиксировать отображение в WebView

#android #webview


Есть простой WebView mWeb:

            
            


в который я передаю стороку html:

mWeb.loadData(myhtml, "text/html; charset=utf-8", "UTF-8");


Все работает нормально, но когда при прокрутке нечайно сделаешь свайп влево или прово,
текст начинает съезжать. Так вроде и ничего, но тут тоже проблема, текст стает не на
прежнее место после свайпа. Как можно зафиксировать отображение содержимого в WebView
чтобы не свайпилось по бокам?
    


Ответы

Ответ 1



Вам нужно указать действие на свайп: findViewById(R.id.html).setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_MOVE) return false; } });

Функция, возвращающая значения разных типов

#функции #типы_данных #rust


Как можно написать функцию, которая при определенных условиях возвращает значения
разных типов?

Например:

fn function(type_var:&str) {
   if type_var == "i32" {
      return 50i32;
   } else if type_var == "f64" {
      return 50.0;
   } else {
      return '50';
   }

    


Ответы

Ответ 1



В Rust строгая типизация, поэтому тип возвращаемого значения должен быть какой-то один. Тем не менее, можно создать тип-перечисление с различными типами вложенных значений в вариантах: enum ParsedValue { Int32(i32), Float(f64), String(String) } (последний вариант типа String с динамическим выделением и копированием строки, чтобы не отвлекаться на параметры времени жизни; если нужен пример не-аллоцирующей функции, могу развить). Функция в примере будет выглядеть так: fn function(type_var: &str) -> ParsedValue { if type_var == "i32" { ParsedValue::Int32(50) } else if type_var == "f64" { ParsedValue::Float(50.0) } else { ParsedValue::String(String::from("50")) } } По значению ParsedValue все равно придется делать что-нибудь вроде match, чтобы деструктурировать значение варианта, но этот match обязан быть исчерпывающим.

Как в WPF просмотреть изображение?

#c_sharp #wpf


Имеется объект System.Drawing.Bitmap. В WinForms можно было просто использовать PictureBox,
чтобы просмотреть изображение. В WPF есть контрол Image, которому Bitmap скормить нельзя.
Нашел способ переделки в BitmapImage

    using (MemoryStream ms = new MemoryStream())
            {
                bitmap.Save(ms, ImageFormat.Png);
                ms.Position = 0;
                BitmapImage bi = new BitmapImage();
                bi.BeginInit();
                bi.StreamSource = ms;
                bi.EndInit();
                return bi;
            }

    ImageBox.Source = logic.NextPage(); // это объект Image


Но ничего не происходит (хотя и ошибок нет). Нужна помощь.
    


Ответы

Ответ 1



Попробуйте добавить bi.CacheOption = BitmapCacheOption.OnLoad; перед bi.StreamSource = ms; Пояснение: BitmapImage содержит внутри оптимизацию, которая не грузит данные сразу, а запоминает StreamSource и грузит потом. Но вы уничтожаете MemoryStream (что правильно), поэтому BitmapImage не может позже загрузит данные. Для будущих поколений: System.Windows.Media.ImageSource BitmapToImageSource(System.Windows.Bitmap bmp) { using (var ms = new System.IO.MemoryStream()) { bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png); ms.Position = 0; var img = new System.Windows.Media.Imaging.BitmapImage(); img.BeginInit(); img.CacheOption = System.Windows.Media.Imaging.BitmapCacheOption.OnLoad; img.StreamSource = ms; img.EndInit(); return img; } }

Сохранение пропорциональности графиков в R (radial.pie)

#r #graph


Не в первой сталкиваюсь с такой проблемой, но решения пока не нашел.

Я строю четыре графика отображающих процентное соотношение значений четырех переменных. 

library(plotrix)

x1 <- c(0.09,0.187,0.269,0.441,0.013)
x2 <- c(0.207,0.262,0.259,0.242,0.03)
x3 <- c(0.147,0.237,0.249,0.339,0.027)
x4 <- c(0.052,0.11,0.242,0.581,0.015)

df <- cbind(x1, x2, x3, x4)
df1 <- data.frame(df)
df1 <- sqrt(df1)    #Беру корень по значениям, чтобы сектора выглядели более наглядно.

draw_rp <- function(dataf){
  for (i in 1:length(dataf)){
    xnew1 <- c(0.1, 0.1, 0.1, 0.1, 0.1, dataf[[i]])
    colors <- c(rep('white', nrow(dataf)), rainbow(nrow(dataf)))
    radial.pie(xnew1, show.grid = F, clockwise = T, sector.colors = colors)
  }
}

par(mfrow=c(2, 2))
draw_rp(df1)


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

df1
#         x1        x2        x3        x4
#1 0.3000000 0.4549725 0.3834058 0.2280351
#2 0.4324350 0.5118594 0.4868265 0.3316625
#3 0.5186521 0.5089204 0.4989990 0.4919350
#4 0.6640783 0.4919350 0.5822371 0.7622336
#5 0.1140175 0.1732051 0.1643168 0.1224745




Один из выходов это экспортировать графики в картинки. Оставить как есть график,
у которого самое большое значение и пропорционально размерам его секторов уменьшать
все остальные графики. В этом случае 4й график (0.7622336) оставить как есть, а картинки
остальных подгонять под него.

Каким образом можно автоматизировать процесс подгонки, чтобы на выходе я получал
графики с правильными пропорциями?
    


Ответы

Ответ 1



Попробуй добавить в белый сектор max значение из таблицы. ( мне кажется получается то что ты хочешь) draw_rp <- function(dataf){ for (i in 1:length(dataf)){ xnew1 <- c(max(dataf), 0.1, 0.1, 0.1, 0.1, dataf[[i]]) colors <- c(rep('white', nrow(dataf)), rainbow(nrow(dataf))) radial.pie(xnew1, show.grid = F, clockwise = T, sector.colors = colors) } }

Как реализовать кэширование в Windows Media Player?

#c_sharp #winforms #mediaplayer


Использую на форме media player, который проигрывает музыку напрямую с интернета.
Но бывает что интернет немного тупит и воспроизведение музыки на несколько секунд останавливается.
Можно ли как-то реализовать кэширование для 
музыки в windows media player? 

И есть ли еще какой-то нормальный aydio player для Windows Form?
    


Ответы

Ответ 1



Смотрите NAudio на http://naudio.codeplex.com, проигрывать музыку со стрима с буферизацией.

Что за кодировка ANSI в Notepad++

#кодировка #ansi


Приветствую всех. Открыл Notepad++. Там есть возможность преобразовать в ANSI. Непонятно,
что в этой программе подразумевается под кодировкой ANSI, ведь такой кодировки вроде
как несуществует. Насколько я знаю ANSI - это неофициальное обобщенное название кодировок
windows 1251, windows 1252, ascii(7bit). Так в какую кодировку будет преобразован текст ? 
    


Ответы

Ответ 1



В Windows под ANSI codepage обычно понимается «системная» кодировка. Она используется для не-юникодных программ (и кажется для не-юникодных файловых систем). Для стандартной американской версии это CP 1252, для русской — CP 1251. Хотя название и ссылается на стандарт ANSI, реально оно ничего общего со стандартом не имеет. Чаще всего это однобайтная кодировка, но для некоторых систем (например, японской) это MBCS. Следует различать ANSI-кодировку (используемую для не-юникодных Windows-программ) и OEM-кодировку (используемую для не-юникодных DOS-программ, в случае русской Windows это CP 866).

Ответ 2



Посмотрите ответ на ваш вопрос в официальной документации.

Ответ 3



Насколько я знаю ANSI - это неофициальное обобщенное название кодировок windows 1251, windows 1252, ascii(7bit). Так в какую кодировку будет преобразован текст ? Насколько я помню, там подразумевается общая их часть. Т. е. однобайтовая кодировка, со всеми кодами до 128. Всё, что вне этой области, превратится в вопросы.

Преобразование типов в C++

#cpp #типы_данных #преобразование


Как в C++ происходит преобразование типов при присвоении беззнаковому типу отрицательного
числа или числа не из диапазона типа? 
    


Ответы

Ответ 1



При выполнении присваивания производится преобразование исходного значения к типу переменной-приемника. Поведение определяется правилами таких преобразований. Переполнение при преобразовании в беззнаковый целый тип из целых типов (как знаковых, так и беззнаковых) обрабатывается по правилами модульной арифметики с модулем 2^N, где N количество значащих бит в целевом беззнаковом типе. Переполнение при преобразовании в знаковый целый тип из целых типов (как знаковых, так и беззнаковых) приводит к поведению, определяемому реализацией. Реализация в том числе имеет право в таких ситуациях выкидывать сигнал. Переполнение при преобразовании в целый тип из плавающих типов приводит к неопределенному поведению. Переполнение при преобразовании в плавающий тип приводит к неопределенному поведению.

Ответ 2



Данные преобразования описаны в разделе 4.7 Integral conversions стандарта C++. В этом разделе в отношении преобразования из знакового целочисленного типа в беззнаковый целочисленный тип написано 2 If the destination type is unsigned, the resulting value is the least unsigned integer congruent to the source integer (modulo 2n where n is the number of bits used to represent the unsigned type). [ Note: In a two’s complement representation, this conversion is conceptual and there is no change in the bit pattern (if there is no truncation). —end note ] Что касается преобразования в знаковый целочисленный тип, то там же написано 3 If the destination type is signed, the value is unchanged if it can be represented in the destination type (and bit-field width); otherwise, the value is implementation-defined. Если же объекты знаковых и беззнаковых целых чисел принимают участие в выражении, то сначала определяется их общий тип, чтобы вывести тип значения выражения, согласно правилам обычных арифметических преобразований. Например, согласно этим правилам если два целочисленных типа, беззнаковый и знаковый, имеют одинаковый ранг, то объект знакового типа преобразуется к беззнаковому типу. Вот пример, на который не каждый программист сможет сходу ответить. Допустим у вас на машине sizeof( long ) равняется sizeof( int ). Можно предположить, что оба эти выражения равны 4, хотя это не обязательно. И имеются следующие объявления unsigned int x = 0; long y = 0; Спрашивается: какой тип будет иметь выражение:) x + y