<ignore_js_op>
<ignore_js_op>
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
var viewshower = ui("viewshower");
var page = sm("do_Page");
// 为viewshower增加4个子页面viewshower.addViews([ { id : "chats",// 页面的标示
}, { id : "contacts",
}, { id : "discover",
}, { id : "me",
} ]);// 初始化先显示第一个页面viewshower.showView("chats");
var button1 = ui("do_Button_1");
button1.on("touch", function() {
viewshower.showView("chats");
});var button2 = ui("do_Button_2");
button2.on("touch", function() {
viewshower.showView("contacts");
});var button3 = ui("do_Button_3");
button3.on("touch", function() {
viewshower.showView("discover");
});var button4 = ui("do_Button_4");
button4.on("touch", function() {
viewshower.showView("me");
}); |
-------------------------------------------------------------
这一节主要是完成底部导航栏的实现。
0. 我们首先来分析一下界面效果图和设计图
<ignore_js_op>
4. 修改index.ui.js,添加代码主要是在底部bottom bar切换按钮的时候修改所有图标的颜色和字的前景色。
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
var button1 = ui("do_Button_1");
var imageview1 = ui("do_ImageView_1");
var label1 = ui("do_Label_1");
button1.on("touch", function() {
showView("chats");
});var button2 = ui("do_Button_2");
var imageview2 = ui("do_ImageView_2");
var label2 = ui("do_Label_2");
button2.on("touch", function() {
showView("contacts");
});var button3 = ui("do_Button_3");
var imageview3 = ui("do_ImageView_3");
var label3 = ui("do_Label_3");
button3.on("touch", function() {
showView("discover");
});var button4 = ui("do_Button_4");
var imageview4 = ui("do_ImageView_4");
var label4 = ui("do_Label_4");
button4.on("touch", function() {
showView("me");
});function showView(name) {
viewshower.showView(name);
if (name == "chats") {
label1.fontColor = "09BB07FF";
} else {
label1.fontColor = "9F9F9FFF";
}
if (name == "contacts") {
label2.fontColor = "09BB07FF";
} else {
label2.fontColor = "9F9F9FFF";
}
if (name == "discover") {
label3.fontColor = "09BB07FF";
} else {
label3.fontColor = "9F9F9FFF";
}
if (name == "me") {
label4.fontColor = "09BB07FF";
} else {
label4.fontColor = "9F9F9FFF";
}
} |
到此为止,底部导航栏基本实现完成,这一节比较简单,主要是一些细致的ui拖拽调整。我们用调试版本看一下Android,iOS的效果都非常不错。源代码下载
我们开始实现ViewShower的第一页主体内容.
---------------------------------------------------------------------------------------
接上一节 底部导航 ,我们这一节主要是完成微信4个主页面的第一个页面“微信”页面,这一节内容比较多,我们分多个跟帖来完成
0 老规矩,先分析一下UI,由三个大部分组成,系统状态栏,工具栏和微信聊天记录列表。
<ignore_js_op>transparent表示页面从屏幕最顶端开始绘制。
|
1
2
3
4
5
6
7
8
9
|
var d1 = require("deviceone");
var app = d1.sm("do_App");
app.on("loaded", function() {
this.openPage({
statusBarState : "transparent"
});
});
|
再来看看真机效果图:
<ignore_js_op>
3. 主体部分是一个do_ListView,接下来设置ListView的cell和数据。
ListView的cell指列表框的每一行,比如ListView有100行数据,实际上可见的屏幕永远只能看到8,9行左右,所以我们手势上下滑动的时候并没有创建100行,而是重复使用这8,9行,只不过替换里面的数据而已。我们称之为行模板,在DeviceOne里这种模板也是一个ui文件,比如这里我们在chats子目录下新建一个chat_cell.ui,这个ui基本界面如下:
<ignore_js_op>
对应的映射关系的代码在chat_cell.ui.js如下,我们可以看到映射关系的左边是组件id.组件属性名,右边是数据JSON的key名称:
|
01
02
03
04
05
06
07
08
09
10
11
12
|
//related to chat_cell.uivar root = ui("$");;//$是这个ui文件根节点组件的通配符,如果指定组件的id,也可以用id来获取对象
root.setMapping({ "photo_imageview.source" : "photo",
"name_label.text" : "name",
"lastmessage_label.text" : "lastmessage.message",
"lasttime_label.text" : "lastmessage.time",
"unread_label.visible" : "unread",
"unread_label.text" : "unread-count",
"name_label.fontColor" : "isgroup",
}); |
对应的数据本应该是第一次运行从网络上获取之后再缓存到本地的,我们是模拟,所以先手动生成一个文件到data/chats/chat.json
<ignore_js_op>注意:chat_cell.ui存储在source/default/view/chats/chat_cell.ui,但是source://的根节点指的是 source/default/目录
在index.ui.js里添加绑定数据的代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
//related to index.uivar storage = sm("do_Storage");
var listdata = mm("do_ListData");
var listview = ui("listview");
if (storage.fileExist(json_path)) {
storage.readFile(json_path, function(data, e) {
//deviceone.print(JSON.stringify(data));
listdata.addData(data);
listview.bindItems(listdata);
listview.refreshItems();
})
}var page = sm("do_Page");
page.on("loaded",function(){
//这个页面加载完显示出来后触发这个事件
//我们可以在这个事件里去获取最新的网络数据,来更新listview和data/chats/chat.json
}); |
我们在真机上看看效果
<ignore_js_op>API文档
* ImageView也是圆角的,圆角通常可以使用border属性来设置,但是android只有ImageView不能通过border来设置圆角,ImageView还有一个专有属性radius来设置Android才有效,这个我们以后可以改进
5. 处理右上角的add按钮,点击弹出菜单
先给右上角ImageView的enable属性设置为true,才可以处理点击事件,在chats/index.ui.js里添加代码
|
01
02
03
04
05
06
07
08
09
10
|
var add_button = ui("add_imageview");
add_button.on("touch", function() {
var menu = ui("menu_id");
if (menu) {//如果已经add过,就只是让这个view显示,而不是add一个新的
if (menu.visible == false)
menu.visible = true;
} else {
}
}); |
其中chat_add_menu.ui 是弹出的菜单对应的ui文件,这个ui文件的根节点大小和chat/index.ui一样,这样确保我点击任何空白处都可以关闭这个菜单(实际上是隐藏这个菜单),我们在这个ui文件里把对应的布局都拖拽好,其中需要添加4个资源png文件。
这里有个小技巧,顶部的三角形标记只能通过一个ImageView加载一个三角形图标来实现。
<ignore_js_op>我们再给chat_add_menu的根节点添加点击事件,点击的时候把自己隐藏,在chat_add_menu.js
|
1
2
3
4
|
var root = ui("$");
root.on("touch",function(){
root.visible = false;
}); |
最后我们先看看真机效果,点击加号弹出菜单,点击任何地方都把菜单隐藏。
<ignore_js_op>那几个页面基本完成后再重新回到这一个页面来细琢。
再附上最新代码zip,源代码也提交到GIT服务上了https://github.com/do-project/Fake-Weixin