首页 文章

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

提问于
浏览
1

我使用以下代码:

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 回答

  • 1

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

    I have implemented it as follows:

    首先为 all 项目(iOS,Android和WP)创建了一个子目录 \Embedded (直接在每个项目类型的项目根目录中) .
    然后将两个.jpg添加到所有项目中的新目录中 .
    在我的应用程序中,我有一个全局变量(GV.cEmbeddedAblage)
    This is filled in startup-code:

    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; }
      }
    

    然后我可以轻松地从共享代码(在注册页面上)访问图像(例如):
    Generate the path, load image in byte-array (if not already loaded):

    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;
         }
    }
    

    Fill another byte.array (with selected (loaded) male- / female- image):

    AvatarErfassung = GV.ByteSymbolMann;
    

    create the image on the page:

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

    Overtake the selected image as Source to the Image:

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

    你应该能够做到这一点......

相关问题