原文:通通玩blend美工(6)上——仿iPhone滚动选择器的ListBox(UI设计)


  好久没更新博客了,由于项目比较紧,期间收到不少园友的短消息,感谢大家对我的支持~~。

  相信各位都在自己的神机中看到过各种滚动选择器,偶们项目经理就是个iPhone迷,前几天一直抬着个手机对我说"这个炫,做这个...".于是就有了这个选择器。

   

最终效果如下: (按住鼠标,尽情滚吧~)

 
页面代码如下: 
     <TextBlock Text="{Binding SelectedItem.Content, ElementName=ListBox1}"/>
<ListBox x:Name="ListBox1"SelectedIndex="2">
<ListBoxItem Content="1"/>
<ListBoxItem Content="2"/>
<ListBoxItem Content="3"/>
<ListBoxItem Content="4"/>
<ListBoxItem Content="5"/>
<ListBoxItem Content="6"/>
<ListBoxItem Content="7"/>
<ListBoxItem Content="8"/>
<ListBoxItem Content="9"/>
<ListBoxItem Content="0"/>
</ListBox>
<TextBlock Text="选中内容:"/>

  你没看错,这就是个家喻户晓ListBox,我只是用强大的Blend修改了他的各种容器模版,代码处理了各种鼠标事件封装成的控件。好处在于二次开发时可以创建各种模版副本来修改各种样式,子项的呈现形式,数据绑定等,就和ListBox使用一样。

  为避免文章太长,我这里分成两篇来写,第一篇是纯Blend画界面,第二篇,纯VS写各种鼠标事件动画处理。

1.总体思路


首先“仿”,果断上 下吧 找个iPhone的UI素材,观摩下。

分析上面效果:一个框框里面有个滚筒,玻璃条下面为选中项

  滚筒:其实就是在数字列表的上面加了一个具有不透明度渐变的遮罩,上下颜色深,中间亮,这样我们的视觉习惯就让一个垂直的列表看起来像是曲面。

  玻璃条:其实就是在一个灰色的条上调整下透明度,加上渐变让其中间出现分界线,让其看起来有凸出来的感觉,再加上黑色边框,阴影,完成。

2.设计过程


新建silverlight工程,果断拖入一个ListBox控件,随意加点内容。

现在数字居左,我们要让它们居中显示。

创建子项容器模版副本

选中内容占位控件。

把对其方式 点右边的黄点 点重置,选择居中对其

这样就居中了。

接下来我们来画它的外边框,这样有个对照,方便来设计里面的滚筒玻璃,什么的。

创建ListBox的模版副本

得到如下结构。

选中Grid添加一个矩形

再添加另一个矩形,如下图:

改成圆角呢

现在我们想要的是大矩形减去小矩形的部分。

同时选中这两个矩形 路径→生成复合路径。

这样两个Rectangle就合并为一个Path了。

接下来为这个路径添加渐变背景填充,让其看起来更有质感。渐变设置如下,颜色调到自己感觉好就行,要有耐心。质感线来源于中间那两个帧颜色变化比较突然,于是就产生了线。两个帧的位置分别为50%和51%。这里可以又下角的框里手动输入的。

这里我提供我的渐变方案供参考:

<Path Data="M0,0 L639,0 L639,454 L0,454 z M84.5,54.5 C84.5,48.977153 88.977153,44.5 94.5,44.5 L544.5,44.5 C550.02285,44.5 554.5,48.977153 554.5,54.5 L554.5,399.5 C554.5,405.02285 550.02285,409.5 544.5,409.5 L94.5,409.5 C88.977153,409.5 84.5,405.02285 84.5,399.5 z" Stretch="Fill" Stroke="#7F0A0A0A" IsHitTestVisible="False" Margin="0,0,-1,-1">
<Path.Effect>
<DropShadowEffect Direction="529" BlurRadius="4" Opacity="0.37"/>
</Path.Effect>
<Path.Fill>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="Black" Offset="1"/>
<GradientStop Color="#FF8D8D8D"/>
<GradientStop Color="#FF313131" Offset="0.51"/>
<GradientStop Color="#FF544C4C" Offset="0.5"/>
</LinearGradientBrush>
</Path.Fill>
</Path>

的到下图。是不是开始有点感觉了~~

为这个路径加上一点阴影,让其看起来更真实。

接下来制作框里面滚筒的材质。

