C#使用Xamarin开发可移植移动应用进阶篇(6.使用渲染器针对单个平台自定义控件..很很很很重要..),附源码

前言

源码地址:https://github.com/l2999019/DemoApp

可以Star一下,随意 - -

说点什么..

本篇..基本可以算是Xamarin在应用开发过程中的核心了..真的很很很重要..

想学习的..想用的..建议仔细阅读..嗯..打酱油的 ..快速滑倒下面点个推荐 - - 哈哈哈...

今天的学习内容?

只讲一个,关于Xamarin.Forms针对各个平台如何进行可定制化的控件操作.

也就是针对某个平台的细颗粒化操作.

废话不多说,我们直接开始.

正文

1.什么是渲染器

自定义渲染器提供了一种强大的方法来定制Xamarin.Forms控件的外观和行为。它们可用于一些微小的样式更改或复杂的平台特定布局和行为定制。

2.为什么需要自定义渲染器

因为在不使用自定义渲染器的情况下更改Xamarin.Forms控件的外观是颗粒度较粗的.

因为Xamarin.Forms为了支持多个平台同时可用,所以对一些特定平台的增强功能和自定义功能进行了删减。所以当我们需要使用这些功能时,就必须实现自定义渲染器。

3.如何使用自定义渲染器

下面我们首先来通过一个例子来讲解如何使用渲染器.

我们找到一个Xamarin控件,比如ProgressBar进度条..它在Xamarin中,可控的属性应该就只有Progress进度而已..

我们编写代码如下:

<ProgressBar Progress=".5" BackgroundColor="Blue"   />

得到如下效果:

这里,我们特意给它加了一个蓝色的背景..来展示整个控件的大小..

我们会发现,进度条只是他里面很小的一部分,大部分被背景占用,而且无法在Xamarin.Forms中去修改,我们无法改变它的高度.

那么,我们如何修改它呢?..这时候就要用自定义渲染器了,到特点的平台去优化它

首先我们在可移植的库中自定义一个ProgressBar,方便Xamarin.Forms调用,代码如下:

 public class MyProgressBar: ProgressBar
{
}

就这样,就足够了,我们只需要继承一下原来的ProgressBar即可..

然后我们到安卓的平台下,添加自定义的渲染器.,记得,是安卓的平台,在这个类库下:

添加渲染器,代码如下:

//表示使用 Xamarin.Forms在使用MyProgressBar的时候,用MyProgressBarRenderer渲染替换
[assembly: ExportRenderer(typeof(MyProgressBar), typeof(MyProgressBarRenderer))]
namespace DemoApp.Droid
{
    public class MyProgressBarRenderer:ProgressBarRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.ProgressBar> e)
        {
            base.OnElementChanged(e);

            Control.ScaleY = 10; //改变Y轴大小
           
            Control.SetPadding(-0, -12, 0, -12);


        }
    }
}

上面的代码有2个关键的地方,一个是需要在命名空间上申明,你需要代替渲染的控件.

第二个是,你需要继承相关的渲染基类,比如我们这里用的ProgressBarRenderer

我们可以看看这里基类里面继承了一些什么,如下:

我们可以看到,在安卓库中,它就继承了安卓widget的原生进度条,那么,原生进度条的所有属性,我们就都是可以用的了.

比如我们在代码中写的 "ScaleY" 这种属性和SetPadding这种方法.,所以前面我一直强调的,有些东西 你找了安卓(IOS)的解决方案,就同样找到了Xamarin的

我这里虽然没有IOS的环境,但是我们也可以到IOS里面看看ProgressBarRenderer继承了什么,如下:

熟悉IOS开发的同学应该很清楚了..Uikit..就是IOS的用户界面

在上面的代码中,我们针对安卓平台,修改了他的Y轴高度和内边距的值,我们如何使用呢?如下:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:loact="clr-namespace:DemoApp.MyRenderer"
             x:Class="DemoApp.ViewsDomePage">
    <ContentPage.Content>
<loact:MyProgressBar Progress=".6" BackgroundColor="Red"  />
                <ProgressBar Progress=".5" BackgroundColor="Blue" MinimumHeightRequest="-20" HeightRequest="-1"  />
    </ContentPage.Content>
</ContentPage>

我们在ContentPage 中,先引入我们自定的命名空间,调用名改为loact.

然后就直接loact:MyProgressBar,就可以了和原来几乎没区别.

然后我们看看运行效果,如下:

我们可以看到,虽然我们也给了红色的背景,但是它只显示在进度条中了,不会让控件很高, SetPadding起了作用.

当然,我们能操作的远远不止这些..

下面直接给上一个我搭好的基础框架的效果吧...嗯 还使用了一下百度地图的原生SDK.

写在最后

嗯..也没啥好说的了. 后面慢慢加深.

.最后,谢谢各位的支持,喜欢请点个推荐

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IMWeb前端团队

移动端重构实战系列4——进入离开动画

本文作者:IMWeb 结一 原文出处:IMWeb社区 未经同意,禁止转载 ”本系列教程为实战教程,是本人移动端重构经验及思想的一次总结,也是对sand...

18810
来自专栏李蔚蓬的专栏

Android实战_note1(MyMirror_一款小型摄像处理的App)

1.1 Activity.java全文: 注意代码中的注释,其中 handler.sendEmptyMessageDelayed(1,3000);...

732
来自专栏IMWeb前端团队

:before,:after伪元素妙用

本文作者:IMWeb 黎清龙 原文出处:IMWeb社区 未经同意,禁止转载 这两个伪元素分别表示元素内容的【前】【后】,利用这两个伪元素可以在元素内容...

20610
来自专栏黑白安全

javascript实现background 定时循环随机背景图

这里用的固定地址,用的新浪图床,喜欢的话可以自己扩充图片,我这里简短的展示了10个图片!

1183
来自专栏前端小叙

手机端网页使用html5地理定位获取位置失败的解决办法

网上有很多关于html5 geolocation 获取地理定位的方法,我试了下,只有在IE edge浏览器可以成功获取到,在chrome,firefox,手机端...

3116
来自专栏郭霖

Android弹幕功能实现,模仿斗鱼直播的弹幕效果

大家好,感觉好像已经很久没更新博客了。前段时间主要是忙于新书的事情,时间比较紧张。而现在新书已经完稿,剩下的事情就都是出版社的工作了,那么我又可以抽出时间来写写...

5187
来自专栏九彩拼盘的叨叨叨

jQuery 最佳实践(译)

原文 http://shichuan.github.io/javascript-patterns/#jquery-patterns

583
来自专栏Hongten

android开发-TextView控件学习

public class MainActivity extends Activity{

932
来自专栏小巫技术博客

Android技巧一:启动屏+功能引导页

832
来自专栏CoXie带你学编程

初学Python:写码时应该缩进使用 tab 还是空格?

在不同的编辑器里tab的长度可能不一致,所以在一个编辑器里用tab设置缩进后,在其它编辑器里看可能缩进就乱了。空格不会出现这个问题,因为空格就占一个字符的位置。

981

扫码关注云+社区