微信读书交互重设计

微信读书交互重设计,第1张

前言:正如微信读书的官宣——让阅读不再孤单。微信读书延续了微信一贯的社交性 ,弱化了电商属性的书城,更多聚焦于认真读书、发现好书以及读书樱空交流方面。在众多读书APP中,像一股清流,没有太浓的商业气息。界面简约清爽, *** 作简单。当然也存在书籍太少等问题,该问题不在本次设计范围内。本文将从一些交互细节对微信读书进行重设计。

软件版本:微信读书2.2.0

使用设备:iphone7

*** 作系统:ios11.1.1

体验时间:2017-11-22

以下为微信读书的结构框架图:

1、 *** 作按钮位置混乱。最下面的 *** 作栏顺序不是很合理,建议将删除调至最左边,私密阅读在中间,移动在最右边,比较符合直觉的 *** 作习惯。

用户可以对在架书籍进行自定义分组,其中“归档”是默认的分组,可以往分组里添加书籍。如图,当分组内没有书籍时,右上角是“修改分组”,里面的 *** 作包括“修改分组名”和“删除分组”。当分组内有书籍时,右上角是“编辑”,点击以后变成左上角“修改分组”、右上角“取消”。但从书架页面(第一张图)可以看到,点击编辑后,左上角变为取消。 即按钮的位置是不规律的笑族,不符合尼尔森有用性原则中的一致性原则。

建议将分组的“修改分组”与“取消”交换位置,就会与之前的 *** 作位置相一致,避免用户产生困惑和误 *** 作。

除此之外,想要分组书籍,只能通过“书架-编辑-移动”,建议可以在分组内直接添加书籍,点击添加,打开书架内未分组的图书,通过勾选加入此分组。

修改后如下图所示:

2、发现页右上角的FM42|3入口不是很明显,看上去像是个标签或者logo,并且,大部分用户不知道FM42|3的含义(包括本人)。建议修改为一个icon,让人明白是可点击的,然后里面的内容是一些电台节目。

3、读书界面按钮太多,显得很杂乱。如图,当电台在播放时,可以看到z轴悬浮3个按钮,同时页眉与页脚分别有4个按钮,且一些按钮展开后还有更多功能。面对这么多的按钮,有一些按钮还难以区分,用户使用起来成本较高,这时需要更清晰的逻辑。

首先将读书页面的所有功能整理如下:

改进意见:

a、“语音朗读 ”和“听书 ”这两个功能会使人困惑。笔者一开始误以为是同一个功能,后来发现语音朗读只是对文章的朗读,而听书是语音书评。这两个按钮在同一页面放开很容易混淆,合并在一起性质又不一样。对此,笔者认为可以将听书功能与文字书评合并,都是书评,只不过形式有所差异(一个文字、一个语音)。从而使“语音朗读”和“听书”不在同一个层级呈现,避免误解。

文字书评是通过“相关想法”功能实现的,“相关想法”入口较深,被收在读书界面右上角的“更多”里。“相关碰颂弊想法”包括精彩想法和好友想法,其中精彩想法是按章节顺序呈现的,如图。

将“相关想法”功能与“听书”功能结合,笔者对页面进行重设计如下图所示。新功能命名为“书评”,点击进入有三大模块“听书”、“精彩想法”和“点评书籍”,听书页面与原页面相似;精彩想法包括好友想法和网友想法。相比现有内容以瀑布流为呈现方式,笔者将内容进行了归类:好友想法在页面最上方,出现一条,剩余的可以点击展开箭头查看更多;网友想法按照文章章节划分,每一章呈现5~10条想法,同样可以查看更多 。“点评书籍”是对全书的点评,并可以给书籍打分,按钮在页面右上角。未点评状态时为黄色,点击进入评价;如果已点评,按钮将变灰,可点击,点击后显示“我”的评价。

b、“今天一起阅读本书的人 ”功能其实类似bilibili的当前共同观看人数。但bilibili仅仅是提供了人数,没有细致到个人信息,而微信读书则是有更浓的社交意味。页面内包括“书友”的个人信息、阅读时长、笔记、读书进度以及关于本书的想法。设想微信读书是希望能通过共同阅读来促进交友,再从社交中促进读书。