呈现的列表内容就是在这个scrollviewer下了,先把他的颜色重置透明的,这样不影响我们发挥。

   

添加一个矩形来制作里面滚筒的底板。注意:层叠关系。

为其进行见渐变填充,如下:

接下来制作滚筒曲面的材质,同样添加一个矩形。

调整大小颜色,如下:

接下来,添加不透明遮罩,让其看起来像个曲面。

添加一个矩形。

改成黑色填充

更改其蒙板用渐变填充。这里和颜色的RGB值没关系,只和alpha通道有关,即不透明度。100%为完全显示,0%为完全透明。这里和PS里的蒙板差不多,PS里只不过是黑色为透明,白色为显示。下面4个帧,中间两个透明度为0,旁边两个为100%。大家自己调了看看,顺眼即可。

<Rectangle IsHitTestVisible="False" Margin="0,-0.5,-1,6.5" >
<Rectangle.OpacityMask>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#E28F8F8F" Offset="0.065"/>
<GradientStop Color="#EEFFFFFF" Offset="0.926"/>
<GradientStop Color="#001A1A1A" Offset="0.368"/>
<GradientStop Color="#00DDDDDD" Offset="0.649"/>
</LinearGradientBrush>
</Rectangle.OpacityMask>
<Rectangle.Fill>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="Black" Offset="1"/>
<GradientStop Color="Black"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>

得到如下,看起来已经是个曲面了。

接下来画那个玻璃块,添加一个矩形。

注意层叠关系,如下:

让其宽为自动贴紧两边,高少许。

添加渐变,颜色如下,调出感觉即可。

<Rectangle Margin="0,0,-1,0" Stroke="#5B000000" VerticalAlignment="Center" Height="78.5" StrokeThickness="1.5" IsHitTestVisible="False">
<Rectangle.Fill>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#69F1F1F1" Offset="0"/>
<GradientStop Color="#986E6E6E" Offset="1"/>
<GradientStop Color="#91626262" Offset="0.554"/>
<GradientStop Color="#6F525258" Offset="0.532"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>

如下,就制作完成了

接下来把他们全部分组到一个Viewbox里,这样我们就可以按比例来随意调整ListBox的大小,而不会改变之前设计好的样式的布局

接下来添加个项的布局的模版备用。这个东西就相当与item的容器,子项就全部按这个容器的来排布。默认是StackPanel,所以内容一般呈现为一行或者一列。

下节预告


  这节我们已经把它画出来了,理想状态下,作为一个美工的工作已经完成。作为一个中国美工,我们至少还需要把交互性做出来。

  下节我们来学习下面几点是如何实现的:

  •   随着鼠标的移动上下滚动。
  •   当放开鼠标后,自动对正。
  •   设置ListBox的SelectedIndex为但前玻璃块下面的项。
  •   load时根据XAML中设置的SelectedIndex自动滚动到相应项。

发表了这篇blog后突然发现个BUG,就是忘记禁用ListBox原生的滚动条了....这样滚动了鼠标中键以后定位就不准了。这个BUG相信大家都可以自己解决。

