[Ionic 2从入门到精通] 5.3 布局

我发现制作一个应用最好从基础布局开始 -- 他基本可以看作是线图联系,帮助固化应用的需求。我们这个应用的布局没啥特别的东西,但是有一个需要添加的用户界面元素需要一点点技巧。
我们这个应用有两个页面,主页和滑页,本课中将会制作他们的模板。滑页非常简单,所以本课的大部分都是关于主页的。

Home页

主页有一个用户拍的照片的列表,用户可以在其中删除它们,一个拍新的照片的选项(只有在当日没拍的情况下),一个展示图片滑页的选项。效果图上这样的:

4.4.1.jpg

这个布局最有技巧性的是顶部的“SMILE!”图片,实际上是一个按钮,用于拍照的按钮,同时,他也只会在用户当日没有拍照的情况下才显示。如果用户当日没有拍照的话就不会显示的。
我们先从基础布局入手,然后看怎么实现拍照按钮。
> 修改src/pages/home/home.html 为如下:

<ion-header>
<ion-navbar color="danger">
<ion-title>
<img src="assets/images/logo.png" />
</ion-title>
<ion-buttons end>
<button ion-button icon-only (click)="playSlideshow()"><ion-icon name="play"></ion-icon></button>
</ion-buttons>
</ion-navbar>
</ion-header>
<ion-content>
<ion-list>
<ion-item-sliding>
<ion-item>
<img src="http://placehold.it/100x100" />
<ion-badge item-right light>0 days ago</ion-badge>
</ion-item>
<ion-item-options>
<button ion-button icon-only light (click)="removePhoto(photo)"><ion-icon name="trash"></ion-icon></button>
</ion-item-options>
</ion-item-sliding>
</ion-list>
</ion-content>

我们把这个模板打碎来讲解。模板的第一个部分是导航条:

<ion-navbar color="danger">
<ion-title>
<img src="assets/images/logo.png" />
</ion-title>
<ion-buttons end>
<button ion-button icon-only (click)="playSlideshow()"><ion-icon name="play"></ion-icon></button>
</ion-buttons>
</ion-navbar>

ion-navbar 允许我们添加一个页首条到我们的应用顶部用于持有按钮,标题,甚至在需要的时候直接整合Ionic导航系统来展示一个回退按钮。
我们给navbar添加了danger属性将他样式化到我们的danger颜色,这个颜色变了色在variables.scss中定义的(后续会配置)。
在navbar中我们用到了ion-title,基本就是用来展示当前页面的文本标题和logo的。同时我们也用到了ion-buttons来创建按钮。通过指定end属性,所有按钮将被排列在右边,当我们指定的是‘start’属性的时候,将会从左边开始排列。
最后,我们将所有按钮列入ion-buttons中。这个按钮用到了一个play图标,有一个点击处理器,处理器将调用home.ts文件里的playSlideshow()函数(这个函数当前未创建)。
模板接下来的部分是内容部分,包括了一个列表:

<ion-content>
<ion-list>
<ion-item-sliding>
<ion-item>
<img src="http://placehold.it/100x100" />
<ion-badge item-right light>0 days ago</ion-badge>
</ion-item>
<ion-item-options>
<button ion-button icon-only color="light" (click)="removePhoto(photo)"><ion-icon name="trash"></ion-icon></button>
</ion-item-options>
</ion-item-sliding>
</ion-list>
</ion-content>

在看列表之前,我们看到所有东西都被包围在ion-content里 -- 这就是页面主体内容展示的地方,在大部分情况下除了导航条外的所有内容都要放在这里。
跟一个普通列表其实也差不多,看:

<ul>
    <li></li>
    <li></li>
    <li></li>
</ul>

Ionic里面创建列表的方式基本一样:

<ion-list>
    <ion-item></ion-item>
    <ion-item></ion-item>
    <ion-item></ion-item>
</ion-list>