可以看到,该功能与“相关想法”功能有些重复,微信读书的做法是把“相关想法 ”收在“更多”里。而经过a中的改造,“相关想法”也就是“书评”的功能点增加了,不适合再被收起。此时将作为一个独立的按钮与“今天一起阅读本书的人 ”共同出现在一级页面。所以功能重复的问题就要用其他方式解决。

两者重复的地方主要在“想法”上,“今天一起阅读本书的人 ”有关于本书的想法,“相关想法”则更是想法的聚集地,这样重复显得臃肿多余。

但进一步分析可知,“今天一起阅读本书的人 ”和“书评”功能侧重点不同,“今天一起阅读本书的人 ”侧重于人,“书评”侧重于评论。所以可以通过弱化“今天一起阅读本书的人 ”中关于想法的部分。具体实现方法是在“今天一起阅读本书的人 ”页面隐藏“关于本书的想法”,然后用户可以通过点击名片进入个人主页查看他人相关想法。

c、当前页脚有4个按钮,分别是抽屉式导航入口、进度条、亮度模式、字体。亮度模式和字体都是对阅读体验的调整,可以整合到一起。这样可以腾出位置放置“书评”功能。进度条使用频率相对较高,可以直接显示出来。最终页脚改进如下:左下角为目录、书签、划线等功能的抽屉式导航入口,调整亮度、颜色、字体、字号统一放在一个按钮内,“书评”功能放置在右下角,进度条直接显示于三个按钮上方。

结合以上修改意见,读书界面的最终结构框架如图所示:

(更多中的功能除了“相关想法”被挪出以外,其他功能仍保留,这是为了防止例如“点评书籍”、“书籍详情”一类功能入口太深,降低可用性而做的保险措施。)

4、微信读书支持纯划线摘录,或者划线摘录并写想法。划线可以在抽屉式导航中找到,如图(左),但是没有列出相应划线的想法。这点掌阅做的比较好,把划线和想法都罗列出来,让用户可以轻松看到自己对该书的所有想法,用户体验更好,如图(右)。

5、微信读书可以丰富一些手势 *** 作。如图为多看阅读的多种手势 *** 作,下拉:添加书签;上拉:关闭图书;双指左/右滑动:打开/关闭抽屉式导航。

6、语音朗读时不能通过点击任意某句话开始播放,只能拖动进度条,而进度条不够准确。可以参考音乐播放器中点击相应歌词直接从该句歌词开始播放的形式,长按某段文字直接从该段文字开始朗读。

7、掌阅写想法可以“所有人可见”,也可以“仅自己可见”。而微信阅读个人想法不能选择“仅自己可见”(私密阅读的想法是私密的,但公开阅读的想法无法进行隐私设置),需要改进。

8、笔者发现,阅读时选中一段小于14字的文字会跳出如图左所示功能条,包括复制、划线、写想法、查词典、分享和纠错。而当选中一段大于等于14字的文字时会出现如图右所示功能条,包括复制、划线、写想法、录音、分享和纠错。也就是说字少时是查词典、字多时是录音。这种设计应该是考虑到查字典时通常是查字词,所以字数较少。而录音通常需要录比较长的句子。但是这样的智能切换在实际 *** 作中容易出现问题,比如一段话刚好只有13个字,那就不能录音了?所以建议按钮上都呈现出来,即选中文字后跳出功能条,包括复制、划线、写想法、查词典、录音、分享和纠错7个按钮。

9、掌阅自定义设置较多,比如可以设置行间距、翻页方式、护眼模式等,但这些属于比较次要的功能,微信读书可以在满足产品大方向的前提下逐渐完善。

10、从产品角度看, 微信读书定位于读书社交,但目前做的远远不够。仅仅是分享想法和好友关注,还没有涉及到读书群的概念。比如可以开设作者专栏,建立一个由作者为导向的兴趣社群,书迷们可以在社群内互动,交流读书心得,甚至可以逐步发展线下活动。当然,这也是要看微信读书的产品定位的,暂时是笔者一个不成熟的设想。

欢迎批评指正,欢迎补充!

121图书网是以二手书为主的电子商务交易平台,为我们提供了一个获得商机的渠道。

而且121图书网拥有校园专区面对全国的大学生,并得到他们的裂族支持,发展潜力无限!

