为 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 按比例设置。
比如:
<BoxView Color="Red" AbsoluteLayout.LayoutBounds="0.5,0.5,10,10" AbsoluteLayout.LayoutFlags="PositionProportional" />
的意思就是在 AbsoluteLayout 的中心点上放一个长10宽10的BoxView
2, 动画
XF 为控件提供了一套基本的动画接口,包括透明度渐变(Fade),位置移动(Layout),旋转(Rotate), 扭曲(Translate)
具体参考:
https://developer.xamarin.com/api/type/Xamarin.Forms.ViewExtensions/
需要注意的是,同 WinForm 或 WPF 一样,不能直接在多线程中直接操作控件,如果非得使用多线程,请使用如下方式:
await Task.Delay(this.Interval) .ContinueWith(t => this.Run(), TaskScheduler.FromCurrentSynchronizationContext());
另外注意一点, LayoutTo 不能结合 AbsoluteLayout.LayoutBounds 一起使用。
3,数据源与DataTemplate
当数据源变化,或数据源内部发生变化(增删改)时,都会对子控件进行重组。通过对子控件重组事件的监听,可以对子控件进行初始化或进行修改;修改简单,不讨论,但是初学者一般会有这样的迷惑:怎么把数据源中的数据转换成子控件??
其实很简单:
一般带数据源的控件,都会指定 ItemTemplate (DataTemplate),通过 DataTemplate.CreateContent 方法可以生成 ItemTemplate 指定的内容,然后把生成的内容的 BindingContext 指定为数据源中的数据就可以了。
private View GetChildView(object data) {
View view = null;
if (this.ItemTemplate != null) {
if (this.ItemTemplate != null)
view = (View)this.ItemTemplate.CreateContent();
if (view != null) {
view.BindingContext = data;
}
}
if (view == null) {
view = new Label() { Text = data?.GetType().FullName };
}
return view;
}
总体代码比较简单,不在赘述。
---------------------
Xamarin.Forms Themes 目前还是 Preview 阶段,请勿参考使用源码中的用法。
为 Xamarin.Forms 做个跑马灯控件的更多相关文章
- Android文字跑马灯控件(文本自动滚动控件)
最近在开发一个应用,需要用到文本的跑马灯效果,图省事,在网上找,但老半天都找不到,后来自己写了一个,很简单,代码如下: import android.content.Context; import a ...
- Flex “跑马灯”效果(自定义“跑马灯”控件)
自定义类(BroadCastMarquee.as): package marquee { import flash.events.MouseEvent; import flash.events.Tim ...
- Xamarin XAML语言教程构建ControlTemplate控件模板 (四)
Xamarin XAML语言教程构建ControlTemplate控件模板 (四) 2.在页面级别中构建控件模板 如果开发者要在页面级别中构建控件模板,首先必须将ResourceDictionary添 ...
- Xamarin XAML语言教程构建ControlTemplate控件模板 (三)
Xamarin XAML语言教程构建ControlTemplate控件模板 (三) (3)打开MainPage.xaml.cs文件,编写代码,实现主题的切换功能.代码如下: using System; ...
- Xamarin XAML语言教程构建ControlTemplate控件模板 (二)
Xamarin XAML语言教程构建ControlTemplate控件模板 (二) (2)打开MainPage.xaml文件,编写代码,将构建的控件模板应用于ContentView中.代码如下: &l ...
- Xamarin XAML语言教程构建ControlTemplate控件模板
Xamarin XAML语言教程构建ControlTemplate控件模板 控件模板ControlTemplate ControlTemplate是从Xamarin.Forms 2.1.0开始被引入的 ...
- 给控件做数字签名之一:将控件打包为Web发布包 [转]
微软代码签名证书使用指南 http://www.wotrust.com/support/signcode_guide.htm 签名重要性:http://www.wotrust.com/FAQ/whyS ...
- C#-Xamarin的Android项目开发(二)——控件应用
相信我,这不是一篇吐槽文章.... 基础控件 Android的控件和控件样式非常特别,它是一种内联特别高的设计模式,换句话说,它是非常烂的设计.... 但在这种特别的关系里还是有一定的规律的,下面我们 ...
- 移动UI控件Telerik UI for Xamarin发布R2 2019|引入Map控件
Telerik UI for Xamarin是一个构建跨平台移动应用程序的原生UI.Telerik UI for Xamarin使用Xamarin.Forms技术,它可以让开发人员从一个单一的共享C# ...
随机推荐
- Fiddler基本原理与抓取Andriod与IOS的App数据包
Fiddler基本原理 Fiddler数据包的原理是Fiddler将自己设置为一个代理服务器,默认监听127.0.0.1:8888端口同时将浏览器的HTTP.HTTPS协议设置为使用代理服务器也就是使 ...
- 像编程一样写文章—Markdown
Markdown是什么 是一种极其简单的标记语言,写的时候只需要普通编辑器即可: 它可以使文本内存具有某种格式: Markdown设计理念使文本易读.易写 文件后缀名:.md . .markdown. ...
- iNeedle系统使用注意事项
1.不能监控https协议的报文 目前只能监控http协议的网站,对于https协议(加密)的网站暂时不支持监控,甚至连流量都没有作统计,在测试iNeedle的时候也要多加注意.
- C++杂谈(三)产生随机数与time函数
产生随机数在程序中很有用,这篇文章简单介绍一下产生随机数的方法. 伪随机数 使用标准库<cstdlib>中的rand()函数产生随机数. #include<iostream> ...
- Linux环境下使用gcc编译,gdb反汇编C语言程序
使用虚拟机 VMware Workstation 10 Linux环境:Ubuntu 14.04 LTS Server amd64 我把过程截图如下. 首先是hello world程序: 备注: ...
- Linux 下从头再走 GTK+-3.0 (二)
仅仅创建一个空白窗口是不够的,下面我们为创建的窗口添加一个按钮. 以 Hello,World!为例. 首先创建一个源文件:example2.c 内容如下. #include <gtk/gtk.h ...
- 创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件
Bootstrap是当下流行的前端UI组件库之一.利用Bootstrap,可以很方便的构造美观.统一的页面.把设计师从具体的UI编码中解放出来. Bootstrap提供了不少的前端UI组件.带下拉 ...
- Stanford机器学习笔记-9. 聚类(Clustering)
9. Clustering Content 9. Clustering 9.1 Supervised Learning and Unsupervised Learning 9.2 K-means al ...
- Unity的DrawCall
图形引擎渲染画面的过程 Unity(或者说基本所有图形引擎)生成一帧画面的处理过程大致可以这样简化描述: 1. 可见性测试 1. 引擎首先经过简单的可见性测试,确定摄像机可以看到的物体 2. 准备好物 ...
- jsonobject 遍历 org.json.JSONObject
import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; public static ...