Xamarin.Formsでスライドショー的なものを作った
Taskとか分かってないマンです。とりあえずiOS,Androidで動作確認できたので記述します。
スライドショー的なのできたー #Xamarin pic.twitter.com/aMgNM4iupM
— 吉田カエル@長崎 (@Frog_woman) 2018年5月28日
参考サイト
Xamarin.Forms の Device クラスについて(特に Device.OnPlatform)
Twitterで頂いたお言葉
Xamarinに限らず、ほとんどのUIフレームワークにおいて、UI要素の更新はUIスレッド限定なので、覚えておくと良いかもしれません。
— Atsushi Nakamura (@nuits_jp) 2018年5月28日
コード
<ContentView>
<Image x:Name="img1"/>
</ContentView>
using System.Threading.Tasks;
public MainPage()
{
InitializeComponent();
//スライド用の画像はまず透明にしておく
img1.Opacity = 0;
//画像配列を作成
List<string> imgList = new List<string>();
imgList.Add("cat1.jpg");
imgList.Add("cat2.jpg");
imgList.Add("frog1.jpg");
imgList.Add("frog2.jpg");
//配列数取得、配列は0からなのでデクリメント
int imgCount = imgList.Count;
imgCount--;
//参照する配列番号
int imgNum = 0;
//タスク
async Task Slideshow()
{
//画像パスの作成※"test.img."はプロジェクト名.ディレクトリ名 です
String ImagePath = "test.img." + imgList[imgNum];
//画像を反映※最初に1度だけ通ること前提処理
this.img1.Source = ImageSource.FromResource(ImagePath);
//画像がループするようにする
while (true)
{
var nextImgNum = await Task.Run(async () =>
{
//3000ミリ秒かけて徐々にスライド画像を不透明に
await img1.FadeTo(1, 3000);
//3000ミリ秒かけて徐々にスライド画像を透明に
await img1.FadeTo(0, 3000);
//次の画像のインデックス
imgNum++;
//もし、ネクストインデックスが画像配列に存在しない数値だった場合0に戻す
if(imgCount < imgNum){
imgNum = 0;
}
//次に参照する画像パス
var num = "test.img." + imgList[imgNum];
return num.ToString();
});
//UIスレッドに戻す処理
Device.BeginInvokeOnMainThread(() => {
//画像を反映
this.img1.Source = ImageSource.FromResource(nextImgNum);
});
}
}
//Taskの開始
Task startupWork = new Task(() => { Slideshow(); });
startupWork.Start();
}
分からない部分
Xamarinに限らず、ほとんどのUIフレームワークにおいて、UI要素の更新はUIスレッド限定なので、覚えておくと良いかもしれません。
— Atsushi Nakamura (@nuits_jp) 2018年5月28日 <ContentView>
<Image x:Name="img1"/>
</ContentView>
using System.Threading.Tasks;
public MainPage()
{
InitializeComponent();
//スライド用の画像はまず透明にしておく
img1.Opacity = 0;
//画像配列を作成
List<string> imgList = new List<string>();
imgList.Add("cat1.jpg");
imgList.Add("cat2.jpg");
imgList.Add("frog1.jpg");
imgList.Add("frog2.jpg");
//配列数取得、配列は0からなのでデクリメント
int imgCount = imgList.Count;
imgCount--;
//参照する配列番号
int imgNum = 0;
//タスク
async Task Slideshow()
{
//画像パスの作成※"test.img."はプロジェクト名.ディレクトリ名 です
String ImagePath = "test.img." + imgList[imgNum];
//画像を反映※最初に1度だけ通ること前提処理
this.img1.Source = ImageSource.FromResource(ImagePath);
//画像がループするようにする
while (true)
{
var nextImgNum = await Task.Run(async () =>
{
//3000ミリ秒かけて徐々にスライド画像を不透明に
await img1.FadeTo(1, 3000);
//3000ミリ秒かけて徐々にスライド画像を透明に
await img1.FadeTo(0, 3000);
//次の画像のインデックス
imgNum++;
//もし、ネクストインデックスが画像配列に存在しない数値だった場合0に戻す
if(imgCount < imgNum){
imgNum = 0;
}
//次に参照する画像パス
var num = "test.img." + imgList[imgNum];
return num.ToString();
});
//UIスレッドに戻す処理
Device.BeginInvokeOnMainThread(() => {
//画像を反映
this.img1.Source = ImageSource.FromResource(nextImgNum);
});
}
}
//Taskの開始
Task startupWork = new Task(() => { Slideshow(); });
startupWork.Start();
}
分からない部分
Warningが一箇所出ています
Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the 'await' operator to the result of the call.
指摘やアドバイスがあれば是非お願いします
Author And Source
この問題について(Xamarin.Formsでスライドショー的なものを作った), 我々は、より多くの情報をここで見つけました https://qiita.com/FrogWoman/items/04906c6c00a1217e9379著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .