首页

精美时尚的天气☁️ 手机APP界面UI设计欣赏 - 蓝蓝设计(十二)

前端达人

手机UI中的交互是保持产品鲜活生命力的源动力。好的交互可以帮助用户快速地获得反馈,认知布局,增强体验感和沉浸感。

手机UI中的交互是保持产品鲜活生命力的源动力。好的交互可以帮助用户快速地获得反馈,认知布局,增强体验感和沉浸感。这里为大家整理了一些优秀并富有创意的交互作品,为你的产品设计注入灵感。

jhk-1599450540777.jpg

--精美时尚的天气☁️手机app--jhk-1599450537147.jpg

--精美时尚的天气☁️手机app--

jhk-1599528210651.jpg

--精美时尚的天气☁️手机app--

jhk-1599528218678.jpg

jhk-1599528340106.jpg

jhk-1599528344567.jpg

WechatIMG172.png

jhk-1599449851286.png

jhk-1599449824025.png

jhk-1599010597722.png

jhk-1599010532826.png

jhk-1599010495523.png

WechatIMG173.jpeg

WechatIMG174.png

WechatIMG175.png

WechatIMG176.jpeg

WechatIMG177.png

--手机appUI设计--

 (以上图片均来源于网络)



 蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服



  更多精彩文章:

       手机appUI界面设计赏析(一)

       手机appUI界面设计赏析(二)

       手机appUI界面设计赏析(三)

       手机appUI界面设计赏析(四)

       手机appUI界面设计赏析(五)

       手机appUI界面设计赏析(六)

       手机appUI界面设计赏析(七)

       手机appUI界面设计赏析(八)

      手机appUI界面设计赏析(九)

       手机appUI界面设计赏析(十)

     手机appUI界面设计赏析(十一)




超赞的页面设计赏析

前端达人

网页中超过95%以上的信息都是通过文字的形式呈现。 然而,页面文字并非毫无章法的随意呈现。事实上,更具可读性、视觉效果以及独特排版和布局的网页文本设计,更能吸引用户,提升用户愉悦度。这也是为什么越来越多的设计师日益重视网页排版设计的重要原因。

BS界面是基于浏览器的界面,随着人们对于用户体验要求的不断提高,BS界面的设计要求也越来越高,

接下来为大家分享一下我收集到的案例:

0130015f4ef6fe11013f1a64a7ae6e.png

jhk-1598577838087.jpg

jhk-1599010563540.png

jhk-1599010690940.jpg

jhk-1599450537147.jpg

jhk-1599528268664.png

WechatIMG178.png

WechatIMG180.jpeg

WechatIMG181.jpeg

WechatIMG182.jpeg

WechatIMG183.jpeg

WechatIMG184.jpeg

WechatIMG201.jpeg

WechatIMG202.png

WechatIMG203.png

WechatIMG204.png

WechatIMG206.png




(以上图片均来源于网络)



  蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服



  更多精彩文章:

       ui界面设计之网站设计案例欣赏(一)

       超赞的创意页面排版设计,打造“视”不可挡的网页设计







巧夺天工科技调度台-交通指挥中心-太空科技风整装解决方案

高劲

巧夺天工科技控制台能够很好地完成智能交通的规划建设和管理,对接处警信息、监控信息、交通流量信息...

随着5G技术发展,大数据、人工智能、互联网技术不断提升,巧夺天工科技深刻认识到每一个控制台线缆管理能力的提升、人机环境和谐处理以及对操作人员工作和提高力准确度背后对应的是给行驶在交通道路上的公民提供更安全的保障。巧夺天工科技控制台能够很好地完成智能交通的规划建设和管理,对接处警信息、监控信息、交通流量信息、交通事件的受理,对交通管制、交通诱导、交通信息灯控制等实现各级联动协作、调度指挥、辅助决策、信息处理等功能。从而达到报警便利、接警快捷、调度畅通、出警有力。

方案展示

交通指挥中心-调度台

交通指挥中心-调度台

交通指挥中心-调度台

交通指挥中心-调度台

方案对应产品展示

双工位数据分析工作站ED-LB9106


虚拟化数字沙盘ED-SP9500


组合式多媒体工作站ED-SP9703


一体化造型壁灯


通道式电视造型墙


巧夺天工科技研发的全金属控制台、操作台、操控台、调度台、监控台、工作台、工作站、电子沙盘、大数据展示设备、智控储物柜等信息化设备均采用人体工程学设计、科学线缆管理、优质精良选材。

文章来源:站酷

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

“个人主页”设计相关思考

涛涛

“个人主页”是一个听起来很熟悉,但又跟“个人中心”傻傻分不清楚的一个模块,一般情况下处于APP底Tab的最右边,通常喊它为“我的”。





这个界面看似没什么挑战可言,给设计师一种“不就是排排版的事儿嘛”的膨胀误解,认为完全在自己射程范围内,整个人都有点飘。


但最近发现,它并不像表面所呈现出的那么简单,其实里面有很多小揪揪需要深挖和思考,所以千万不能小瞧它。


好,废话不多说,上才艺。






 个人主页和个人中心的区别是? 




讲“个人主页”前,先跟大家捋一下它俩的区别,避免混淆。首先,并没有官方定义它们的名字,只是喊的人多了也就成了它们的名字了。


所以“个人主页”也好、“个人中心”也罢,只是大家习惯性称呼,为了合作过程中大家在同一个话语体系,提效而已。


要说它们俩的区别,其实还是有的。




 什么是个人中心?


