如何从Android上的Xamarin.Forms中的资产加载图像?

时间:2015-06-24 19:43:05

标签: xamarin xamarin.android xamarin.forms

我使用以下代码:

var baseUrl = DependencyService.Get<IBaseUrl> ().Get ();
var backgroundImage = new Image () {
    Source = FileImageSource.FromFile (
        System.IO.Path.Combine (baseUrl, "Content", "images", "background-2.jpg")
    )
};

iOS和Androids的DependencyServices如下所示:

// iOS
[assembly: Xamarin.Forms.Dependency (typeof (BaseUrl_iOS))]
namespace TuneProtectApp.iOS
{
    public class BaseUrl_iOS : IBaseUrl
    {
        public BaseUrl_iOS () { }
        public string Get ()
        {
            return NSBundle.MainBundle.BundlePath;
        }
    }
}

// Android
[assembly: Xamarin.Forms.Dependency (typeof (BaseUrl_Droid))]
namespace TuneProtectApp.Droid
{
    public class BaseUrl_Droid : IBaseUrl
    {
        public BaseUrl_Droid () {}
        public string Get ()
        {
            return "file:///android_asset/";
        }
    }
}

backgroundImage在iOS上加载但在Android上没有加载。如何从Android上的Xamarin.Forms中的资产加载图像?

1 个答案:

答案 0 :(得分:1)

在我的 Xamarin.forms(共享)应用中,我有一个注册页面,用户还必须为其头像选择图像。根据用户的性别,我将男性或女性符号图像显示为默认(用户可以选择另一个,如果他想这样做)。

我已将其实施如下:

首先为所有项目(iOS,Android和WP)创建了一个子目录 \ Embedded (直接在每个项目类型的项目根目录中)。登记/> 然后将两个.jpg添加到所有项目的新目录中 在我的应用程序中,我有一个全局变量(GV.cEmbeddedAblage)
这是填写启动代码:

string cNameSpace = "";
switch (Device.OS)
 {
   case TargetPlatform.WinPhone:
        cNameSpace = "MatrixGuide.WinPhone";
        break;
   case TargetPlatform.iOS:
        cNameSpace = "MatrixGuide.iOS";
   break;
        case TargetPlatform.Android:
        cNameSpace = "MatrixGuide.Droid";
   break;
//
}
GV.cEmbeddedAblage = cNameSpace + ".Embedded.";

此外,我为图像创建了一个全局字节数组(例如男性):

 static Byte[] _SymbolMann;
 public static Byte[] ByteSymbolMann
 {
   get { return _SymbolMann; }
   set { _SymbolMann = value; }
  }

然后我可以轻松地从共享代码(在注册页面上)访问图像(例如):
生成路径,以字节数组加载图像(如果尚未加载):

string cFilename = "";
if (GV.ByteSymbolMann == null) // not yet loaded - only load one time
 {
   cFilename = GV.cEmbeddedAblage + "SymbolMann.jpg";
   var assembly = this.GetType().GetTypeInfo().Assembly; 
   byte[] buffer;
   using (Stream s = assembly.GetManifestResourceStream(cFilename))
    {
       long length = s.Length;
       buffer = new byte[length];
       s.Read(buffer, 0, (int)length);
       GV.ByteSymbolMann = buffer;
     }
}

填写另一个byte.array(选定(已加载)男/女图片):

  AvatarErfassung = GV.ByteSymbolMann;

在页面上创建图片:

var Avatar = new Image { HeightRequest = 70, WidthRequest = 70, HorizontalOptions = LayoutOptions.Start };

将所选图像作为图像的源:

Avatar.Source = ImageSource.FromStream(() => new MemoryStream(AvatarErfassung));

你应该可以这样做......