【问题标题】:How to load an Image from Assets in Xamarin.Forms on Android?如何在 Android 上的 Xamarin.Forms 中从资产加载图像?
【发布时间】:2015-06-24 19:43:04
【问题描述】:

我正在使用以下代码:

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

iOS 和 Android 的 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 中从 Assets 加载图像?

【问题讨论】:

    标签: xamarin xamarin.android xamarin.forms


    【解决方案1】:

    在我的 Xamarin.forms (shared) 应用程序中,我有一个注册页面,用户还必须在其中为其头像选择一张图片。根据用户的性别,我默认显示男性或女性符号图像(然后用户可以选择另一个,如果他愿意的话)。

    我已经实现如下:

    首先为所有项目(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 };
    

    将选中的图片作为Source to the Image:

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

    你应该可以做类似的......

    【讨论】:

      猜你喜欢
      • 2015-06-29
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 2013-07-29
      • 1970-01-01
      • 2021-11-23
      相关资源
      最近更新 更多