个人中心,承载着自己账号信息、设置管理、福利信息等功能的聚合地,主要用于个人信息的管理。


它常见于“工具类”产品中,如下:





对于“个人中心”,设计师要考虑的最核心是:如何解决“效率”问题。因此信息布局合理,视觉尽可能减少干扰,变得格外重要。





什么是个人主页?


个人主页,一般承载着用户个人信息、个人影响力、生产的内容等等,以此突显自己魅力或定位。


常出现在内容、社交、社区类产品中,比如以下产品:



当然,还有一些产品,它既包含“个人中心”,也包含“个人主页”,如下:





整体来看,“个人中心”偏向于个人信息的管理,更关注于“效率”;而“个人主页”偏向于展示自我,关注点更“多元”,会复杂一些,下面会细讲。搞明白了它们的区别之后,大家会发现“个人中心”相对更简单一些。


所以,这次我们先聚焦聊聊“个人主页”。







 设计“个人主页”前思考什么?




在工作中,做任何需求都应该有其目的或目标,不然所有的忙碌都容易沦为资源的浪费。“个人主页”也应有其价值和使命。


像上一趴所说,“个人主页”是为了让用户突显或塑造自己的魅力,很像是一个人的“个人名片”。那么,用户塑造个人魅力对产品有什么价值和收益呢?目标是什么呢?





拿短视频产品举例:如果用户能够在“个人主页”充分展现自己的才华和魅力,从而带来了更多浏览者的“关注”,那他们就更有动力分享或生产优质内容,进而使产品内容更加丰富;从而吸引更多新用户的浏览、留存。


更多新用户的加入、浏览、留存,让内容生产者有更多的涨粉空间,粉丝规模做起来之后再进行商业化。


这样对消费型用户、内容生产者、平台方都有利,进而处于良性循环。






这就是“个人主页”背后的大概逻辑和目的。







 如何进行“个人主页”的设计?




了解完“个人主页”存在的价值和目标之后,那么,作为产品或设计师们需要帮助用户解决几个问题:1.树立人设;2.辅助吸粉; 3.助力变现。




 1.树立人设 



人为什么需要树立人设?


树立人设,本质上是两种目的:获得认可(提升关注/约X),获得收入(提升变现能力)。



如何帮助用户快速建立人设?


个人主页里有几个区域,影响着用户建立人设:a.头图区;b.个人信息区;c.作品区;



a.头图区


头图,指的是“个人主页”顶部的图片区域。


为了让浏览者进入“个人主页”快速了解作者,头图这种处理手法,是很多社交/社区/内容类产品,“树立人设”的标配。


比如:社交类产品的头图,用户要么放自己照片,要么放风景;




大V、商家等角色的用户,会把头图打造成自己品牌的招牌,辅助浏览者快速了解自己定位。




不过,头图尺寸占比要把控好。


尺寸大小会影响界面的“屏效比”和用户“上传门槛儿”,对产品核心数据也有着千丝万缕的关系。




b.个人信息区


个人信息区,也是作者的基础资料。


一般包含着:用户的昵称、账号、简介、标签、粉丝关注量、关系链等信息。这个区域设计时需要重点考虑“信息亲密度”和“信息优先级”。


信息亲密度:指的是如何将更亲近的信息,以信息组的形式传递,减少用户认知成本。


比如下图,常见的社区或内容类产品针对“个人信息区”的处理方式(同一颜色的色块代表亲密度更强的信息。)



同时,“信息组”与“信息组”之间也需要处理好亲密度,比如“小红书”和“instagram”的“好友关系链”与“关注按钮”是放一起的,方便用户快速作出“关注”决策。




c.作品区


作品区的重要性不用多说了,它是作者“树立人设”的重要组成部分,也直接影响着浏览者是否愿意关注的关键因素。


“作品区”设计时,有2个重要因素需要考虑:“作品尺寸占比”、“作品信息外显”




1)作品尺寸占比:


比如下图,同样是短视频产品,Before作品区一排仅1个作品,剪映2个作品,而抖音3个作品。




单从排版美丑来评价是不负责的,那么如何决策哪种处理手法“对”的呢?


这需要通过自己产品定位分析,以及通过不同布局方式进行上线测试,重点观测核心数据(用户消费时长/作品消费个数/关注率等)的影响情况来决策。





2)作品信息外显:


除了作品本身,它的“辅助信息”也是帮助用户做决策的重要因素。


比如:“Before”除了对作品热度信息(浏览量、评论量等)外显以外,更强调和引导用户进行互动,如:收藏、分享、评论、充电;“剪映”根据产品属性,更强调“使用数”和“作品的描述文案”;“抖音”作品仅外显“点赞数‘,同时通过“置顶”和“刚刚看过”提升用户决策效率。



以上可以看出,头图区、个人信息区、作品区,是让浏览者快速且准确的了解或关注内容创作者重要组成部分,也是内容创作者“树立人设”的主要手段。





 2.辅助吸粉 


辅助吸粉,换句话说也是辅助用户提升“关注率”。


不可否认,清晰的编辑个人信息,产出优质的内容,是用户吸粉的根本,我们能做的只是“助攻”。


所以,在做此类“个人主页”时,我们需要通过设计手段做个靠谱“奶妈”,有几个维度可以尝试:a.强化关注;b.沉淀粉丝。


a.强化关注


衡量粉丝多少,是通过用户是否点击“关注”了内容创作者。