如果你买不到新书,那乱信请去121图哗源轮书网!

如果你手中有闲置的书,那也请去121图书网!

从零开始学Java,本来利用数组只在一个界面就可以实现增删改查功能,学到接口后觉得实现分离效果会更好一些!所以进行了尝试,将管理员和用户中的图书查询,登录,图书出库合并在一起写了一个接口,用户类和管理员类实现这个接口!图书类写了一个抽象类里面都是一些图书的属性,用户类管理员类对图书类进行 *** 作。

具体实现如下:

接口:存在三种方拆颤樱法  用户类和管理员类去实现这个接口,并实现着里面的方法

[java] view plain copy

public interface Person {

public boolean login(String user,String pwd)   //登录方法

public void search()  //查询方法

public void reduce(String s,int i)  // 图书出库

}

用户类:  实现接口,里面都是用户的方法,在测试类里调用这些方法实现其功能

[java] view plain copy

import java.util.ArrayList

import java.util.Iterator

import java.util.List

public class User implements Person{

private final String user = "user"

private final String pwd  = "user"

List list = new ArrayList()

public void addBook(Book book){     //增加图书

list.add(book)

}

public boolean login(String user, String pwd) {    //登录方法

if(this.user.equals(user) &&this.pwd.equals(pwd)){

return true

}

return false

}

@Override

public void reduce(String s, int i) {            //结账

Iterator it = list.iterator()

while(it.hasNext()){

Book b = (Book)it.next()

if(b.getNum().equals(s)){

if(b.getCount() >= i){

int m = b.getCount()-i

b.setCount(m)

System.out.println("你的图书总价旅丛为:"洞孙+(b.getPrice()*i))

}else

System.out.println("你输入的书本数目超出了当前库存!")

}else{

System.out.println("没找到,你要加入的图书!")

}

}

}

@Override

public void search() {                          //查询图书当前情况

Iterator it = list.iterator()

while(it.hasNext()){

Book b = (Book)it.next()

System.out.println(b.getNum()+"\t"+b.getName()+"\t"

+b.getAnthor()+"\t"+b.getFromTime()

+"\t"+b.getPrice()+"\t"+b.getCount())

}

}

}

[java] view plain copy

</pre><pre name="code" class="java"><span style="font-size:18px">管理员类:   实现接口,里面都是管理员的方法,在测试类里调用这些方法实现其功能</span><span style="font-size:18px"></span>

[java] view plain copy

<span style="font-size:18px">

</span>

[java] view plain copy

package com.pv1

import java.util.*

public class Admin implements Person {

private final String user = "admin"

private final String pws = "admin"

List list = new ArrayList()

public boolean login(String user, String pwd) { // 登录方法

if (this.user.equals(user) && this.pws.equals(pwd)) {

return true

}

return false

}

public void addBook(Book book) { // 增加图书

list.add(book)

}

public void search() { // 查询方法

Iterator it = list.iterator()

while (it.hasNext()) {

Book b = (Book) it.next()

System.out.println(b.getNum() + "\t" + b.getName() + "\t"

+ b.getAnthor() + "\t" + b.getFromTime() + "\t"

+ b.getPrice() + "\t" + b.getCount())

}

}

public void reduce(String num, int i) { // 图书出库

for (int j = 0 j < list.size() j++) {

Book b = (Book) list.get(j)

if (b.getNum().equals(num)) {

if (b.getCount() >= i) {

int m = b.getCount() - i

b.setCount(m)

System.out.println("取出成功!现在此书库存为:" + m)

j--

break

} else

System.out.println("你输入的书本数目超出了当前库存!")

}

if (j == list.size()) {

System.out.println("没找到,你要加入的图书!")

}

}

}

public void increase(String num, int i) { // 图书入库

for (int j = 0 j < list.size() j++) {

Book b = (Book) list.get(j)

if (b.getNum().equals(num)) {

if (i < 0) {

System.out.println("你加入的图书数目不合法!")

} else {

int m = b.getCount() + i

b.setCount(m)

}

}

if (j == list.size()) {

System.out.println("没找到,你要加入的图书!")

}

}

}

public void delete(String num) {       //删除提供编号的图书

int j = 0

for (j = 0 j < list.size() j++) {

Book b = (Book) list.get(j)

if (b.getNum().equals(num)) {

list.remove(b)

System.out.println("删除成功!")

j--

break

}

}

if (j == list.size()) {

System.out.println("未找到你要删除的图书!请确认编号后再删")

}

}

public boolean guanSearch(String num){

for (int j = 0 j < list.size() j++) {

Book b = (Book) list.get(j)

if (b.getNum().equals(num)) {

return true

}

}

return false

}

public void guan(String num, String name, String auther, String date,

double price, int count) {            // 修改提供编号的图书

int j = 0

for ( j = 0 j < list.size() j++) {

Book b = (Book) list.get(j)

if (b.getNum().equals(num)) {

b.setAnthor(auther)

b.setCount(count)

b.setFromTime(date)

b.setName(name)

b.setPrice(price)

break

}

}

}

}