通通玩blend美工(6)上——仿iPhone滚动选择器的ListBox(UI设计)的更多相关文章

  1. 通通玩blend美工(6)下——仿iPhone滚动选择器的ListBox(交互逻辑)

    原文:通通玩blend美工(6)下--仿iPhone滚动选择器的ListBox(交互逻辑) 上一篇我们已经把界面画出来了,这篇我们就来制作交互的逻辑吧.上一篇的电梯: http://www.cnblo ...

  2. 通通玩blend美工(8)——动态绘制路径动画,画出个萌妹子~

    原文:通通玩blend美工(8)--动态绘制路径动画,画出个萌妹子~ 2年前我在玩Flex的时候就一直有一个疑问,就是如何来实现一个蚊香慢慢烧完的Loading动画呢? 刚经历了某甲方高强度一个月的洗 ...

  3. 通通玩blend美工(7)——简约而不简单的块

    原文:通通玩blend美工(7)--简约而不简单的块 最近在研发一个WPF快速开发框架,满脑子都是各种逻辑各种模式,写一篇比较休闲娱乐的博客,宣泄下我对美工的热爱. 我一直以来有意无意在手机应用或者各 ...

  4. 通通玩blend美工(3)——可爱的云

    原文:通通玩blend美工(3)--可爱的云 好久没有写这个系列的博客了,这里给个电梯吧,照顾新来的同学~~ 通通玩blend美工(1)——荧光Button 通通玩blend美工(2)——时钟 目前我 ...

  5. 通通玩blend美工(5)——旋转木马,交互性设计

    原文:通通玩blend美工(5)--旋转木马,交互性设计 这一篇偏向于逻辑的比较多,放在这个系列里会不会欠妥呢?在中国交互性设计也是美工的份内职责哦~ 所以没有blend基础的人也可以看懂这篇文章,不 ...

  6. 通通玩blend美工(1)——荧光Button

    原文:通通玩blend美工(1)--荧光Button 最近老大出差去了,光做项目也有点烦,写点教程消遣消遣(注:此乃初级教程,所以第一个消遣是本人消遣,第二个是指供各位看官消遣...) 看着各位大虾出 ...

  7. 通通玩blend美工(2)——时钟

    原文:通通玩blend美工(2)--时钟 谢谢大家对我上一篇Blend的支持:通通玩blend美工(1)——荧光Button 再接再厉再来一篇~~! 这篇是建立在已经看得懂上一篇为基础来写的,有些细节 ...

  8. 仿iphone日历插件(beta)

    前言 小伙伴们好,很久不见了.最近工作进入正常期了,所以慢慢的悠闲的时间久没有了,所以不能每天水一篇了. 最近也在听师傅(http://home.cnblogs.com/u/aaronjs/)的教导开 ...

  9. 仿iphone动态萤火虫锁屏应用安卓源码

    该源码是仿iphone动态萤火虫锁屏应用源码,源码SkyLock,这也是最近弄了一款锁屏,苦于市场百般阻拦与锁屏应用数量实在太多,于是将它拿出来开源:废话不多说,希望大家能够希望,更多说明请看下面的吧 ...

随机推荐

  1. 苹果浏览器Safari对html标签submit按钮的默认渲染

    -webkit-appearance: none; 上面的设置就告诉Safari不要使用默认渲染,使用我们写好的 有这么一个webkit的私有属性: -webkit-appearance:none;  ...

  2. [Jest] Snapshot

    The problem we face daily when we do testing: The Data structure may changing, component outlook mig ...

  3. Linux 网络编程系列教程

    一.基础理论篇 01.网络协议入门 02.LAN.WAN.WLAN.VLAN 和 VPN 的区别 03.IP 地址介绍 04.广播地址介绍 05.无连接和面向连接协议的区别 06.因特网的IP协议是不 ...

  4. JavaScript学习笔记八

    本文依据慕课网课程<JavaScript进阶>学习整理 第8章 浏览器对象 8-1 window对象   window对象是BOM的核心.window对象指当前的浏览器窗体.   wind ...

  5. Android四大组件之Activity--管理方式

    1. 概览 Activity的管理有静态和动态两层涵义: 静态是指Activity的代码组织结构,即Application中声明的Activity的集合,这些Activity被组织在一个APK中,有特 ...

  6. Popup 解决位置不随窗口/元素FrameworkElement 移动更新的问题

    原文:Popup 解决位置不随窗口/元素FrameworkElement 移动更新的问题 Popup弹出后,因业务需求设置了StaysOpen=true后,移动窗口位置或者改变窗口大小,Popup的位 ...

  7. 深度剖析:最新云端开发工具如何实现敏捷+DevOps开发落地

    相信很多软件开发人员们对今年国内新兴的云端开发工具——华为软件开发云都有耳闻,有些人可能还免费体验过,由于它5人以下的团队是免费使用的,很庆幸本人的这个项目正好5个人,就注册使用了.下面就自己的使用心 ...

  8. template.js小小说明

    教程 template.js 一款 JavaScript 模板引擎,简单,好用.提供一套模板语法,用户可以写一个模板区块,每次根据传入的数据,生成对应数据产生的HTML片段,渲染不同的效果. 简介 主 ...

  9. Dictionary(数据字典)

    数据字典:Dictionary对象用于在结对的名称/值中存储信息(等同于键和项目),其可作为传参使用. C# Dictionary字典类的使用方法 //定义字典 Dictionary<strin ...

  10. [STM32] IAP不能跳转到APP

    用w5500做网页iap升级, 文件上传正确, 对比内部flash内容也正确, 就是不跳转. 查资料, 怀疑是中断的影响. 在跳转前关闭中断, 问题解决! // IAP程序使用了中断, 跳转前关闭 _ ...