Xamarin.Forms学习之位图(一)
在开始我的分享之前呢,让我先问下我的问题:
1、最近更新了Xamarin 4.1.1.3,我想问下版本更新信息在哪里看?
2、更新后我新建的项目没有UWP项目了(虽然没有用过,但是我想确认是4.1.1.3移除了还是我自身的问题),其实我觉得移除了也好,UWP就用UWP写最好了!
3、我的模拟器无法使用,是我安装的问题还是说有其他的设置?
再吐个槽:
1、Xamarin.Froms早已经更新到了2.3了,但是vs的模板一直没更新(还是说可以其他设置更新?还是说2.3不稳定?),导致新建的项目的Froms版本依然是2.0的。
2、F7和F12功能不好用。
3、还是没有预览这个老生常谈的问题。
我记得我还有几个的,咋想不起了。。。好吧,算了,不想了。
还是那句话,有错请留言指正,谢谢!
继续正文,显示图片用的是Image这个倒是没什么说的,设置图片源的是通过Image的ImageSource类型的Source属性来设置的,ImageSource类定义了四个静态方法,一边使用:
1、ImageSource.FromUri 用于访问web的位图
2、ImageSource.FromResource 访问PCL中嵌入的资源的位图
3、ImageSource.FromFile 访问平台中的位图
4、ImageSource.FromStream 通过Stream流加载位图
要提醒的是“嵌入的资源”,如果你把图片放入PCL中,并且想要访问它,必须把图片的生成操作改成“嵌入的资源”,如下:

ImageSource除了有四个静态方法之外还有三个派生类:UriImageSource,FileImageSource,StreamImageSource。通过名字你可以跟上面的ImageSource的静态方法找到对应,其中UriImageSource你就可以在XAML中直接设置Image的源了,而不必在Code-Bhind中去书写:
<Image>
<Image.Source>
<UriImageSource Uri="http://hpimges.blob.core.chinacloudapi.cn/coverstory/watermark_zanzibarredcolobus_zh-cn11792109900_1920x1080.jpg" />
</Image.Source>
</Image>
但是你会发现派生类有三个,静态方法有四个,没有ImageSource.FromResource的对应的派生类,岂不是说我们就不能在XAML中直接访问PCL的嵌入资源了?答案当然是NO,需要我们自己写一个。
在项目中新建一个ImageResourceExtension的类,这个类需要继承IMarkupExtension接口(多的不说,自己F12去查看),

代码如下:
namespace App1.Extension
{
[ContentProperty("Source")]
public class ImageResourceExtension : IMarkupExtension
{
public string Source { get; set; }
public object ProvideValue(IServiceProvider serviceProvider)
{
if (null == Source)
return null;
return ImageSource.FromResource(Source);
}
} //这个是我测试下IMarkupExtension的简单用法弄得一个
[ContentProperty("TextColor")]
public class LabelTextColorExtension : IMarkupExtension
{
public object ProvideValue(IServiceProvider serviceProvider)
{
return Color.Blue;
}
}
}
然后我们就可以咋XAML直接设置PCL的嵌入的资源给Image了
<Image Source="{img:ImageResource App1.Images.logo_small.gif}" />
别忘了命名空间的引用:
xmlns:img="clr-namespace:App1.Extension"
对于嵌入的资源的访问,唯一要说的就是其路径,必须从程序集写起,还有这个ImageResourceExtension类不能提到公共的当中,因为这是通过反射来获取,如果你把图片放到当前的PCL中,但是方法在公共的里面,那么你懂的反射的路径是不对的,也就获取不到图片,但是也就是说如果图片是公共的,放在公共的项目中,也就能能正常访问了?卧槽,明天试试!
继续Iamge的内容,访问web的资源位图,通过ImageSource的Uri相关的扩展或者使用ImageSource.FromStream都行,但是建议使用UriImageSource派生类,因为他可以把图片缓存在程序的私有领域中,我们可以通过bool型的CachingEnabled和TimeSpan类型的CachingValidity来设置图片的是否缓存和缓存时间。如果使用其他的则需要自己写缓存的逻辑代码。
位图在Image中的填充则是通过枚举的Aspect属性来设置的,图片填充这个应该没有太多的说到的,我就简单说下:
1、AspectFit — 默认的,这个就是保持图片的比例填充Image。
2、Fill — 这个看意思也知道就是不考虑比例,填充整个Image。
3、AspectFill — 这个就是保持图片的原始大小,但是只显示Image能显示的地方,简单说就是如果图片太大,就剪切Image那么大的一块就行显示。也就是说这个属性对太大的图片有影响。
关于位图的显示大小的问题,电子书中写的妈的“拗口”的很,看了半天最后直接实践,一个一个属性的去调,才发现so easy,也难为别个写书的了,当然也许是英文,语言沟通的原因。最终其实就是图片在屏幕也就是用户界面上的呈现是受Aspect属性、Iamge元素的大小和位图的大小的影响的。其限制影响大小如下:
Image的大小>位图的大小>Aspect
虽然这三个的关系这么写牛头不对马嘴,但是大意是这个。在简单说就是自己去试,就是如下图所示的标红线的三类属性的变换,要注意的就是VerticalOptions和HorizontalOptions属性:

