为 Xamarin.Forms 做个跑马灯控件

原文:为 Xamarin.Forms 做个跑马灯控件

前段时间,私下用 Xamarin.Forms 做了个商业项目的演示版。很多被国内App玩坏了的控件/效果,XF上都没有或是找不到对应的实现,没有办法只能亲自上阵写了几个,效果还行,就是有BUG。

这个跑马灯就是其中的一个,当初赶工,随便写个效果交了差,最终他们把这一块从APP中拿掉了,早知道我就不耗这个时间了。。。

一般App 为了省版面空间,都只会留小小的一块放跑马灯,多条文字轮翻显示,而且还只有一行文本,超出的部份隐藏;如果你看见哪个APP搞个很大的一块去跑马,那说明这个App的设计师是个逗逼,产品经理也是。

考虑到手机屏幕尺寸,从左到右移动文字这种灯,完全不合时宜,左晃右晃的更不用说了。

交付的版本中,我做成了缩放式的动画效果,结果很不理想,很有可能是这个原因,对方最终把这一块给拿掉了。

这两天改了一下,只有从下往上滚动的动画,这样可以使整体协调,简洁不失美观。

先看一下效果:

源码:
https://github.com/gruan01/XFThemesTest/blob/master/App1/App1/Marquee.cs

https://github.com/gruan01/XFThemesTest/blob/master/App1/App1/MainPage.xaml

 

1,控件类型选择

这个功能只是把文本在界面上移来移去,完全用不着动用原生的Android/IOS 控件,所以没有 复杂的Renderer

每条文本都是一个子控件,所以必须是从 ContentView 或 Layout 派生,ContentView 只能有一个直接子控件,所以不合要求。

每个子控件都可以在父容器的显示范围内自由的移动,所以,只能选择从 AbsoluteLayout 派生。

关于 AbsoluteLayout 可以参考:
https://developer.xamarin.com/guides/xamarin-forms/user-interface/layouts/absolute-layout/

需要注意的是 AbsoluteLayoutFlags.XXXProportional ,即将 XXX 按比例设置。
比如:

1 <BoxView Color="Red" AbsoluteLayout.LayoutBounds="0.5,0.5,10,10"
2 AbsoluteLayout.LayoutFlags="PositionProportional" />

的意思就是在 AbsoluteLayout 的中心点上放一个长10宽10的BoxView

 

2, 动画

XF 为控件提供了一套基本的动画接口,包括透明度渐变(Fade),位置移动(Layout),旋转(Rotate), 扭曲(Translate)

具体参考:
https://developer.xamarin.com/api/type/Xamarin.Forms.ViewExtensions/

需要注意的是,同 WinForm 或 WPF 一样,不能直接在多线程中直接操作控件,如果非得使用多线程,请使用如下方式:

1 await Task.Delay(this.Interval)
2 .ContinueWith(t => this.Run(), TaskScheduler.FromCurrentSynchronizationContext());

另外注意一点, LayoutTo 不能结合 AbsoluteLayout.LayoutBounds 一起使用。

 

3,数据源与DataTemplate

当数据源变化,或数据源内部发生变化(增删改)时,都会对子控件进行重组。通过对子控件重组事件的监听,可以对子控件进行初始化或进行修改;修改简单,不讨论,但是初学者一般会有这样的迷惑:怎么把数据源中的数据转换成子控件??

其实很简单:
一般带数据源的控件,都会指定 ItemTemplate (DataTemplate),通过 DataTemplate.CreateContent 方法可以生成 ItemTemplate 指定的内容,然后把生成的内容的 BindingContext 指定为数据源中的数据就可以了。

 1 private View GetChildView(object data) {
 2     View view = null;
 3     if (this.ItemTemplate != null) {
 4         if (this.ItemTemplate != null)
 5             view = (View)this.ItemTemplate.CreateContent();
 6
 7         if (view != null) {
 8             view.BindingContext = data;
 9         }
10     }
11
12     if (view == null) {
13         view = new Label() { Text = data?.GetType().FullName };
14     }
15     return view;
16 }

 

 

总体代码比较简单,不在赘述。

 

---------------------

Xamarin.Forms Themes 目前还是 Preview 阶段,请勿参考使用源码中的用法。

时间: 2025-01-21 12:25:07

为 Xamarin.Forms 做个跑马灯控件的相关文章

java-android 文本编辑器,应该怎么做,用什么控件了?

