2016-09-12 10 views
1

私はXamarinを使ったマルチプラットフォームアプリを開発しています。これは一種のフォトフレームです。私はSDカードからファイルを読んで、私はそれを2秒ごとに表示したい。 次のコードの結果、残りの部分ではなく最初の画像を表示できますが、理由はわかりません。 ImageViewを使用して各画像とTimerイベントを表示します。XamarinのImageViewの画像を変更します

using System; 
using System.IO; 
using System.Collections; 
using System.Timers; 
using Android.App; 
using Android.Content; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using Android.OS; 
using Android.Graphics; 

namespace TestSpeedWithXamarin 
{ 
    [Activity(Label = "TestBattteryWithXamarin", MainLauncher = true, Icon = "@drawable/icon")] 
    public class MainActivity : Activity 
    { 
     Timer t; 
     ArrayList imagesArray; 
     int actualImage; 
     ImageView imageView; 
     protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 

      SetContentView(Resource.Layout.Main); 
      string rutaInicial = "sdcard/DCIM/Camera"; 
      imagesArray = new ArrayList(); 
      try 
      { 
       DirectoryInfo di = new DirectoryInfo(rutaInicial); 
       foreach (var item in di.GetFileSystemInfos()) 
       { 
        if (item.Extension == ".jpg" || item.Extension == ".png") 
         imagesArray.Add(item.FullName); 
       } 

      } 
      catch (Exception ex) 
      { 
       Toast.MakeText(this, "problem ", ToastLength.Long).Show(); 
      } 
      if (imagesArray.Count > 0) 
      { 
       t = new Timer(2000); 
       t.Elapsed += OnTimedEvent; 
       actualImage = 0; 
       t.Enabled = true; 
       mostrarImagen((String)imagesArray[0]); 
      } 
     } 
     private void OnTimedEvent(Object source,ElapsedEventArgs e) { 
      if (actualImage < imagesArray.Count-1) 
      { 
       actualImage++; 
       //imageView = FindViewById<ImageView>(Resource.Id.imageView1); 
       Bitmap imageBitmap = BitmapFactory.DecodeFile((String)imagesArray[actualImage]); 
       imageView.SetImageBitmap(imageBitmap); 
       t.Start(); 
      } 
     } 

     private void mostrarImagen(string imagePath) { 
      imageView = FindViewById<ImageView>(Resource.Id.imageView1); 
      Bitmap imageBitmap = BitmapFactory.DecodeFile(imagePath); 
      imageView.SetImageBitmap(imageBitmap); 
     } 

    } 
} 

TimerTaskを使用すると、マルチプラットフォームアプリが必要なので、私はよく分かりません。

答えて

2

UIスレッドで更新を実行することを確認してください。

private void OnTimedEvent(Object source,ElapsedEventArgs e) 
{ 
    if (actualImage < imagesArray.Count-1) 
    { 
     actualImage++; 
     //imageView = FindViewById<ImageView>(Resource.Id.imageView1); 
     RunOnUiThread(() => { 
      Bitmap imageBitmap = BitmapFactory.DecodeFile((String)imagesArray[actualImage]); 
      imageView.SetImageBitmap(imageBitmap); 
     });   
     t.Start(); 
    } 
} 

注:画像を読み込むのは常にAndroidの苦痛です。いくつかの画像の後であなたはOutOfMemoryの例外に遭遇するかもしれません。 handle image loading yourselfにしたくない場合は、またはUniversalImageLoaderを使用する必要があります。D