当然,我们的看起来稍微复杂点,所以我们还是来研究研究。首先与常理不一样的是我们在ion-list加入了no-lines属性。就像给navbar添加的danger属性一样,这个属性会对我们的列表起作用,他会使列表项不显示边缘。
接下来的变得多一点技巧性,也就是我们设置滑动项的地方。一个<ion-sliding-item>,和普通的<ion-item>不同,他有两套内容 -- 列表项本身,然后是<ion-item-options>在用户滑动的时候可见。
第一部分<ion-sliding-item>内的代码是普通的<ion-item>定义。项里面是用户拍的照片(我们最后还是会循环所有相片),但是现在我们只是用了个图片占了个位置。我们也在项的右边添加了一个勋章用于展示这个照片上多久之前拍的。我们现在用的都是假数据,后面再用真数据。
最后,我们来到了代码的第二部分,<ion-item-options>,仅用来展示活动展示的内容。当前应用中,我们只是添加了一个‘Delete’按钮,当点击他的时候会传入当前照片的引用。现在传入的photo引用不会有实际效果(调用的函数也不会有效果因为都没创建呢),稍后制作相片循环的时候我们在讨论如何建立这个应用。
现在,我们来添加之前讲到的那个条件照片按钮。
> 修改 src/pages/home/home.html 的 content 部分为如下:

<ion-content>
   <ion-list>
       <button ion-item *ngIf="!photoTaken" detail-none (click)="takePhoto()">
           <img src="assets/images/smile.png" />
       </button>
       <ion-item-sliding>
           <ion-item>
               <img src="http://placehold.it/100x100" />
               <ion-badge item-right light>0 days ago</ion-badge>
           </ion-item>
           <ion-item-options>
               <button ion-button icon-only color="light" (click)="removePhoto(photo)"><ion-icon name="trash"></ion-icon></button>
           </ion-item-options>
       </ion-item-sliding>
   </ion-list>
</ion-content>

注意,我们在列表里的滑动选项上面加入了一个新的项,但是我们不是直接用的<ion-item>而是用的button然后给他使用ion-item指令。在视觉上,这两种方法其实是一样的,但是在移动设备上除了buttona之外的点击处理都会有一点延迟。我们不想要这个延迟,所以我们使用按钮。
由于按钮会默认有自带样式的,而我们这里不想要那些样式,所以我们给他添加了detail-none属性。当然,我们也给他添加了一个点击处理器用于触发后面将会创建的takePhoto函数,但是这里最重要的还是 ngIf 指令。
ngIf 是Angular2提供的条件指令之一,允许我们根据数据改变模板显示。在现在的模板中,含有 ngIf 指令的元素只会在表达式为true的时候才会全部显示。由于我们的表达式是这样的:

*ngIf="!photoTaken"

所以我们的按钮只有在photoTakenfalse的时候才会显示。稍后,我们会在home.ts中创建一个photoTaken变量用于追踪用户当日是否拍照。
现在运行以下命令的话:

ionic serve

会看到如下效果图:

4.4.2.jpg

显然,还有很多事情需要去完成,但是目前我们只需要对主页做这么多就够了,所以,我们继续Slideshow 页。

Slideshow 页

就像我之前说过的那样,slideshow页将会超级简单。他就是一个弹出的模态框展示所有用户拍的照片的滑页。我们只需要为照片提供一个容器,一个按钮来重启滑页和一个按钮来关闭页面就可以了。
> 修改 src/pages/slideshow/slideshow.html 为如下:

<ion-header>
    <ion-toolbar color="danger">
        <ion-title>Play</ion-title>
        <ion-buttons start>
            <button ion-button icon-only (click)="playPhotos()"><ion-icon name="refresh"></ion-icon></button>
        </ion-buttons>
        <ion-buttons end>
            <button ion-button icon-only (click)="closeModal()"><ion-icon name="close"></ion-icon></button>
        </ion-buttons>
    </ion-toolbar>
</ion-header>

<ion-content>
    <div class="image-container">
        <img #imagePlayer id="imagePlayer" src = "" />
    </div>
</ion-content>

你已经知道navbar和按钮咋工作的了,所以唯一的新玩意是图片播放器(image player)。我们只是在内容显示区域添加了一个图片元素。稍后,我们会添加一些代码循环所有用户的照片,通过改变src属性来展示所有照片。我们只要在类里面拿到img的引用就可以了,所以我们创建了一个局部变量 #imagePlayer 这样可以直接在类定义中拿到他了。
目前而言,以上就是我们本课的工作量 -- 告诉过你很简单的。

总结

现在,我们应用的两个页面都设置好了,下节课将会进行一些更有趣的事情。实际上,他可能是最有趣的课程之一,因为我们要学习整合本机Camera API然后用他来拍照。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容