上篇文章分享了如何加载网络图片和PCL中的图片,所以今天继续分享关于如何加载平台的内嵌图片,在这之前说一下上篇文章开头的一个问题:为什么不能加载UWP项目,这是因为我升级了UWP的SDK,而Xamarin还没有支持到这个版本(我也不想用Xamarin来发UWP项目)。还有就是园友问怎么知道哪些是平台特殊的API(Platform-specific API和文件操作),自认为呢,当你调用一个API的时候需要引用Xanmarin.IOS和Mono.Android或者说除了.NET的API都算是Platform-specific API,当然这是我个人的理解。

  当然,还是一样,有错请及时留言,大家互相分享和进步!

  

  不废话,继续正文,在上文中说到,相同的图片在不同的手机上的显示是有分别的,我想,做过APP开发的应该都知道这个问题,对于未接触过的呢,简单说下(其实我这里表达不是很清楚,在博客园中还有其他的相关的文章专门做详细的介绍,但是我把地址忘了,所以只有你们自己去找找了),就是经常听到的屏幕分辨率和像素要映射(或者叫对应)的原因,比如有的手机分辨率是960*640,480*800等等这些,正是由于这些不同分辨率的存在让图片的显示产生了不同,而图片的像素是不变的,一像素就是一像素,但是这一像素要在屏幕上显示,那么就会产生问题了。像素是位图的尺寸单位,手机屏幕(这里就不再把什么分辨率的东西扯得太远了,简单点就叫个手机屏幕)也有一个单位,英文叫device-independent unit简称就是DIU,所以同样的图片在不同的手机上显示不一样就是DIU和像素之间映射不一致所导致的,现在常见的有(主流貌似都是以苹果来介绍的):

  一个单位点(DIU)对应一个像素

  一个单位点(DIU)对应两个像素

  一个单位点(DIU)对应三个像素

其实呢安卓的设备还包含以下三种:

  一个单位点(DIU)对应0.75个像素

  一个单位点(DIU)对应1.5个像素

  一个单位点(DIU)对应4个像素

所以,如果同样的图片在不同的DIU设备上显示就会出现显示的大小不一致的情况,如上安卓则有六种常见DIU,但是你懂的,谁TMD一天没事光弄图,所以呢也只弄1:1、1:2和1:3的三种图的,就是跟苹果图保持一致,那没有相应比例的图片岂不是显示会出问题?!当然不会,手机系统会自动根据当前的DIU去找到三种中合适的图去进行一定比例的缩放。

  现在我们来说说平台图片,在我们Xamrin.Forms项目中的xxx.Driod和xxx.IOS的项目(我的所有Xamarin相关都不会涉及到UWP,UWP我觉得还是用UWP开发吧)中都能看到一个Resources的文件夹,但是查看该文件夹,你就会发现他们并不一样,举个例子,在IOS中有如下名称的图片:

  Icon-Small.png

  Icon-Small@2x.png

  Icon-Small@3x.png

  他们名称几乎一样,不一样的是后面两个都是以@2x或者@3x结束,我想看到这里,大家都能联想到了一些东西了,是的这就是为不同的DIU准备的,你们可以在资源管理系统中右键属性查看详细信息就会知道,他们的像素分别是40*40、80*80和120*120.这里也许你会说那项目中如何加载图片哦,为了显示一张图我需要高三个地址,还有安卓的话岂不是最好要弄6个地址去加载一个图片,我疯了,对吧!淡定,刚刚已经说了图片的名称是有规律的,所以你不要去写很多个地址去加载图片,你只需要写@前面的相同的部分就行了,剩下的系统会自己去根据当前的DIU去找相应名称的图片,比如你当前的1DIU对应3个像素,那么当你加载Icon-Small.png图片的时候会自动去加载Icon-Small@3x.png图片。

  安卓的Resources跟苹果有些不一样,苹果是把所有的图片放在Resources文件夹中的,通过名称来区分的,但是安卓则是通过文件夹来区分的,展开安卓项目中的Resources文件夹,你自会看到,其他也都相同就不再多说。

  现在对平台的Resources和其中包含的图片有了一个简单的了解,现在来调用这里面的图片并显示,这里就需要上一篇文章中所需要的FileImageSource类,示例代码如下:

       Image image = new Image
{
Source = new FileImageSource
{
            //File = "icon.png"
File = Device.OnPlatform(iOS: "Icon-Small-40.png", Android: "icon.png", WinPhone: "Assets/StoreLogo.png")
},
HorizontalOptions = LayoutOptions.Center,
VerticalOptions = LayoutOptions.CenterAndExpand
};

  在调用平台图片的时候,电子书中有句话,原文如下:

Almost always, you’ll be using Device.OnPlatform in code or OnPlatform in XAML to specify the three filenames:

  意思就是调用平台图片的时候总是需要用到OnPlatform,但其实这里如果IOS和Andriod的图片名称相同的话并且不考虑Windows的平台,可以直接如注释的那般写,是没有问题的。

  好了,平台图片和FileImageSource对象的用法,就做个这样的简单分享,过两天和会把Xamarin.Forms中的三种手势做个简单的分享,然后会开始动画!加油!要学的东西好多哦,感觉脑子不够用啊!

  最近在linux上部署asp.net core的demo却总是运行不起,我是直接在本地dotnet publish然后上传的,其实也不是运行不起,而是有个警告,并且我已经打开了80和5000端口了,但是我在外界依然不能访问,这个是在阿里云上的一个测试服务器。我贴个图,知道怎么搞定的大神麻烦指点下。

 