到这里你以为就完了,错了!毕竟是跨平台的要想在多个平台上呈现的效果一致,那么你需要:
Although the pictures don’t look bad on any of the platforms, getting them all about the same size would require starting out with larger bitmaps.
也许这里就一句话,没有前言后语的,不太容易理解,其实就是由于设备的原因Nokia的跟IOS和Android的像素的映射不一样的原因的,如果让他们“自由”的显示,有较大的差异(),所以解决之法就是找个大一点的图片然后设置他的宽和高(我不知道这个对不对啊,反正回了两边,也就只能理解到这儿了!)。
从Stream中读取图片,则需要ImageSource.FromStream或者StreamImageSource,虽然他们都是从刘总获取图片,但是并没有什么需要特别说的。就直接上代码了:
string resourceID = "App1.Images.logo_small.gif";
image1.Source = ImageSource.FromStream(() => { Assembly assembly = GetType().GetTypeInfo().Assembly; Stream stream = assembly.GetManifestResourceStream(resourceID); return stream; });
就到这里了!
Xamarin.Forms学习之位图(一)的更多相关文章
- Xamarin.Forms学习之位图(二)
上篇文章分享了如何加载网络图片和PCL中的图片,所以今天继续分享关于如何加载平台的内嵌图片,在这之前说一下上篇文章开头的一个问题:为什么不能加载UWP项目,这是因为我升级了UWP的SDK,而Xamar ...
- Xamarin.Forms学习之Platform-specific API和文件操作
这篇文章的分享原由是由于上篇关于Properties的保存不了,调用SavePropertiesAsync()方法也不行,所以我希望通过操作文件的方式保存我的需要的数据,然后我看了一下电子书中的第二十 ...
- Xamarin.Forms学习之Page Navigation(一)
在最初接触Xamarin.Forms的时候,我是跟着Xamarin官方的名为“learning-xamarin-ebook”的pdf文档进行学习的,我在成功运行Hello world程序之后,我开始跟 ...
- Xamarin.Forms学习之XAML命名空间
大家好,我又悄咪咪的来了,在上一篇的Xamarin文章中简单介绍了Xamarin的安装过程,妈蛋没想到很多小朋友很感激我,让他们成功的安装了Xamarin,然后......成功的显示了经典的两个单词( ...
- Xamarin.Forms学习之初
微软的Build 2016结束的有段时间了,对于一个简单的小屌丝程序员--我来说,关注最大的无疑是Xamarin的免费(开源什么的让大神们上吧),内心激动啊.大会结束的周末我就迫不及待的安装了,然后. ...
- Xamarin.Forms学习系列之Android集成极光推送
一般App都会有消息推送的功能,如果是原生安卓或者IOS集成消息推送很容易,各大推送平台都有相关的Sample,但是关于Xamarin.Forms的消息推送集成的资料非常少,下面就说下Xamarin. ...
- Xamarin.Forms 学习系列之优秀UI收集
1.各种优秀UI例子 https://github.com/jsuarezruiz/xamarin-forms-goodlooking-UI 输入框例子 https://github.com/enis ...
- Xamarin.Forms学习系列之Syncfusion 制作图形报表
Syncfusion是一家微软生态下的第三方组件/控件供应商,除了用于HTML5和JavaScript的控件外,他们产品还涉及如下领域: WEB ASP.NET MVC ASP.NET WebForm ...
- Xamarin.Forms学习系列之SQLite
在App中我们通常不会实时获取服务器数据,会在用户手机中保存历史数据,这个时候就需要用到数据库SQLite,由于微软的封装,在Xamarin中操作SQLite非常简单,类似EF的操作. 1.我们需要在 ...
随机推荐
- ODOO翻译导出窗口修正
当你辛苦修正odoo的翻译,想把它导出到其它系统的时候, 你会发现导出向导窗口无法显示下拉列表. 下面的方法修正此问题: 1.打开"开发者模式". 2.去到翻译导出向导:设置 - ...
- js canvas画柱状图 没什么高端的 就是一篇偶尔思路的
公司项目要用js画柱状图,本来想用个插件吧 chart.js 忽然一想 我们也用不了那么大的插件.自己写个吧,也能看看自己那点数学水平能够不! 有几个小亮点吧 1.函数x 和 函数y 对坐标进行了转化 ...
- <转> lua: userdata的metatable使用
1 如何封装c++的指针 对于c++对象的lua包装,我们可以使用 template<typename T> struct luaUserdataWrapper { luaUserdat ...
- radiusd cisco限速问题
http://puck.nether.net/pipermail/cisco-bba/2011-February/001349.html
- springboot学习(七) 使用JdbcTemplate
1.对内嵌数据库的支持 内嵌数据库通常用于开发和测试环境,不推荐用于生产环境.Spring Boot提供自动配置的嵌入式数据库有H2.HSQL.Derby,你不需要提供任何连接配置就能使用. 例子: ...
- css - 紧贴底部的页脚
有的时候,由于页面长度不够,页面底部的页脚会很尴尬的跑上来,如图: 有的同学可能会想用position:fixed;bottom:0;来永远居底.但有些场景确实不适合. 这是我从YII2中找到的简单解 ...
- 344. Reverse String【easy】
344. Reverse String[easy] Write a function that takes a string as input and returns the string rever ...
- nginx正则说明
nginx正则说明 分类: nginx -- : 11758人阅读 评论() 收藏 举报 nginx正则表达式firefox ^~ 标识符后面跟一个字符串.Nginx将在这个字符串匹配后停止进行正则表 ...
- UseParNewGC和UseParallelGC的区别
1.UseParNewGC:并发串行收集器,它是工作在新生代的垃圾收集器,它只是将串行收集器多线程化,除了这个并没有太多创新之处,而且它们共用了相当多的代码.它与串行收集器一样,也是独占式收集器,在收 ...
- JVM物理结构和在内存中的组织结构
对于JVM自身的物理结构,我们可以从下图鸟瞰一下: JVM内存组成结构 JVM栈由堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)堆 所有通过new创建的对象的内存都在堆中分配,其大小可以 ...