UWP中实现大爆炸效果(一)
自从老罗搞出大爆炸之后,各家安卓都内置了类似功能。UWP怎么能落下呢,在这里我们就一起撸一个简单的大爆炸实现。
闲话不说,先上效果:

因为代码太多,所以我打算写成一个系列,下面是第一篇的正文:
首先,我们构思一下BigbangView需要哪些部分:
1、一个能多选的控件;
2、一个能给Item布局的面板;
3、选中之后出现的Header和Footer。
这里我们先来实现第二项,BigbangPanel。
BigbangPanel继承自Panel,重载MeasureOverride和ArrangeOverride方法。
MeasureOverride实现调用此方法以形成递归布局更新;
ArrangeOverride为其子元素实现自定义布局的父对象应从其布局重写实现调用此方法以形成递归布局更新。
我们对面板子元素布局的思路是,遍历子元素,从左到右依次排列,若当前行子元素总宽度超过Panel宽度,则换一行从头继续排列。
(在此我们只实现一个简单版,不考虑子元素的VerticalAlignment)
protected override Size MeasureOverride(Size availableSize)
{
foreach (var child in Children)
{
child.Measure(availableSize);
} double width = 0d, height = 0d;
double col_width = 0d, row_height = 0d;
int end_row_count = -1; for (int i = 0; i < Children.Count; i++)
{
if (Children[i].DesiredSize.Width + col_width > availableSize.Width)
{
end_row_count = i;
height += row_height;
width = Math.Max(width, col_width);
col_width = 0;
row_height = 0;
}
col_width += Children[i].DesiredSize.Width;
row_height = Math.Max(row_height, Children[i].DesiredSize.Height);
} //计算最后一行
if (end_row_count != -1)
{
col_width = 0;
row_height = 0;
for (int i = end_row_count; i < Children.Count; i++)
{
row_height = Math.Max(row_height, Children[i].DesiredSize.Height);
col_width += Children[i].DesiredSize.Width;
}
height += row_height;
width = Math.Max(width, col_width);
} return new Size(width, height);
}
protected override Size ArrangeOverride(Size finalSize)
{
double x = 0d, y = 0d;
double items_height = 0d;
int end_count = -1;
int row_start_index = 0; for (int i = 0; i < Children.Count; i++)
{
if (Children[i].DesiredSize.Width + x > finalSize.Width)
{
x = 0;
y += items_height; items_height = 0;
end_count = i;
row_start_index = i;
}
Children[i].Arrange(new Rect(x, y, Children[i].DesiredSize.Width, Children[i].DesiredSize.Height));
x += Children[i].DesiredSize.Width;
items_height = Math.Max(items_height, Children[i].DesiredSize.Height);
}
return finalSize;
}
现在可以测试一下,新建一个页面,添加一个ListView,修改ListView的ItemsPanel
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<control:BigbangPanel >
<control:BigbangPanel.ChildrenTransitions>
<TransitionCollection>
<AddDeleteThemeTransition />
</TransitionCollection>
</control:BigbangPanel.ChildrenTransitions>
</control:BigbangPanel>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
后台代码:
public sealed partial class BigbangPage : Page
{
public BigbangPage()
{
this.InitializeComponent();
for(int i = 0; i < 50; i++)
{
list.Add(rnd.Next(100000).ToString());
}
} public static Random rnd = new Random();
ObservableCollection<string> list { get; set; } = new ObservableCollection<string>();
}
然后设置ListView的ItemSource="{x:Bind list}",然后我懒得新建个项目截图了,大佬们自行测试一下吧。
下集预告:实现可以选中的BigbangView
UWP中实现大爆炸效果(一)的更多相关文章
- UWP中实现大爆炸效果(二)
上一回实现了一个宽度不均匀的Panel,这次我们编写一个简单的BigbangView主体. 首先创建一个模板化控件,删掉Themes/Generic.xaml中的<Style TargetTyp ...
- UWP 大爆炸你个锤子
今天看到 叫我蓝火火 s的 UWP中实现大爆炸效果(一) ,我也来说一下我的app [小薇自然语言处理]实现的大爆炸技术. 看一下效果先. 我的控件是基于wrappanel的,正如蓝火火说的,这样看 ...
- Android 4.3实现类似iOS在音乐播放过程中如果有来电则音乐声音渐小铃声渐大的效果
目前Android的实现是:有来电时,音乐声音直接停止,铃声直接直接使用设置的铃声音量进行铃声播放. Android 4.3实现类似iOS在音乐播放过程中如果有来电则音乐声音渐小铃声渐大的效果. 如果 ...
- [一位菜鸟的COCOS-2D编程之路]打飞机中机种敌机和战机损毁时的爆炸效果
1.第一步,添加爆炸动画 //添加玩家飞机飞行动画 id _playerFlyAction; id _playerBlowupAnimation; //战机爆炸动画 id _enemyBlowupAn ...
- 飞流直下的精彩 -- 淘宝UWP中瀑布流列表的实现
在淘宝UWP中,搜索结果列表是用户了解宝贝的重要一环,其中的图片效果对吸引用户点击搜索结果,查看宝贝详情有比较大的影响.为此手机淘宝特意在搜索结果列表上采用了2种表现方式:一种就是普通的列表模式,而另 ...
- 将 UWP 中 CommandBar 的展开方向改为向下展开
在 UWP 中使用 CommandBar 来迅速添加一组功能按钮是非常迅速的,是 UWP 中推荐的交互方案之一.也许你能见到 CommandBar 按你所需向下展开,不过可能更多数情况会看到 Comm ...
- jQuery 打气球小游戏 点击气球爆炸效果
最近在学习前端,看到偶尔看到前端小游戏,就想自己写一个小游戏,奈何水平有限,只能写打气球这种简单的,所有的气球都是动态生成的,气球的颜色也是随机的 html部分 <div class=" ...
- UWP中的消息提示框(一)
不管什么平台,应用内难免会出现一些消息提示框,下面就来聊聊我在UWP里用到的消息提示框. 弹窗也可按是否需要用户操作促发一些逻辑进行分为两大类. 不需要用户干涉的一类: MessageDialog:操 ...
- 【CSS】398- 原生JS实现DOM爆炸效果
爆炸动效分享 前言 此次分享是一次自我组件开发的总结,还是有很多不足之处,望各位大大多提宝贵意见,互相学习交流. 分享内容介绍 通过原生js代码,实现粒子爆炸效果组件 组件开发过程中,使用到了公司内部 ...
随机推荐
- 【转载】tomcat+nginx+redis实现均衡负载、session共享(一)
http://www.cnblogs.com/zhrxidian/p/5432886.html 在项目运营时,我们都会遇到一个问题,项目需要更新时,我们可能需先暂时关闭下服务器来更新.但这可能会出现一 ...
- Linux下编译安装BOOST
linux平台下要编译安装除gcc和gcc-c++之外,还需要两个开发库:bzip2-devel 和python-devel,因此在安装前应该先保证这两个库已经安装: #yum install gcc ...
- Google Bigtable (中文版)
http://dblab.xmu.edu.cn/post/google-bigtable/ Abstract BigTable是一个分布式存储系统,它可以支持扩展到很大尺寸的数据:PB级别的数据,包含 ...
- vfd折腾(一)
从一开始驱动一块翻出来的液晶显示屏就想做一个电子时钟,偶然翻到了vfd(Vacuum Fluorescent Display的缩写,意为真空荧光显示屏). 此后就走上了不归路
- Ocelot中文文档-微服务ServiceFabric
如果您在Service Fabric中部署了服务,则通常会使用命名服务来访问它们. 以下示例展示如何设置一个ReRoute以便在在Service Fabric中工作. 最重要的是ServiceName ...
- linux下 mysql数据库的备份和还原sql
1.备份 [root@CentOS ~]# mysqldump -u root -p mysql > ~/mysql.sql #把数据库mysql备份到家目录下命名为mysql.sql Ente ...
- 2018 CISCN reverse wp
2018 CISCN reverse wp 这题比赛的时候没做出来,主要是心态崩了看不下去..赛后看了下网上的wp发现不难,是自己想复杂了.这里将我的思路和exp放出来,希望大家一起交流学习. mai ...
- lvs+keepalive实现主从效果,以及RS健康监测和tcp,udp实现非web的负载均衡
前面文章讲到了tcp和udp负载均衡,但是没有健康监测,这几天我优化了一下上次的操作.当然,我也是用的跨网段的通讯,因为线上业务主要是海外业务,所以做了iptables流量转发 IP: lvs-mas ...
- (四)SpringBoot2.0基础篇- 多数据源,JdbcTemplate和JpaRepository
在日常开发中,经常会遇到多个数据源的问题,而SpringBoot也有相关API:Configure Two DataSources:https://docs.spring.io/spring-boot ...
- AspnetCore 缓存篇
AspnetCore 缓存篇 一.缓存的作用 怎样理解缓存: 其实所有的程序,架构,优化,线程...等技术手段,最终的目的都是如何使产品快速的响应用户的操作,提高用户的体验性,目标都是为了系统的使用者 ...