图书类:抽象类,里面全部是属性,方便用户管理员对其 *** 作。

[java] view plain copy

package com.pv1

import java.util.*

public class Book {

private String num 

private String name

private String anthor

private String fromTime

private double price

private int count

public String getNum() {

return num

}

public void setNum(String num) {

this.num = num

}

public String getName() {

return name

}

public void setName(String name) {

this.name = name

}

public String getAnthor() {

return anthor

}

public void setAnthor(String anthor) {

this.anthor = anthor

}

public String getFromTime() {

return fromTime

}

public void setFromTime(String fromTime) {

this.fromTime = fromTime

}

public double getPrice() {

return price

}

public void setPrice(double price) {

this.price = price

}

public int getCount() {

return count

}

public void setCount(int count) {

this.count = count

}

}

测试类:

[java] view plain copy

package com.pv1

import java.util.*

public class BookTest {

public static void main(String[] args) {

Scanner input = new Scanner(System.in)

Book bo = new Book()           //在开始时加入一本图书,所用对象

Book bo1 = null       //循环加入图书建立的对象,开始设成空,防止加入图书时被覆盖

List list = new ArrayList()   //建立一个集合,存储管理员要添加的图书信息的对象

Admin ad = new Admin()      //建立管理员对象,管理员 *** 作时调用管理员类中对象

User us = new User()        //建立用户对象,管理员 *** 作时调用用户类中对象

boolean ad1 = true         //接受进入管理员 *** 作界面的返回值

boolean us1 = true         //接受进入用户 *** 作界面的返回值

bo.setAnthor("刘冰")        //书籍为空,加入一本图书

bo.setCount(20)

bo.setNum("1001")

bo.setName("一本道")

bo.setFromTime("2015-2-50")

bo.setPrice(250.0)

ad.addBook(bo)                //通过对象传递在管理员类中加入一本图书

us.addBook(bo)

System.out.print("请输入用户名:")  //用户输入 用户名 密码

String user = input.next()

System.out.print("请输入密码:")//

String pwd = input.next()

ad1 = ad.login(user, pwd)  //将 用户名 密码 传入管理员类中进行判断返回Boolean类型接受

us1 = us.login(user, pwd)  //将 用户名 密码 传入用户类中进行判断返回Boolean类型接受

if (ad1) {          //如果管理员类返回true进入   管理员 *** 作界面

System.out.println("图书编号\t" + "书名\t" + "作者\t" + "出版日期\t" + "\t价格\t"

+ "库存")

ad.search()

while (true) {

bo1 = new Book()

System.out.println("1.查询 2.图书入库 3.图书出库 "

+ "4.新增图书 5.修改 6.删除 7.退出\t请输入您的选择:")

int xuan = input.nextInt()

switch (xuan) {

case 1:

System.out.println("图书编号\t" + "书名\t" + "作者\t" + "出版日期\t"

+ "价格\t" + "库存")

ad.search()

break

case 2:

System.out.print("请输入你想入库的图书编号:")

String num = input.next()

System.out.print("请输入你想添加本图书的数量:")

int cou = input.nextInt()

ad.increase(num, cou)

break

case 3:

System.out.print("请输入你想取出的图书编号:")

num = input.next()

System.out.print("请输入你想取出图书的数量:")

cou = input.nextInt()

ad.reduce(num, cou)

break


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11968688.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存