问题描述 android 文本编辑器,应该怎么做,用什么控件了? edittext控件貌似不可以啊,,,,,,.,谢谢,谢谢,谢谢,谢谢谢谢 解决方案 任何平台上的富文本编辑器都是大坑,你需要重写EditText 解决方案二: 可以的,是不是你设置了屏蔽其获取焦点 解决方案三: EditText 光标在中间解决方法: 设置EditText的gravity属性(即它的子View的输出位置)为top即可,如果你的EditText有内容,则通过调用它的setSelectionStart和setSele

工具箱里面那个树形的展开是怎么做的 就是 公共控件 ,一点击属于这个大项的子项控件就显示出来了

问题描述 工具箱里面那个树形的展开是怎么做的就是公共控件,一点击属于这个大项的子项控件就显示出来了谢谢阿打扰了 解决方案 解决方案二:你可以做一个自定义空里面放一个BUTTON放一个Panel设置他们的DOCK来决定点Button的时候设置Panel为不显示和显示就可以了

winfrom如何做一个语法着色控件

本文转载:http://www.cnblogs.com/hexin0614/archive/2012/01/17/2324224.html   本人觉得把KeyWords属性改成如下更好:   private string[] _KeyWords = new string[]        {             "SELECT", "UPDATE", "DELETE", "INSERT", "DROP"

Xamarin.Forms支持UWP介绍用Xamarin.Forms构建UWP应用程序

最新版本的Xamarin.Forms 正式开启了对 UWP 的支持. 要创建 UWP 项目, 必须是 VS2015, WIN8.1 下也可以, 但是只有 Windows 10 Mobile 的模拟器可用, Windows 10 的模拟器, 必须在 WIN 10 下. 以下简称 Xamarin.Forms 为 XF, Caliburn.Micro 为 CM 创建 XF支持的 UWP 项目 XF的项目模板, 当前没有加入 UWP , 需要手动创建 UWP 项目. 过程如下: 1, 添加一个 UWP

从在 Internet Explorer 中使用 Windows 窗体控件开始谈Smart Client

client|window|控件 首先引用Microsoft Windows 窗体快速入门教程上的文章"在 Internet Explorer 中使用 Windows 窗体控件":(如果引用的一些信息无法正常显示,请直接上面上的链接查看) 本主题描述如何在 Internet Explorer (IE) 内成功地执行 Windows 窗体控件.IE 内的 Windows 窗体控件无需用户提示即可激活,它不要求注册,而且利用公共语言运行库 (CLR) 代码访问安全性. 在 Internet

ASP.net控件开发系列之七

ComponentEditor "第二选择" 上篇中,关于Editor说了那么多,完了吗?没有,上篇仅仅介绍了操作属性的UITypeEditor而已.还记得DataGrid的属性窗口的下方的"属性生成器..."吗? 开发系列之七-"> 当我们点击"属生生成器..."后,IDE弹出一个窗体,提供我们全方位的操作DataGrid属性的交互界面,这个界面比PropertyGrid提供更方便易用的,更符合DataGrid"国情&

工具箱窗口 里怎样才能使用自定义 泛型控件 呢 c#语言

问题描述 自己做了个泛型控件结果工具箱窗口里不能出来自然也就拖不到窗体里了只有手写代码使用泛型控件了怎样才能让工具箱窗口支持自定义的泛型控件呢c#语言 解决方案 解决方案二:up解决方案三:泛型控件?第一次听说,泛型类只有确定具体的泛型参数才有意义,把你的代码贴出来解决方案四:publicinterfaceIOrderBy<T>{///<summary>///每项菜单的ID///</summary>stringID{get;set;}}解决方案五:publicinter

一起谈.NET技术,VS 2010 和 .NET 4.0 系列之《内置图表控件》篇

本系列文章导航 VS 2010 和 .NET 4.0 系列之<ASP.NET 4 中的SEO改进 >篇 VS 2010 和 .NET 4.0 系列之<干净的Web.Config文件 >篇 VS 2010 和 .NET 4.0 系列之<起始项目模板>篇 VS 2010 和 .NET 4.0 系列之<多定向支持>篇 VS 2010 和 .NET 4.0 系列之<多显示器支持>篇 VS 2010 和 .NET 4.0 系列之<代码优化的Web开发

【思路】表单控件和查询控件,整理一下思路。

       这回不分页了,改成添加修改数据了.您是如何添加数据的呢?使用ORM.LinQ..net2.0新增加的FormView + SqlDataSource,还是其他?我还是喜欢自己动手丰衣足食.自己做一个表单控件来玩玩.        以前也写了几个关于表单控件的 post : 1.表单控件续(1)--应用接口来简化和分散代码 2.能自己"跑"的表单控件,思路,雏形,源码.vs2005版本          我简单的看了一下FormView + SqlDataSource的方式