因此身为产品工作人员,在个人主页设计时,除了其它信息呈现以外,在不影响页面信息合理性的情况下,尽可能强化“关注”按钮,引导用户操作。









b.沉淀粉丝



有了粉丝之后,提升粉丝忠诚度和粘性,是每一个内容生产者面临的问题,也是工作人员们需要帮内容创作者解决的。


左边是“快手”,在个人主页内有粉丝群入口;右边是“火山”,打造自己的“圈子”,粉丝们可以在里面发自己的动态,或进行互动。



这么做是为了提升内容创作者的粉丝粘性,给他们更大的空间去运营粉丝,培养感情,打造更忠诚的私域流量。






 3.助力变现 



除了树立人设、辅助吸粉以外,助力他们变现,才能使他们长期扎根于此(留在自己平台)。不然大V们会带着自己圈到的粉丝,去别的地儿赚钱,给你的产品带绿帽子。


拿知乎举例,内容创作者可以在个人主页挂自己的商品橱窗,给符合自己人设的商品带货。





也可以开通付费咨询模块,通过帮助用户解答问题实现变现。




除此之外,还可以做付费Live课程。



再来看下像哔哩哔哩、抖音、火山、QQ音乐等平台,在个人主页都有辅助用户变现的入口。





下面是“声撩”,利用用户声音的优势去变现,比如:陪打游戏(软妹子声音让王者峡谷的汉子们兴奋)、睡前陪聊、睡前连麦等等。


如果你真的很富有,且不想让妹子陪聊陪打游戏,就是单纯的想砸礼物引起注意,右图可以看出,有个入口是直接“送礼”。



这么做满足土豪诉求(博取主播注意),满足主播诉求(变现),满足平台诉求(抽成),何乐而不为。


同时,也越来越多了产品不仅解决C端用户的变现诉求,同时解决B端用户变现诉求。比如,抖音赋能商家,商家号的“个人主页”可以自定义tab,默认展示“商品”tab。


用户不仅能在这里消费作品,还能通过作品建立的信任促进购买行为。




再比如,instagram也提供B端用户开店铺功能。





以上,是关于“个人主页”如何助力用户变现的案例,其实玩法还有很多,这里仅提供一些思路,大家平常玩APP时可以多关注下。






   总结   



总的来说,“个人中心”与“个人主页”最大的区别在于:“个人中心”主要是“给自己看的”,更注重使用效率。


“个人主页”主要是“给他人看的”,更注重突显自己魅力。在满足使用效率的基础上,需要通过产品设计手段帮助用户“树立人设”、“辅助吸粉”、“助力变现”,从而使用户和平台实现双赢,打造一个更完善的生态。


以上,是“个人主页”设计相关思考,希望对你们有所帮助。

文章来源:UI中国    作者:大牙


蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务



超赞的创意网页排版设计,打造 “视”不可挡的网页设计

前端达人

网页中超过95%以上的信息都是通过文字的形式呈现。 然而,页面文字并非毫无章法的随意呈现。事实上,更具可读性、视觉效果以及独特排版和布局的网页文本设计,更能吸引用户,提升用户愉悦度。这也是为什么越来越多的设计师日益重视网页排版设计的重要原因。

BS界面是基于浏览器的界面,随着人们对于用户体验要求的不断提高,BS界面的设计要求也越来越高,

接下来为大家分享一下我收集到的案例:

jhk-1598599171213.jpg

jhk-1598599175297.jpg

jhk-1598599244105.png

jhk-1598599256648.png

WechatIMG73.png

WechatIMG74.png

WechatIMG94.png

WechatIMG106.jpeg

WechatIMG138.png

WechatIMG139.png

WechatIMG140.jpeg

WechatIMG141.pngWechatIMG142.jpeg

WechatIMG143.png

WechatIMG156.jpeg

WechatIMG157.jpeg

WechatIMG158.jpegWechatIMG158.jpeg



(以上图片均来源于网络)


蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服



  更多精彩文章:

       ui界面设计之网站设计案例欣赏(一)


ES6 的循环和可迭代对象

seo达人

本文将研究 ES6 的 for ... of 循环。

旧方法

在过去,有两种方法可以遍历 javascript。

首先是经典的 for i 循环,它使你可以遍历数组或可索引的且有 length 属性的任何对象。

for(i=0;i<things.length;i++) { var thing = things[i] /* ... */ }

其次是 for ... in 循环,用于循环一个对象的键/值对。

for(key in things) { if(!thing.hasOwnProperty(key)) { continue; } var thing = things[key] /* ... */ }

for ... in 循环通常被视作旁白,因为它循环了对象的每一个可枚举属性。这包括原型链中父对象的属性,以及被分配为方法的所以属性。换句话说,它遍历了一些人们可能想不到的东西。使用 for ... in 通常意味着循环块中有很多保护子句,以避免出现不需要的属性。

早期的 javascript 通过库解决了这个问题。许多 JavaScript库(例如:Prototype.js,jQuery,lodash 等)都有类似 each 或 foreach 这样的工具方法或函数,可让你无需 for i 或 for ... in 循环去遍历对象和数组。

for ... of 循环是 ES6 试图不用第三方库去解决其中一些问题的方式。

for … of

for ... of 循环

for(const thing of things) { /* ... */ }

它将遍历一个可迭代(iterable)对象。

可迭代对象是定义了 @@ iterator 方法的对象,而且 @@iterator 方法返回一个实现了迭代器协议的对象,或者该方法是生成器函数。