Xamarin.Forms学习之位图(二)的更多相关文章

  1. Xamarin.Forms学习之位图(一)

    在开始我的分享之前呢,让我先问下我的问题: 1.最近更新了Xamarin 4.1.1.3,我想问下版本更新信息在哪里看? 2.更新后我新建的项目没有UWP项目了(虽然没有用过,但是我想确认是4.1.1 ...

  2. Xamarin.Forms学习系列之Android集成极光推送

    一般App都会有消息推送的功能,如果是原生安卓或者IOS集成消息推送很容易,各大推送平台都有相关的Sample,但是关于Xamarin.Forms的消息推送集成的资料非常少,下面就说下Xamarin. ...

  3. Xamarin.Forms学习之Platform-specific API和文件操作

    这篇文章的分享原由是由于上篇关于Properties的保存不了,调用SavePropertiesAsync()方法也不行,所以我希望通过操作文件的方式保存我的需要的数据,然后我看了一下电子书中的第二十 ...

  4. Xamarin.Forms学习之Page Navigation(一)

    在最初接触Xamarin.Forms的时候,我是跟着Xamarin官方的名为“learning-xamarin-ebook”的pdf文档进行学习的,我在成功运行Hello world程序之后,我开始跟 ...

  5. Xamarin.Forms学习之XAML命名空间

    大家好,我又悄咪咪的来了,在上一篇的Xamarin文章中简单介绍了Xamarin的安装过程,妈蛋没想到很多小朋友很感激我,让他们成功的安装了Xamarin,然后......成功的显示了经典的两个单词( ...

  6. Xamarin.Forms学习之初

    微软的Build 2016结束的有段时间了,对于一个简单的小屌丝程序员--我来说,关注最大的无疑是Xamarin的免费(开源什么的让大神们上吧),内心激动啊.大会结束的周末我就迫不及待的安装了,然后. ...

  7. Xamarin.Forms学习系列之Syncfusion 制作图形报表

    Syncfusion是一家微软生态下的第三方组件/控件供应商,除了用于HTML5和JavaScript的控件外,他们产品还涉及如下领域: WEB ASP.NET MVC ASP.NET WebForm ...

  8. Xamarin.Forms 学习系列之优秀UI收集

    1.各种优秀UI例子 https://github.com/jsuarezruiz/xamarin-forms-goodlooking-UI 输入框例子 https://github.com/enis ...

  9. Xamarin.Forms学习系列之SQLite

    在App中我们通常不会实时获取服务器数据,会在用户手机中保存历史数据,这个时候就需要用到数据库SQLite,由于微软的封装,在Xamarin中操作SQLite非常简单,类似EF的操作. 1.我们需要在 ...

随机推荐

  1. 网络编程——The C10K Problem(C10K = connection 10 kilo 问题)。k 表示 kilo,即 1000

    The C10K problem翻译 (C10K = connection 10 kilo 问题).k 表示 kilo,即 1000 比如:kilometer(千米), kilogram(千克). 如 ...

  2. DriverStore文件夹特别大,能删除吗?

    DriverStore文件夹特别大,能删除吗? DriverStore\FileRepository文件夹特别大,能删除吗? C:\Windows\System32\DriverStore\FileR ...

  3. ES标准中的相等比较算法 SameValue SameValueZero

    1.相等比较算法 The Abstract Equality Comparison Algorithm (==) The Strict Equality Comparison Algorithm (= ...

  4. 64位WinRAR5.0破解

    在WinRAR安装文件夹下新建文件rarreg.key,用记事本打开rarreg.key把上面的内容复制到记事本再把rarreg.key里保存即可,文件内容如下: RAR registration d ...

  5. 设计模式之简单工厂模式(C#语言描述)

    严格意义上来说,简单工厂模式并不属于GoF的23种设计模式,但是它是学习其他工厂模式的基础和前提条件.理解了简单工厂模式,学习工厂方法模式和抽象工厂模式会比较容易一些. 简单工厂模式的定义 定义一个工 ...

  6. js 从数组中随机获取一个值

    // 获取随机数 var rand = Math.floor( Math.random() * this.peoples.length ); // 随机从数组中取出某值(不会改变原数组) var da ...

  7. Flex Air应用程序更改任务栏图标

    Air应用程序中相关图标更改的方法: 1.安装后的应用程序图标和运行时的任务栏图标 这两个是一起的,通过更改配置文件application.xml中的icon节点,分别针对不同大小进行设置,未设置的会 ...

  8. C# 泛型 default()方法

    在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T: T 是引用类型还是值类型. 如果 T 为值类型,则它是数值还是结构. 给定参数化类型 T 的一个变量 t ...

  9. Havel--Hakimi定理推断可图化 python

    介绍: 哈维尔[1955]--哈吉米[1962]算法能够用来判读一个度序列d是否是可图化的. 哈维尔[1955]--哈吉米[1962]定理: 对于N > 1,长度为N的度序列d可以可图化当且仅当 ...

  10. FreeBSD安装MySQL5.7.17

    [root@tuhooo /usr/ports/databases/mysql57-server]# make install===>  Installing for mysql57-serve ...