Xamarin Part6
■ このスレッドは過去ログ倉庫に格納されています
>>216
「大事なのは技術じゃない」 という言葉が大はやり。
たとえば、「ゲームは芸術」だという考えが蔓延した結果、日本では、
リアルさの無い幼児向けかと思うようなアホみたいななゲームなゲームばかり
になった。任天堂はまだまし。スクエアは、PC-8801時代は、高速な
グラフィック描画技術を売りにしていたのに、今では、アニメ調のアホみたい
な絵になってしまった。これは技術から芸術へシフトした結果か。
>>215
話は変わって、Adobe の PDF Reader が使いにくいのは、Appleの指針の
せいかも知れない。 リスト表示とかタブとか自分で作りたくねえだろ
標準の部品があることはありがたい >>219
GUI(Widget) ToolKit には、以下の2種類あることを言っているだけで、
アプリ・プログラマが独自に描くという意味ではない。
1. Widget を OSの Widget を使わずにライブラリが独自に描画する。
例. Java(Swing), Qt, FLTK
条件が同じなら、描画が PIXEL 単位でどの Platform でも同じになり、
全プラットフォーム完全互換も夢ではなく、あるプラットフォームでテストすれば、
他のプラットフォームでもそのまま動く可能性が高い。
反面、Apple の審査は通りにくいかも。
2. 各OSのWidget(Win32 Control[EditBox, ListBox, ComboBox, Button, SlideBar, ToolBar], Dialog など)
をそのまま使う。
例. wxWidget
各 OS の Native な GUI と同じなので、ユーザーの混乱は少ない反面、
互換性の問題が生じたり、OSごとに異なるバグが隠れていることがある。
Apple の審査は通り易いかも。 個人的には Flutter vs ネイティブ勢 (Xamarin, React Native, Kotlin Native) だと思うけどどっちが勝つんだろう。Flutter 次第な感じかな 勝ち負けじゃない気が。
各々利点欠点あるからどれかが他を制圧するって感じにはならないんじゃ この場合のネイティブはネイティブのSDK、コントロールなどを使うかどうかって話だと思うの Forms 4.0 から iOS 向けのマテリアルデザインコンポーネントバインディングして Android/iOS 両方デザイン統一しやすくするみたいだな。これはなかなか良さげ 難しいのかもしれないけど Live Previewer はよ復活させてホットリローディングできるようにしないとキツそう みなさんクロスプラットホームのFormsでやってる人が多いんですか?
僕はこれから参考書買って始めようと思うんだけど
Andoroidしか持ってないからAndoroidネイティブから始めようと思ってるけど
Formsとネイティブは相当違うんですか?
予備知識無で始めるにはどっちがいいですか? あらゆる言語・フレームワーク・ゲームエンジンの著者、
掌田津耶乃が、Flutter の本を出した! >>229
んーネイティブは普通にAndroidをKotlinなりで開発する方法をC#に翻訳した感じだけど、formsはネイティブの上にUIフレームワークを乗っけてる感じなので、例えばTODOリストを作るとしても全然違う。
それぐらいだとformsではスタートアップのところでしかMainActivityとかに触ることはない。
自分もformsで業務アプリ作ってるけどAndroidの開発ほとんど知らないで作った。
が色々やってるとそのうちネイティブにも触らないといけなくなる。レンダラーとか。
formsはネイティブの知識があまり知らなくても共通に動かせるものが作れる。
けど突っ込んだことやる場合にネイティブのことを知らないといけなかったりネイティブの方がやりやすいこともある。
自分の感想では凝ったアプリでもかなりの部分はformsで作れるので自分ならforms使う。最近はflutterも良さげなので場合によってはそっちを選択するもよし。 自分ならネイティブにする
Forms の仕組みも理解しなきゃいけないから学習曲線なだらかな方が楽じゃないかな でも単一プラットフォーム向けに調整するだけでいいから、Forms が極端にネックになることもなさそうだしどっちでもそんなかわんないか >>234
各々のネイティブに詳しいならだけどそうでなかったらとりあえず両方で動く何かを作るんだったら formsの方が覚えること少ないと思うけどな
もちろんまともなものを作ろうとしたらおいおいネイティブの知識も必要になるけど。 >>232
情報も何もJavaの情報をそのまま流用するだけだろw LineBreakModeっておかしくない?
CharacterWrap とか WordWrap って折り返しの方式なのに
TailTruncation とか MiddleTruncation って文字列が入りきらないときの表示の方式
二つの意味が混在してる意味が分からない
Label で CharacterWrap かつ MiddleTruncation したいときどうすればいいの? >>239
Effect なりを使わないと無理みたいだよ
公式でサポートしてほしい気もするから Issue 作ってみてはどうでしょうか? プログラミング初心者でxamarin.Formsに手を出して5chブラウザ作ってるんだけどスレの表示に困ってる
Labelで書くとリンクや安価をタップできるようになるけど遅い(数秒〜10秒程度)
ListViewで書くと速いけど安価やリンクを押せるように出来ない(レスの塊としては押せると思う)
レス本文をパースして安価やリンクを押せるようにする自作ViewCell?を作ってListViewに入れるのが手っ取り早い気がしてるけど、パースするようなビューはコードでしか書けずコードでバインディングする(あるいはバインディングせずにListViewを使う)方法が分からない
用語がよく分かってないから変なこと言ってたら申し訳ないけどつまりは、スレを速く表示することとURLや安価をタップ可能な構造を両立したい MVVMはわかる?
MなりVMなりでパースしたものをVでバインディングすればいい
リストビューを使わないやつで何がそんな遅いのかはよく分からないんだが。
全部パースしてモニョモニョしてるから? >>242
独学ばかりだから雰囲気でしか理解してないけどMVVMは表示系(V)とロジック系(M)とそれをつなぎ合わせる部分VMみたいな理解してる
Labelが本質的になぜ遅いかは分からないけど調べると40要素で100msくらいかかるって言ってるページがあったから数百レスあるスレでID、本文、名前とかごとにLabelを使うと数秒かかるのは納得してる
実際レス番だけ表示するようにしてもlabelを使うと800くらいあるスレで2,3秒かかった
(じゃあなぜListViewは速く描けるのか?はよく分からない。部分的に描画してるから?)
事前にパースしてっていうのはたぶんLabelを使うパターンを想定してると思うけど上の通りラベル単体で遅いからできなかった
それともListViewのセル内のバインディングを動的に弄ることができる?
こんなに早くレスしてくれてありがとう MVVMのおおまかな説明はそれでいいかと。
まあとにかくUI向けのコードを分離する1つの方法です。
GUI系のアプリは基本的にUIコントロールでの処理がムッサかかるからそこをなるべく避けないと。
全部のデータをラベルにぶっこんでたらおそくなるのは必然かと。
リストビューが速いのは言われるように部分的にしか表示しないから。仮想リストビューとかでググると出てくる。ちなCacheStrategyだったかな?そこの指定で仮想じゃなくも出来る。
5chのデータ形式は知らんが受信したデータを表示できる文字などに変換する部分のことをパースと言ってる。ラベルは関係ない。
MVVMの形にのっとってたらビューセル内のラベルが対応したVMのプロパティにバインディングしてるので、そのプロパティを変更すれば対応したラベルの表示が変わる >>244
ごめん、後半があまり分かってないから確認しながら返信してる
分からないことが多くて申し訳ない
> 受信したデータを表示できる文字などに変換する部分のことをパースと言ってる。ラベルは関係ない。
現状VMまででやっているのは文字コードの変換、不要なHTMLタグの除去、res構造体にID、名前、時間、レス番、本文に分けてstring型で入れてる
ここまでをパースと呼んでいる? それとももっと他に含むものがある?
> MVVMの形にのっとってたらビューセル内のラベルが対応したVMのプロパティにバインディングしてるので、そのプロパティを変更すれば対応したラベルの表示が変わる
ビューセルと言うことはListView使うこと前提で良い?
上で書いたres構造体をそのままビューセルにバインディングするということ?
確かにそれは速く描けるのだけど、そうすると安価やリンクを挿入できない問題に至る
res構造体の本文要素をさらに細かくすると、レス毎に分解のされ方が違うから単純なバインディングで解決出来ない(ように思う) ラベルのテキストで省略とかがあることを考えるとプロパティの値に応じて見た目を弄ることが出来るわけだから本文を受け取ってそれを安価部リンク部で表示を変えるビューを自作すれば良いのかな?
どう作るか見当つかないけど… ListView もしくはそんな感じのネイティブ実装にするかの 2 択になる
ListView の場合、バインディングするとしたら表示時に全レス分 ViewModel 作ると遅いので、
俗に言う Infinite Scroll と言われる実装にしないと現実的なパフォーマンスは出ないと思うよ バースがどこまで含むかはやりたいこと次第だと思われ。
とにかく何かしらの受信データから処理に必要な値なりを抽出する部分
ViewCellにラベル乗っけたら安価とか何でも出来ると思うけどダメなん?
分解のされ方が違うから単純なバインディングで出来ないはよく分からんのだけど、DataTemplateSelector的な話かの レスの本文を表示するときに、分解された部分毎にラベル割り当てようとしてるんだろ。
そうすると、レスの内容によってURLやアンカーの数が違うからひつなラベルの数も違うから設計時にバインディングできないってことだろ。 本文用のらべる1個にしてFormattedTextで色付けして、部分クリックとかできたっけ? >>248
もしかして何か根本的なところで俺の理解がおかしい…?
色々弄ってる最中で本文しか表示してないけど今はこんな感じなんだ
https://i.imgur.com/8fglyEg.jpg
これを
https://i.imgur.com/BLqhbky.jpg
こんな風に部分的に選べるようにしたいのだけど、ViewCelって一律にバインディング指定してるから安価のあるレスの安価のある場所だけ別にバインディングするって出来ないと思ってる
まさに>>249
>>247
とりあえずListViewで攻めてみる
ネイティブで書く場合はまた別のスレになるのかな https://stackoverflow.com/questions/40592475/partial-text-clickable-in-xamarin-label
ああこの一番下のレス見るとLabelのFormattedTextで部分クリックとかできるね。レスの本文用のラベルをレス毎に1個用意して、これでアンカーやURL部分を色付けしてクリック時の処理書けばいい 後はこのFormattedTextの中身を組み立てる部分をどこに書くかだね。UWPの場合、添付プロパティ追加してそこに書いたりてきるけど。俺はxamarin使った事はねぇからそこは詳しいヒトにまかせる。 >>253
やりたいことはまさにこれ!
でも今日はもう眠いのでまた明日来ます 自分がやるとしたらViewModelにはOservableCollection<FormattedTextSrc>みたいなのがあってFormattedTextSrcはSpanなどにほぼ一対一対応することができるただのデータ。
たとえばList<Tuple<int,string>>などをプロパティで持っててintはその文字列をどのように扱うかがわかるもの。intはもちろんenumか何かにすべき。
でUI側のResViewなりがOnBindingContextだっけ?バインディングした時に上がるメソッドでそのListからFormattedTextを組み立てる >>255
OnBindingうんたらで大体なんとかなった!
https://i.imgur.com/wGRoAVF.jpg
細かな問題としてはvmまでにTupleのlistを作っても上手く渡せなかった(Timeout exceeded ...エラー出た)からvでstringを分解してること
中程度の問題としてはviewcellの塊自体にロングタップのイベント付ける方法が分かってないこと(多分、iOSプロジェクトの中にexportrendererみたいなのを書く? 出来なくともタップで代用できる気もしてる)
かなり大きな問題はセル内の安価をタップしたときに安価先を表示する方法(指定されたレスの実体なり参照なり位置なりを渡す方法と現在の画面の上にこんな感じに https://i.imgur.com/twtzEHs.jpg 表示か移動かする方法)の見当が全く付いてないこと
viewcellのOnBindingContext..は親画面のことも前後のレスの情報も知らないからそれを渡す方法が必要だよね? Viewは自分の表示位置は取れなかったかな…
スクリーン上でのView位置を取るような奴が何かあった気がするが。 後Viewの親は辿れると思うからそこで親のクラスを見つけるとかは出来ると思う >>258
親要素辿ってコンソールに表示できた
あとは自力でアプローチしてみる
色々ありがとう! だいぶ専ブラっぽい見た目になってきた
そういえばリストを渡せない問題はデフォ値がコピペ元のstringのままだったからだった
https://i.imgur.com/ecL8Ahs.jpg
安価はListViewにvmをバインディングして再帰的になんとかしようかなと考え始めてる
明日は予定あるし明後日から仕事始まるからあまり時間割けなくなるけど頑張る visual studio 2015 Professionalでxamarin開発を始めたら
後々困ったりすることある? >>263
対象のフレームワークが使えるなら大丈夫でしょうが、STANDARD2.0を使うのに1手間必要とかあるみたいですね。 WebAPIでホストのデータを取得し、Xamarin.Formsで受け取る処理を書いています。
WebAPIはLinuxでの実行も考えていますので、.NETCore 2.0 で、Xamarin.Forms は .NETStandard 2.0 を選択しています。
WebAPI側と、Xamarin側とで共通な処理を.NETCore 2.0のライブラリで実装しようとしましたが、プラットフォームが違うのでXamarin側で利用できません。
こういった場合、同じ内容を .NETStandard 2.0 のライブラリを作成し、ソースはリンクを張れば実現できるのでしょうか。
もしくは、「普通はこうやる」というのがあれば教えてください。 >>267
参照でのエラーです。
エラー NU1201 プロジェクト foo.core は netstandard2.0 (.NETStandard,Version=v2.0) と互換性がありません。 プロジェクト foo.core がサポートするもの: netcoreapp2.1 (.NETCoreApp,Version=v2.1) foo D:\Temp\VS2017\foo\foo\foo\foo.csproj 1 それサーバー側?
Standardのバージョン違うのでないとダメとか? >>269
.NETCore2.1 WebAPI のプロジェクトでのエラーです。
参照先は .NETStandard 2.0 クラスライブラリです。
とりあえずnuget経由なら、.NETCore2.1 のプロジェクトに .NETStandard のライブラリを追加できるようなので試してみます。 共通ロジックは.NetStandardクラスライブラリで作って、NugetパッケージにしてNASに放り込んどく
NASをローカルリポジトリに登録しといて、プロジェクトごとに欲しいやつを食わせる formのWPFとGTK#っていつプレビュー版じゃなくなるんだろ >>271
ライブラリ頻繁にいじるものでないならいいけど、そうでないとプロジェクト参照の方がいいな AndroidでC#のアプリをダウンロードすればアイコンをクリックするだけで
起動できるようにする場合、.NET の RUNTIME はいつインストールされる?
AndroidマシンはCPUが色々あるらしいので、.NET RUNTIME は、1つだけの
CPUに特化したものでは駄目なはず。なので、以下のどれかを行わなくてはならない
ハズ:
1. アプリの起動前に、手作業でそのCPUに応じたRUNTIME をインストールしておく。
2. アプリの初回起動時にCPUに応じたものをネットから自動ダウンロードする。
3. RUNTIMEは、CPU Native 用ではなく、Java仮想マシン用のものとする。
つまり、.NET 仮想マシンが、Java仮想マシンの上で動作する二重構造
とする。<--- めちゃくちゃ効率が悪い。 >>274
apkの中に各CPU向けランタイムも含まれてるから、ストアからアプリをダウンロードしたならそこに適切なランタイムも勝手に含まれている だからアプリとは別にランタイムをダウンロードする作業はありません androidならapkに各CPU用のランタイムが含まれてるんじゃねぇかな。つまりユーザーがアプリをダウンロードする段階で全部ダウンロードしてインストールしてる。 >>275
でも、CPUの種類は時間がたつにつれて増えていくかも知れないので、
それだと、2019年に作ったC#アプリのapkは、再コンパイルなしでは
新しい Android マシンでは起動できないと思うけど。 C#アプリの Android 版の apk は、15MB 程しかないらしい。
これに本当に全てのCPU向けの .NET ランタイムが入るだろうか?
Windowsマシンで、Windows Update の詳細記述を見ていると
.NET の 修正 Update だけで、数10MB〜数100MB あったと思う。
修正と言うのは、部分 patch にすれば小さく出来るはず。
それでも、こんなに大きい。
あらゆる Android マシンの、修正 patch ではない、完全な .NET ランタイムが、
本当に 15MB に入るのだろうか。
どっちにしろ、論理的に考えて、それでは新しいアーキテクチャの CPU には対応できない。 >>278
CPUが追加されるのとか数年に1回くらいだろ
再コンパイルすればいいじゃん
追加されたCPUが下位互換持ってたら再コンパイルなしでも動くし >>279
apkのランタイムサイズは15MB×サポートCPU数だろ
ストアからは適切なもんだけダウンロードされるから15MBのダウンロードになるわけだな >>281
そういう仕組みだったのか。
じゃあ、Java の思想とはぜんぜん違う。
Java の場合は、同じ jar ファイルが、異なるマシンでもそのまま動作する。
C#の場合、MSの判断一つで特定のCPU用のパッケージが作れなくなってしまう可能性が
ある訳だね。なんちゅうこっちゃ。Javaとは全く違うじゃない。 >>282
Java + NDK(C++)で作られてるアプリがたくさんあるだろ
それと同じことよ >>283
Android マシンには、最初からそのマシンの CPU に合わせた
JVM がインストールされているので、違うぞ。 >>281
あれ、そうなの?適切なものだけダウンロードだと開発者が署名したapk分解しちゃうの?署名無効になるな。
つか、arm端末にインストールされたapk覗くとx86のバイナリも含まれてるぞ >>287
x86コードの除去し忘れだったりして。 基本的に互換性のない新CPUなんてそう頻繁に出ないでしょ。
そのCPUの性能を100%引き出したいのでなければCPUが出る都度コンパイルなんてしないでしょ。 >>289
「各アーキテクチャ向けapk」と「それらをまとめたapk」は、
それぞれ何MB 位なの。
同じサイズということは論理的にありえないハズだが。 んなもの、アプリによって変わるにきまっているだろ。
Javaのアプリは何MBくらいなの?って聞かれて的確な答えが返せるの? >>288,289
あ、そういうオプションもあるのね。
xamarin関係なく前にいくつかの他人のapkとかリバースエンジニアリングしてたときぬにNDK使ってるやつでx86やらarmのバイナリが含まれてるのばっかだったからそういうもんだと思ってた。
c/c++部分がちょこっとだったからそうなってたのか。
すまんかった。 >>292
Android における C# の GUI の Hello World の場合に決まってるじゃん。 >>294
自分で試せばいいやん。ほぼ全部無料のものばかりだ。 自分で試せることすら率先してやらない程度の興味ならそれこそ時間の無駄じゃろ そんな簡単なことなのに、誰も答えられないということは、誰も試してないこと
が証明されました。
(証明終わり) そうだね
誰が何を知りたかった話なのかは当人以外どうでもいいからね 聞けば何でも教えてもらえると思ってるのは
典型的なゆとり わざわざhello worldの容量調べようなんてこと誰も考えないからこれから作らないと確認できない
それなら自分で作れば?となるのは極めて自然 C#の場合、よっぽど作りこまなければ自分のコード部分のバイトサイズなんて
アプリ全体のサイズの数%未満だろう。だから、Hello Worldでもなんでもあんま
変わらんかも知れんけどな。
C#アプリのサイズが仮に15MBとしよう。自分の書いたプログラムがコンパイル
された結果のバイナリコードは、大体20KB〜300KBくらいなんだよ、多分。 つか、xamarin.essentialsは誰もしないんだな アーキテクチャー別のバイナリーダウンロードする機能ってもう Xamarin でサポートされたんだっけ?
名前忘れちゃったけど割と最近 Android でサポートされた気がするからまだなんじゃないの
それ抜きにしてもリンカー入れれば最小のアプリサイズは 10MB 未満だよ アプリサイズより起動速度の遅さが気になるけど、その Qiita の投稿の手法だったり、Visual Studio の次のバージョンでも d8/r8 とかいうやつで改善されるらしいしよっぽどシビアな案件じゃなければ気になんないんじゃないのという気持ちがある つうか、そのアプリサイズって、起動直後にネットから追加 Download が
絶対に始まらない保障はあるの? 斬新な発想だな。ランタイムを段階的に追加ダウンロードするの? >>311
インターネットに繋がってない環境でapkインストールしてから正常起動するか試してみたらええやん Xamarin程の糞はない
ttps://twitter.com/ca_developers/status/1093416959243300864?s=09
https://twitter.com/5chan_nel (5ch newer account) 何のイベントか知らんけど参加者のMacユーザーの割合やクロスプラットフォーム開発ツール(?)への関心の低さを考えれば
当たり前の結果の気がする
というかクロスプラットフォームとマルチプラットフォームの使い方間違えてないか? ■ このスレッドは過去ログ倉庫に格納されています