在这句话中你需要理解很多东西:

  • 可迭代的对象
  • @@iterator方法( @@是什么意思?)
  • 迭代器协议(这里的协议是什么意思?)
  • 等等,迭代(iterable)和迭代器(iterator)不是一回事?
  • 另外,生成器函数又是什么鬼?

下面逐个解决这些疑问。

内置 Iterable

首先,javascript 对象中的一些内置对象天然的可以迭代,比如最容易想到的就是数组对象。可以像下面的代码中一样在 for ... of 循环中使用数组:

const foo = [ 'apples','oranges','pears' ] for(const thing of foo) { console.log(thing)
}

输出结果是数组中的所有元素。

apples oranges
pears

还有数组的 entries 方法,它返回一个可迭代对象。这个可迭代对象在每次循环中返回键和值。例如下面的代码:

const foo = [ 'apples','oranges','pears' ] for(const thing of foo.entries()) { console.log(thing)
}

将输出以下内容

[ 0, 'apples' ]
[ 1, 'oranges' ]
[ 2, 'pears' ]

当用下面的语法时,entries 方法会更有用

const foo = [ 'apples','oranges','pears' ] for(const [key, value] of foo.entries()) { console.log(key,':',value)
}

在 for 循环中声明了两个变量:一个用于返回数组的第一项(值的键或索引),另一个用于第二项(该索引实际对应的值)。

一个普通的 javascript 对象是不可迭代的。如果你执行下面这段代码:

// 无法正常执行 const foo = { 'apples':'oranges', 'pears':'prunes' } for(const [key, value] of foo)

{ console.log(key,':',value)

}

会得到一个错误

$ node test.js
/path/to/test.js:6 for(const [key, value] of foo) {
TypeError: foo is not iterable

然而全局 Object 对象的静态 entries 方法接受一个普通对象作为参数,并返回一个可迭代对象。就像这样的程序:

const foo = { 'apples':'oranges', 'pears':'prunes' } for(const [key, value] of Object.entries(foo))

{ console.log(key,':',value)

}

能够得到你期望的输出:

$ node test.js
apples : oranges
pears : prunes

创建自己的 Iterable

如果你想创建自己的可迭代对象,则需要花费更多的时间。你会记得前面说过:

可迭代对象是定义了 @@ iterator 方法的对象,而且 @@iterator 方法返回一个实现了迭代器协议的对象,或者该方法是生成器函数。

搞懂这些内容的最简单方法就是一步一步的去创建可迭代对象。首先,我们需要一个实现 @@iterator 方法的对象。 @@ 表示法有点误导性,我们真正要做的是用预定义的 Symbol.iterator 符号定义方法。

如果用迭代器方法定义对象并尝试遍历:

const foo = {
  [Symbol.iterator]: function() {
  }
} for(const [key, value] of foo) { console.log(key, value)
}

得到一个新错误:

for(const [key, value] of foo) {
                          ^
TypeError: Result of the Symbol.iterator method is not an object

这是 javascript 告诉我们它在试图调用 Symbol.iterator 方法,但是调用的结果不是对象。

为了消除这个错误,需要用迭代器方法来返回实现了迭代器协议的对象。这意味着迭代器方法需要返回一个有 next 键的对象,而 next 键是一个函数。

const foo = {
  [Symbol.iterator]: function() { return { next: function() {
      }
    }
  }
} for(const [key, value] of foo) { console.log(key, value)
}

如果运行上面的代码,则会出现新错误。

for(const [key, value] of foo) {
                     ^
TypeError: Iterator result undefined is not an object

这次 javascript 告诉我们它试图调用 Symbol.iterator 方法,而该对象的确是一个对象,并且实现了 next 方法,但是 next 的返回值不是 javascript 预期的对象。

next 函数需要返回有特定格式的对象——有 value 和 done 这两个键。

next: function() { //... return { done: false, value: 'next value' }
}

done 键是可选的。如果值为 true(表示迭代器已完成迭代),则说明迭代已结束。

如果 done 为 false 或不存在,则需要 value 键。 value 键是通过循环此应该返回的值。

所以在代码中放入另一个程序,它带有一个简单的迭代器,该迭代器返回前十个偶数。

class First20Evens { constructor() { this.currentValue = 0 }

  [Symbol.iterator]() { return { next: (function() { this.currentValue+=2 if(this.currentValue > 20) { return {done:true}
        } return { value:this.currentValue
        }
      }).bind(this)
    }
  }
} const foo = new First20Evens; for(const value of foo) { console.log(value)
}

生成器

手动去构建实现迭代器协议的对象不是唯一的选择。生成器对象(由生成器函数返回)也实现了迭代器协议。上面的例子用生成器构建的话看起来像这样:

class First20Evens { constructor() { this.currentValue = 0 }

  [Symbol.iterator]() { return function*() { for(let i=1;i<=10;i++) { if(i % 2 === 0) { yield i
        }
      }
    }()
  }
} const foo = new First20Evens; for(const item of foo) { console.log(item)
}

本文不会过多地介绍生成器,如果你需要入门的话可以看这篇文章。今天的重要收获是,我们可以使自己的 Symbol.iterator 方法返回一个生成器对象,并且该生成器对象能够在 for ... of 循环中“正常工作”。 “正常工作”是指循环能够持续的在生成器上调用 next,直到生成器停止 yield 值为止。

$ node sample-program.js
2
4
6
8 

10

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

超赞 时尚简约 手机APP界面UI设计欣赏 - 蓝蓝设计(十一)

前端达人

手机UI中的交互是保持产品鲜活生命力的源动力。好的交互可以帮助用户快速地获得反馈,认知布局,增强体验感和沉浸感。

手机UI中的交互是保持产品鲜活生命力的源动力。好的交互可以帮助用户快速地获得反馈,认知布局,增强体验感和沉浸感。这里为大家整理了一些优秀并富有创意的交互作品,为你的产品设计注入灵感。

WechatIMG78.png



WechatIMG102.jpeg

jhk-1589856834298.jpg

jhk-1589856847369.jpg

jhk-1596893249060.png

jhk-1596893316552.jpg

jhk-1596893336786.jpg

jhk-1598335311209.jpg

jhk-1599010550962.png

jhk-1599010555618.png

jhk-1599010562811.png

jhk-1599010576450.png

WechatIMG78.png

WechatIMG79.png

WechatIMG80.jpeg

WechatIMG81.png

WechatIMG82.png

WechatIMG100.png

WechatIMG101.pngWechatIMG102.jpeg

WechatIMG103.jpeg

WechatIMG104.png

--手机appUI设计--

 (以上图片均来源于网络)



 蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服



  更多精彩文章:

       手机appUI界面设计赏析(一)

       手机appUI界面设计赏析(二)

       手机appUI界面设计赏析(三)

       手机appUI界面设计赏析(四)

       手机appUI界面设计赏析(五)

       手机appUI界面设计赏析(六)

       手机appUI界面设计赏析(七)

       手机appUI界面设计赏析(八)

      手机appUI界面设计赏析(九)

       手机appUI界面设计赏析(十)



顶部导航和侧边导航,哪一种用户体验更好?

涛涛

先来了解一下项目的背景。Conduira online是一个线上的教育平台,为准备考试的用户提供有用的工具和资源。这个平台目前有一个侧边导航栏,上面有11个选项。后来由于平台的变化,将主导航的选项缩减到3个——主页、实习和课程。

导航的数量变少了,团队又迎来了新的问题:是应该继续保留侧边导航的设计样式还是切换成顶部导航的样式呢?

顶部导航和侧边导航,哪一种用户体验更好?

为了做出最合理的选择,我们需要回答三个基本的问题。

主导航中有几个选项?

在选择导航时回答这个问题很重要。这里介绍一个有趣的的交互概念叫做视觉固定(Visual Fixation):注意力一直保持在同一个地方。

在顶部导航中,一个视觉固定点通常只适合一个选项。然而,侧边导航上的单一视觉固定点可以同时容纳两个选项。

顶部导航和侧边导航,哪一种用户体验更好?

结果很明确。与顶部导航相比,用户在一次视觉观察中可以在侧边导航上查看和感知更多菜单选项。当然顶部导航也有自己的优势,为每个菜单项赋予各自的权重,而不是让它们的重要性被其他选项分散。

对于具有过滤选项或带有二级菜单的电商网站,视觉固定的概念起到了非常重要的作用。因为在这些情况下,我们希望用户能够在单一的视觉点上尽可能多的选择。

Tips:这里的选择仅仅取决于界面上有多少选项。如果主导航的菜单项不多于5个,只需使用顶部导航,这样能够更好地控制用户在整个平台上的体验旅程。

主导航与选项优先级的关系?

用户在浏览网页或App时会有各种各样的浏览顺序,其中一种就是「F型模式」。

看起来像这样:

顶部导航和侧边导航,哪一种用户体验更好?

F型布局的特点是将注视力集中在页面的顶部和左侧:

  • 用户首先以水平移动的方式浏览内容区域,这个动线构成了F型布局的顶栏;
  • 接下来用户扫描页面左侧的垂直线,进行第二次水平移动浏览。随着路径越来越长,阅读覆盖的区域一次比一次短,构成了F型布局下面的部分;
  • 最后用户以垂直移动的方式浏览整个页面的内容。

这种模式的含义是同一页面上的第一行文本比后几行文本受到更多的关注;每行文本左边的几个字比后面的文字接受度更多。

因此,在顶部导航中最左边的选项比其他选项具有更多的视觉权重,因为它位于主要视觉区域,优先级更高。

顶部导航和侧边导航,哪一种用户体验更好?

侧边导航采用了垂直移动,这是用户浏览网页的一个自然方向,但是选项优先级的排序是个限制。当选项的优先级相同时,可以使用侧边导航,这样用户就可以完整浏览列表并确定对他们重要的内容。

是否考虑使用二级导航?

如果是的话,可以考虑利用以下两种设计样式:

水平导航——在页面顶部设置一个主导航,在主导航下面设置二级导航进一步来区分内容。

顶部导航和侧边导航,哪一种用户体验更好?

侧边栏——在顶部设置一个主导航,然后在侧边设置一个侧边栏菜单来处理其他内容。

顶部导航和侧边导航,哪一种用户体验更好?

总结

顶部导航和侧边导航之间的选择实际上取决于以上三个基本的问题。

另外由于现在的设备有了更大的屏幕尺寸,如今许多设计趋势已转向侧边导航,因为它看起来更干净并优化了更多的屏幕空间。

最后将导航的选择归结为两点:

  • 主导航包含的选项数量;
  • 是希望用户根据优先级浏览项目,还是希望用户可视化地浏览并根据其偏好选择项目。

文章来源:优设    作者:Clip设计夹


蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务


竞品分析

高劲

通过分析市场上的竞品,能够让设计师在短时间内快速了解自己所做产品在整个市场中的定位。

凯励程APP设计规范


设计规范应用范围

1、设计规范适用于凯励程APP6.1.0版本

2、设计尺寸750*1334

3、规范字体为平方,单位px


为什么要对设计规范进行分析

1、方便多个设计师进行协同设计,把控视觉统一性,提率,减少返工率

2、提高开发效率、保证开发结果与视觉效果图的还原度

3、辅助设计及开发理解业务

4、方便产品迭代



LOGO设计

凯励程logo设计的运用元素:首字母k的变形+盾牌外轮框组合设计,logo设计运用名称的首字母作为元素给人的感觉一目了然,凯励程的核心功能是专注汽车安全服务,所以这里的盾牌比较有安全感,颜色使用深色调,稳定内敛。


App界面的整体风格扁平,颜色搭配清爽,首页通过卡片式布局将各功能及信息模块分区展示,寻车功能为整个app的核心功能,所以将这块区域放置在首页的banner位置,并且加了圆角和投影,层次鲜明,使人的视觉会在第一时间浏览此功能,查看车辆的位置情况。icon采用线性icon和部分实心icon相结合,图标简洁清晰易识别,色调统一,明度一致。

颜色搭配有互补色和同类色,互补色为色相环上,夹角互为180度的色彩,互补色具有强烈的对比;同类色为色相环上,夹角为60度以内的色彩,色相对比差异比较小,给人以协调统一、稳定自然的印象。同类色的搭配也很容易出画面效果,不太容易出错。通常为了避免版面呆板,可以通过增加明暗对比,来制造出丰富的质感和层次主色调为蓝色,辅助色为浅蓝色。

文章来源:站酷    

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

Fluter 应用调试

seo达人

Flutter 构建模式

目前,Flutter一共提供了三种运行模式,分别是Debug、Release和Profile模式。其中,Debug模式主要用在软件编写过程中,Release模式主要用于应用发布过程中,而Profile模式则主要用于应用性能分析时,每个模式都有自己特殊的使用场景。下面简介介绍下这几种模式:


Debug模式

Debug模式又名调试模式,Debug模式可以同时在物理设备、仿真器或者模拟器上运行应用。默认情况下,使用flutter run命令运行应用程序时就是使用的Debug模式。在Debug模式下,所有的断言、服务扩展是开启的,并且在模式对快速开发和运行周期进行了编译优化,当使用调试工具进行代码调试时可以直接连接到应用的进程里。


Release模式

Release模式又名发布模式,此模式只能在物理设备上运行,不能在模拟器上运行。使用flutter run --release命令运行应用程序时就是使用的Release模式。在Release模式下,断点、调试信息和服务扩展是不可用的,并且Release模式针对快速启动、快速执行和安装包大小进行了优化。


Profile模式

Profile模式只能在物理设备上运行,不能在模拟器上运行。此模式主要用于应用性能分析,一些应用调试能力是被保留的,目的是分析应用存在的性能问题。Profile模式和Release模式大体相同,不同点体现在,Profile模式的某些服务扩展是启用的,某些进程调试手段也是开启的。


调试模式

在 Debug 模式下,app 可以被安装在物理设备、仿真器或者模拟器上进行调试。在Debug模式下,可以进行如下操作:


断点 是开启的。

服务扩展是开启的。

针对快速开发和运行周期进行了编译优化(但不是针对执行速度、二进制文件大小或者部署)。

调试开启,类似 开发者工具 等调试工具可以连接到进程里。

如果是在 Web 平台下的调试模式,可以进行如下操作:


本次构建 没有 最小化资源并且整个构建 没有 优化性能。

为了简化调试,这个 Web 应用使用了 dartdevc 编译器。

默认情况下,运行 flutter run 会使用 Debug 模式,同时 IDE 也支持这些模式。例如,Android Studio 提供了 Run > Debug… 菜单选项,而且在项目面板中还有一个三角形的绿色运行按钮图标 。


Release 模式

当你想要最大的优化以及最小的占用空间时,就使用 Release 模式来部署 app。 release 模式是不支持模拟器或者仿真器的,使用 Release 模式意味着。


断点是不可用的。

调试信息是不可见的。

调试是禁用的。

编译针对快速启动、快速执行和小的 package 的大小进行了优化。

服务扩展是禁用的。

对于Web开发来说,使用 Release 模式意味着。


这次构建资源已经被压缩,并且性能得以优化。

这个 Web 应用通过 dart2js 编译器构建,以确保更优秀的性能。

Profile 模式

在 Profile 模式下,一些调试能力是被保留的,足够分析你的 app 性能。Profile 模式在仿真器和模拟器上是不可用的,因为他们的行为不能代表真实的性能。和 release 相比, profile 模式有以下不同:


一些服务扩展是启用的。例如,支持 performance overlay。

Tracing 是启用的,一些调试工具,比如 开发者工具 可以连接到进程里。

在 Web 平台使用Profile 模式意味着:


资源文件没有被压缩,但是整体性能已经优化。

这个 Web 应用通过 dart2js 编译器构建。

调试工具

在Flutter应用开发中,有很多工具可以帮助调试 Flutter 应用程序,常见的如下所示。


开发者工具,是一套运行在浏览器的性能及分析工具。

Android Studio/IntelliJ 和 VS Code(借助 Flutter 和 Dart 插件)支持内置的源代码调试器,可以设置断点,单步调试,检查数值。

Flutter inspector,是开发者工具提供的 widget 检查器,也可直接在 Android Studio 和 IntelliJ 中使用(借助 Flutter 插件)。检查器可以可视化展现 widget 树,查看单个 widget 及其属性值,开启性能图层,等等。

开发者工具

要调试及分析应用,开发者工具可能是你的首选。开发者工具运行在浏览器,支持以下特性:


源代码调试器

Widget 检查器,展示可视化的 widget 树; “widget select” 模式,在应用中选择一个 widget,会在 widget 树直接定位到它的位置。

内存分析

时间线视图,支持跟踪,导入及导出跟踪信息

日志视图

如果你在Debug 模式 或Profile 模式 运行,那么可以在浏览器打开开发者工具连接到你的应用。开发者工具不能用在 Release 模式 编译的应用,因为调试和分析信息都被删除了。如果你要用开发者工具分析应用,需确保使用 Profile 模式运行应用。


在这里插入图片描述


断点调试

和其他语言一样,Flutter的断点调试支持在 IDE 或编辑器(比如 Android Studio/IntelliJ 和 VS Code)、或者通过编码两种方式。

其中,开发者工具调试器如下图所示。

在这里插入图片描述


如果需要,在源代码中设置断点,然后点击工具栏中的 【Debug】 按钮,或选择 【Run】 > 【Debug】即可开启调试功能。

在这里插入图片描述


开启调试后,可以在控制台看到如下一些信息。


底部的 Debugger 窗口会显示出堆栈和变量信息。

底部的 Console 窗口会显示详细的日志输出。

调试基于默认的启动配置,如果需要自定义,点击选择目标下拉按钮,选择 Edit configuration 进行配置。

在进行断点调试时,使用得最多的就是单步调试,三个单步调试按钮在暂停后会变为可用状态。


使用 Step in 来进入被调用的方法,在遇到方法内的第一行可执行代码时结束。

使用 Step over 直接执行某个方法调用而不进入内部;该按钮在当前方法内按行执行。

使用 Step out 来跳出当前方法,这种方式会直接执行完所有当前方法内的语句。

除此之外,我们还可以使用代码的方式进行断点调试,我们可以在源代码中使用 debugger()函数来开启断点,当代码运行到此处时就会刮起,如下所示。


import 'dart:developer';


void someFunction(double offset) {

 debugger(when: offset > 30.0);

 // ...

}

Dart 分析器

如果你使用的是 Android Studio或者VSCode,那么工具会自带的 Dart 分析器默认会检查代码,并发现可能的错误。如果你使用命令行,则可以使用 flutter analyze命令来检查代码。Dart 分析器非常依赖你在代码中添加的类型注解,以帮助跟踪问题。


另外,我们可以使用flutter analyze --flutter-repo命令将分析结果打印到控制台上,每次运行这个命名之前,请先运行flutter update-packages 升级的包,这样就可以获取的依赖包。如果你不这样做,你可能会从dart:ui得到一些错误消息,比如偏移量等。因为执行flutter analysis 命令时并不会主动去拉取依赖。


对于一次性的Dart分析,直接使用flutter analyze --flutter-repo即可,对于连续分析,则可以使用flutter analyze --flutter-repo --watch命令。如果你想知道多少个成员变量丢失了dartdocs,可以添加一个dartdocs参数。


Flutter inspector 工具

Flutter inspector 是分析Flutter组件状态树的利器,Flutter使用小部件来控制页面组件到布局的精准控制,Flutter inspector 可以帮助我们进行如下一些分析。


进行布局分析,理解布局层次

诊断布局问题

在这里插入图片描述


在调试模式下,我们点击Android Studio右边Flutter inspector按钮即可开启Flutter inspector分析,Flutter inspector提供了如下的可视化调试工具。

在这里插入图片描述


Select widget mode:启用此按钮后,选择组件树的代码会自动跳转到对应的源代码里面。

Refresh tree : 重新加载的组件信息。

Slow Animations:放慢动画速度,以便进行视觉上的查验。

Debug Paint: 边框、方向的可视化。

Paint Baselines: 每个渲染框在它的每个文本基线上画一条线。

Repaint Rainbow:查看重绘的严重程度,严重的会被爆红。

除了上面的功能外,我们还可以点击【Open DevTools】打开Flutter的调试页面,可以借助它进行很多性能分析,后面会具体介绍。

在这里插入图片描述


测量应用启动时间

要收集有关 Flutter 应用程序启动所需时间的详细信息,可以在运行 flutter run 命令时使用 trace-startup 和 profile 选项,如下所示。


flutter run --trace-startup --profile

跟踪输出被保存到 Flutter 工程目录在 build 目录下,一个名为 start_up_info.json 的 JSON 文件中,输出列出了从应用程序启动到这些跟踪事件(以微秒捕获)所用的时间,如下所示。


{

 "engineEnterTimestampMicros": 2346054348633,

 "timeToFrameworkInitMicros": 812748,

 "timeToFirstFrameRasterizedMicros": 1573154,

 "timeToFirstFrameMicros": 1221472,

 "timeAfterFrameworkInitMicros": 408724

}

对应的具体含义如下:


进入 Flutter 引擎时

展示应用第一帧时

初始化Flutter框架时

完成Flutter框架初始化时

使用Android Studio进行调试

Flutter官方推荐使用Android Studio或VSCode进行应用开发, 和其他语言的调试一样,Dart代码的调试流程也差不多。如果还没有Flutter项目,可以新建一个示例项目。通过单击首先,点击调试图标(Debug-run icon)同时打开调试面板并在控制台中运行应用,首次运行应用是最慢的,应用启动后,界面应该是下面这样的。

在这里插入图片描述


然后,我们在在 counter++ 这一行上添加断点。在应用里,点击 + 按钮(FloatingActionButton,或者简称 FAB)来增加数字,应用会暂停。

在这里插入图片描述


你可以 step in/out/over Dart 语句、热重载和恢复执行应用、以及像使用其他调试器一样来使用 Dart 调试器。


Flutter inspector

Flutter inspector 是一个用来可视化以及查看 Flutter widget 树的工具,提供如下功能:


了解现有布局

诊断布局问题

可以使用 Android Studio 窗口右侧的垂直按钮来打开Flutter inspector,如下图所示。


在这里插入图片描述


Flutter outline

Flutter Outline 是一个可视的显示页面构建方法的功能,注意在构建方法上可能与 widget 树不同,可以使用 Android Studio 窗口右侧的垂直按钮切换 outline 的显示。

在这里插入图片描述


Tip: 我们可以安装一个 Presentation Assistant 插件来辅助我们进行开发,Presentation Assistant 提供了很多的快捷功能。例如,当焦点在编辑面板中时,输入 command-Shift-A(Mac)或者 shift-control-A(Windows 和 Linux),该插件会同时显示「查找」面板并显示在所有三个平台上执行此操作的提示。

在这里插入图片描述


然后在输入框中输入attach关键字,显示如下图。


在这里插入图片描述


使用 Android Gradle 调试

为了调试原生代码,你需要一个包含 Android 原生代码的应用。在本节中,你将学会如何连接两个调试器到你的应用:

1)Dart 调试器。

2)Android Gradle 调试器。


创建一个基本的 Flutter 应用,然后替换 lib/main.dart 的代码为以下示例代码。


// Copyright 2017 The Chromium Authors. All rights reserved.

// Use of this source code is governed by a BSD-style license that can be

// found in the LICENSE file.


import 'dart:async';


import 'package:flutter/material.dart';

import 'package:url_launcher/url_launcher.dart';


void main() {

 runApp(MyApp());

}


class MyApp extends StatelessWidget {

 @override

 Widget build(BuildContext context) {

   return MaterialApp(

     title: 'URL Launcher',

     theme: ThemeData(

       primarySwatch: Colors.blue,

     ),

     home: MyHomePage(title: 'URL Launcher'),

   );

 }

}


class MyHomePage extends StatefulWidget {

 MyHomePage({Key key, this.title}) : super(key: key);

 final String title;


 @override

 _MyHomePageState createState() => _MyHomePageState();

}


class _MyHomePageState extends State<MyHomePage> {

 Future<void> _launched;


 Future<void> _launchInBrowser(String url) async {

   if (await canLaunch(url)) {

     await launch(url, forceSafariVC: false, forceWebView: false);

   } else {

     throw 'Could not launch $url';

   }

 }


 Future<void> _launchInWebViewOrVC(String url) async {

   if (await canLaunch(url)) {

     await launch(url, forceSafariVC: true, forceWebView: true);

   } else {

     throw 'Could not launch $url';

   }

 }


 Widget _launchStatus(BuildContext context, AsyncSnapshot<void> snapshot) {

   if (snapshot.hasError) {

     return Text('Error: ${snapshot.error}');

   } else {

     return Text('');

   }

 }


 @override

 Widget build(BuildContext context) {

   String toLaunch = 'https://flutter.dev';

   return Scaffold(

     appBar: AppBar(

       title: Text(widget.title),

     ),

     body: Center(

       child: Column(

         mainAxisAlignment: MainAxisAlignment.center,

         children: <Widget>[

           Padding(

             padding: EdgeInsets.all(16.0),

             child: Text(toLaunch),

           ),

           RaisedButton(

             onPressed: () => setState(() {

                   _launched = _launchInBrowser(toLaunch);

                 }),

             child: Text('Launch in browser'),

           ),

           Padding(padding: EdgeInsets.all(16.0)),

           RaisedButton(

             onPressed: () => setState(() {

                   _launched = _launchInWebViewOrVC(toLaunch);

                 }),

             child: Text('Launch in app'),

           ),

           Padding(padding: EdgeInsets.all(16.0)),

           FutureBuilder<void>(future: _launched, builder: _launchStatus),

         ],

       ),

     ),

   );

 }

}

然后,添加 url_launcher 依赖到 pubspec 文件,并执行 flutter pub get命令拉取依赖包。


name: flutter_app

description: A new Flutter application.

version: 1.0.0+1


dependencies:

 flutter:

   sdk: flutter


 url_launcher: ^3.0.3

 cupertino_icons: ^0.1.2


dev_dependencies:

 flutter_test:

   sdk: flutter

点击调试按钮(Debug-run icon)来同时打开调试面板并启动应用,如下图所示。

在这里插入图片描述


点击 【Attach debugger to Android process】 按钮,从进程对话框中,你应该可以看到每一个设备的入口。选择 show all processes 来显示每个设备可用的进程。

在这里插入图片描述


在调试面板中,你现在应该可以看到一个 Android Debugger 标签页,然后依次选择【app_name】 > 【android】 > 【app】 > 【src】 >【 main】 > 【java】 > 【io.flutter plugins】在项目面板,然后双击 GeneratedProjectRegistrant 在编辑面板中打开 Java 代码,此时Dart 和原生调试器都在与同一个进程交互。

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

日历

链接

个人资料

蓝蓝设计的小编 http://www.lanlanwork.com

存档