精华内容
下载资源
问答
  • 所以,将视频封面放在了右边,视频标题、主播名称、点赞数放在了左边。当效果图出来时,我第一眼感觉是漂亮,精致,整体效果非常不错。领导看了以后,也觉得视觉效果很棒。于是,效果图一稿便通过审核,步入开发。...
  • 选中设置好的交互数字按键,然后选中【鼠标单击时】的名称,通过右键“复制”,然后将其“粘贴”到其他数字按键中:  6. 同样,将数字按键的【鼠标单击时】交互内容粘贴到退格组合“BackspaceGroup”的交互...

    我想大家可能都试过在使用支付宝或者微信的时候最后都是需要输入密码来进行支付结账的,今天刚好小编学习了如何使用Axure把键盘上的字输进文本框内,由于本人比较懒,本来是想弄一个26字母键盘的,结果还是想想算了,弄一个数字键盘就好了,反正都是一样的=,=,同样的配方,同样的味道,现在就让我们开始吧。

    实现步骤:

    1.在画布中放入一个,导入一张支付页面的背景图,然后大小按照实际自己调整一下;再放入10个矩形做成数字按键;再然后两个灰色矩形和一个图片原件,图片原件导入一张退格键的图标,并与右侧灰色矩形组合到一起,将组合命名为“BackspaceGroup”,如图所示:

               2.在画布中放入6个文本框,调整好位置,将文本框命名为“Password01~Password06”,将6个文本框的类型设置为“密码”,最后,放入一个文本标签,命名为“TempText”,用于保存输入的数字,将这个原件在快捷功能中勾选“隐藏”复选框,将其默认设置为隐藏状态:

              3. 为任意一个数字按键添加【鼠标单击时】的交互;设置条件为“元件文字长度”于元件“TempText”【<】【值】“6”;添加满足条件时的动作为“设置文本”->“TempText”->"值"为“[[Target.text]][[This.text]]”;公式的作用为将目标元件目前的文字后方连接上被单击的数字按键元件上的文字:

               4.继续为数字按键添加【鼠标单击时】的交互;设置动作为“设置文本”于元件“Password01~Password06”,“值”中分别填写“[[t.charAt(5)]]”、“[[t.charAt(4)]]”、“[[t.charAt(3)]]”、“[[t.charAt(2)]]”、“[[t.charAt(1)]]”、“[[t.charAt(0)]]”;公式中的“t”为局部变量,存储的内容为元件“TempText”的元件文字;这一步就通过公式获取了元件“TempText”里面的各个字符,然后,通过动作写入到密码框的各个文本框中:

                 5. 选中设置好的交互数字按键,然后选中【鼠标单击时】的名称,通过右键“复制”,然后将其“粘贴”到其他数字按键中:

                 6. 同样,将数字按键的【鼠标单击时】交互内容粘贴到退格组合“BackspaceGroup”的交互事件【鼠标点击时】中,清除交互条件,修改第一个动作【设置文本】于元件“TempText”中的公式为“[[Target.text.substr(0,Target.text.length-1)]]”;公式的作用是将目标元件目前的文字进行截取,截取的起始位置为第一个字符,截取的长度为目标元件当前文字的长度减1:。如图所示:

             7.点击浏览,就完成了

        原型查看效果地址:https://5zsm88.axshare.com

         原型RP文件下载地址:https://download.csdn.net/download/qq_27884377/10583491

                                        想了解更多Axure资讯,赶快下方扫码加入【Axure修炼手册】微信公众号吧!!!

     

    展开全文
  • 交互论文提纲

    2015-07-12 11:13:35
    交互论文提纲,大概概述,木有实质内容,手机的三维交互模式的研究与实现[这个名称不够具体: 基于手机的景观演示系统交互模式研究与实现] 摘要 1引言:[1,2写的时候尽量跟林业装备结合。要投的期刊也是林业方面的...
  • 前端动画交互

    千次阅读 2019-04-27 10:51:20
    Lottie 是Airbnb开源的一个面向 iOS、Android、React Native 的动画库,能分析 Adobe After Effects 导出的动画,并且能让原生 App 像使用静态素材一样使用这些动画,完美实现动画效果。 现在使用各平台的 native ...

    一、简介

    Lottie 是Airbnb开源的一个面向 iOS、Android、React Native 的动画库,能分析 Adobe After Effects 导出的动画,并且能让原生 App 像使用静态素材一样使用这些动画,完美实现动画效果。

    现在使用各平台的 native 代码实现一套复杂的动画是一件很困难并且耗时的事,我们需要为不同尺寸的屏幕加载不同的素材资源,还需要写大量难维护的代码,而Lottie可以做到同一个动画文件在不同平台上实现相同的效果,极大减少开发时间,实现不同的动画,只需要设置不同的动画文件即可,极大减少开发和维护成本。

    官方效果图:

    img

    img

    二、如何使用

    Lottie支持多平台,使用同一个JSON动画文件,可在不同平台实现相同的效果。

    Android 通过Airbnb的开源项目lottie-android实现,最低支持 API 16;

    IOS 通过Airbnb的开源项目lottie-ios实现,最低支持 IOS 7;

    React Native,通过Airbnb的开源项目lottie-react-native实现;

    img

    这是React logo的动画,以下以Android平台为例如何使用Lottie

    1.下载Lottie

    在项目的 build.gradle 文件添加依赖

    dependencies {  
      compile 'com.airbnb.android:lottie:2.1.0'
    }
    

    2.添加 Adobe After Effects 导出的动画文件

    Lottie默认读取Assets中的文件,我们需要把动画文件react.json 保存在app/src/main/assets文件里。(文件比较大,只展示了部分内容,文件链接

    {
        "v": "4.6.0", 
        "fr": 29.9700012207031, 
        "ip": 0, 
        "op": 141.000005743048, 
        "w": 800, 
        "h": 800, 
        "ddd": 0, 
        "assets": [ ], 
        "layers": [
            {
                "ddd": 0, 
                "ind": 0, 
                "ty": 4, 
                "nm": "center_circle", 
                "ks": {...}, 
                "ao": 0, 
                "shapes": [...], 
                "ip": 0, 
                "op": 900.000036657751, 
                "st": 0, 
                "bm": 0, 
                "sr": 1
            }, 
            {...}, 
            {...}, 
            {...}
        ]
    }
    

    3.使用Lottie

    在布局文件中直接添加Lottie的LottieAnimationView控件,即可在界面显示React logo动画效果

    <com.airbnb.lottie.LottieAnimationView
            android:id="@+id/animation_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:lottie_fileName="react.json"
            app:lottie_loop="true"
            app:lottie_autoPlay="true" />
    

    4.引入Lottie影响

    (1)兼容性

    Lottie 最低支持版本API 16,低版本系统需要做降级动画或者不展示动画

    (2)安装包

    影响项使用前使用后结论
    方法数144807145891增加1084个方法
    安装包大小41969KB42037KB增大68KB

    这是用全民K歌release包的测试数据,lottie本身方法数不小,有方法数超标和安装包过大的风险,业务可自行评估

    注:LottieAnimationView继承于V7的AppCompatImageView,需要引入V7兼容包,根据业务需要,可以源码引入Lottie,让LottieAnimationView继承与ImageView,就不用引入V7兼容包,可减小安装大小。

    三、使用小技巧

    1.加载SDCard动画文件

    StringBuilder stringBuilder = new StringBuilder();
    BufferedReader bufferedReader = new BufferedReader(new FileReader(new File(JSON_PATH + "react.json")));
    String content = null;
    while ((content = bufferedReader.readLine()) != null){
        stringBuilder.append(content);
    }
    JSONObject jsonObject = new JSONObject(stringBuilder.toString());
    animationView.setAnimation(jsonObject);
    animationView.loop(true);
    animationView.playAnimation();
    

    2.加载SDCard图片

    animationView.setImageAssetDelegate(new ImageAssetDelegate() {
        @Override
        public Bitmap fetchBitmap(LottieImageAsset asset) {
            try {
                FileInputStream fileInputStream = new FileInputStream(IMAGE_PATH + asset.getFileName());
                return BitmapFactory.decodeStream(fileInputStream);  ///把流转化为Bitmap图片
            } catch (Exception e) {
                Log.e(TAG, "", e);
            }
            return null;
        }
    });
    

    3.加载SDCard字体

    animationView.setFontAssetDelegate(new FontAssetDelegate(){
        public Typeface fetchFont(String fontFamily) {
            Typeface customFont = Typeface.createFromFile(FONT_PATH + fontFamily);
            return customFont;
        }
    });
    

    4.缓存动画

    /*
    * Lottie内部有两个缓存map(强引用缓存,弱引用缓存),在动画文件加载完成后会根据设置的缓存策略缓存动画,方便下次使用。
    */
    animationView.setAnimation(animation, LottieAnimationView.CacheStrategy.Strong);    //强缓存
    
    animationView.setAnimation(animation, LottieAnimationView.CacheStrategy.Weak);      //弱缓存
    

    四、Lottie实现原理

    img

    设计师把一张复杂的图片使用多个图层来表示,每个图层展示一部分内容,图层中的内容也可以拆分为多个元素。拆分元素之后,根据动画需求,可以单独对图层或者图层中的元素做平移、旋转、收缩等动画。

    Lottie的使用的资源是需要先通过bodymovin( bodymovin 插件本身是用于网页上呈现各种AE效果的一个开源库)将 Adobe After Effects (AE)生成的aep动画工程文件转换为通用的json格式描述文件。Lottie则负责解析动画的数据,计算每个动画在某个时间点的状态,准确地绘制到屏幕上。

    导出的json动画描述文件:

    {
        "v": "4.6.0", 
        "fr": 29.9700012207031, 
        "ip": 0, 
        "op": 141.000005743048, 
        "w": 800, 
        "h": 800, 
        "ddd": 0, 
        "assets": [ ], 
        "layers": [
            {...}, 
        ]
    }
    

    Lottie主要类图:

    img

    图:lottie_class

    Lottie对外通过控件LottieAnimationView暴露接口,控制动画。

    LottieAnimationView继承自ImageView,通过当前时间绘制canvas显示到界面上。这里有两个关键类:LottieComposition 负责解析json描述文件,把json内容转成Java数据对象;LottieDrawable负责绘制,把LottieComposition转成的数据对象绘制成drawable显示到View上。顺序如下:

    img

    1.json文件解析

    LottieComposition负责解析json文件,建立数据到java对象的映射关系。

    (1)解析json外部结构

    LottieComposition封装整个动画的信息,包括动画大小,动画时长,帧率,用到的图片,字体,图层等等。

    json外部结构

    {
        "v": "4.6.0",               //bodymovin的版本
        "fr": 29.9700012207031,     //帧率
        "ip": 0,                    //起始关键帧
        "op": 141.000005743048,     //结束关键帧
        "w": 800,                   //动画宽度
        "h": 800,                   //动画高度
        "ddd": 0, 
        "assets": [...]             //资源信息
        "layers": [...]             //图层信息
    }
    //解析json的源码
    static LottieComposition fromJsonSync(Resources res, JSONObject json) {
          Rect bounds = null;
          float scale = res.getDisplayMetrics().density;
          int width = json.optInt("w", -1);
          int height = json.optInt("h", -1);
    
          if (width != -1 && height != -1) {
            int scaledWidth = (int) (width * scale);
            int scaledHeight = (int) (height * scale);
            bounds = new Rect(0, 0, scaledWidth, scaledHeight);
          }
    
          long startFrame = json.optLong("ip", 0);
          long endFrame = json.optLong("op", 0);
          float frameRate = (float) json.optDouble("fr", 0);
          String version = json.optString("v");
          String[] versions = version.split("[.]");
          int major = Integer.parseInt(versions[0]);
          int minor = Integer.parseInt(versions[1]);
          int patch = Integer.parseInt(versions[2]);
          LottieComposition composition = new LottieComposition(
              bounds, startFrame, endFrame, frameRate, scale, major, minor, patch);
          JSONArray assetsJson = json.optJSONArray("assets");
          parseImages(assetsJson, composition); //解析图片
          parsePrecomps(assetsJson, composition);
          parseFonts(json.optJSONObject("fonts"), composition); //解析字体
          parseChars(json.optJSONArray("chars"), composition);  //解析字符
          parseLayers(json, composition);   //解析图层
          return composition;
        }
    

    (2)解析图片资源

    LottieImageAsset类封装图片信息
    
    "assets": [                 //资源信息
        {                       //第一张图片
            "id": "image_0",    //图片id
            "w": 58,            //图片宽度
            "h": 31,            //图片高度
            "u": "images/",     //图片路径
            "p": "img_0.png"    //图片名称
        },
        {...}                   //第n张图片
    ]
    static LottieImageAsset newInstance(JSONObject imageJson) {
        return new LottieImageAsset(imageJson.optInt("w"), imageJson.optInt("h"), imageJson.optString("id"),
              imageJson.optString("p"));
    }
    

    (3)解析图层

    Layer封装图层信息,现在lottie只支持PreComp,Solid,Image,Null,Shape,Text这6中图层。

    "layers": [                 //图层信息
        {                       //第一层动画
            "ddd": 0, 
            "ind": 0,           //layer id 图层 id
            "ty": 4,            //图层类型
            "nm": "center_circle", 
            "ks": {...},        //动画
            "ao": 0, 
            "shapes": [...], 
            "ip": 0,            //inFrame 该图层起始关键帧
            "op": 90,           //outFrame 该图层结束关键帧
            "st": 0,            //startFrame 开始
            "bm": 0, 
            "sr": 1
        }, 
        {...}                   //第n层动画
    ]
    

    2.如何动起来

    Lottie时序图:

    img

    利用属性动画控制进度,每次进度改变通知到每一层,触发LottieAnimationView重绘。

    (1)利用属性动画计算进度

    这里用到了属性动画来产生一个0~1的插值,根据不同的插值来设置当前动画进度。

    代码如下:

    public LottieDrawable() {
        animator.setRepeatCount(0);
        animator.setInterpolator(new LinearInterpolator());
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                if (systemAnimationsAreDisabled) {
                    animator.cancel();
                    setProgress(1f);
                } else {
                    setProgress((float) animation.getAnimatedValue());
                }
            }
        });
    }
    

    (2)通过CompositionLayer把进度传递到各个图层

    @Override
    public void setProgress(@FloatRange(from = 0f, to = 1f) float progress) {
        super.setProgress(progress);
        if (timeRemapping != null) {
            long duration = lottieDrawable.getComposition().getDuration();
            long remappedTime = (long) (timeRemapping.getValue() * 1000);
            progress = remappedTime / (float) duration;
        }
        if (layerModel.getTimeStretch() != 0) {
            progress /= layerModel.getTimeStretch();
        }
        progress -= layerModel.getStartProgress();
        for (int i = layers.size() - 1; i >= 0; i--) {
            layers.get(i).setProgress(progress);
        }
    }
    

    (3)通知进度改变

      void setProgress(@FloatRange(from = 0f, to = 1f) float progress) {
        if (progress < getStartDelayProgress()) {
          progress = 0f;
        } else if (progress > getEndProgress()) {
          progress = 1f;
        }
    
        if (progress == this.progress) {
          return;
        }
        this.progress = progress;
    
        for (int i = 0; i < listeners.size(); i++) {
          listeners.get(i).onValueChanged();
        }
      }
    

    (4)最终回调到LottieAnimationView的invalidateDrawable

    @Override
    public void invalidateDrawable(@NonNull Drawable dr) {
        if (getDrawable() == lottieDrawable) {
          // We always want to invalidate the root drawable so it redraws the whole drawable.
          // Eventually it would be great to be able to invalidate just the changed region.
            super.invalidateDrawable(lottieDrawable);
        } else {
          // Otherwise work as regular ImageView
            super.invalidateDrawable(dr);
        }
    }
    

    (5)最后触发LottieDrawable重绘

    @Override
    public void draw(@NonNull Canvas canvas) {
        ...
        matrix.reset();
        matrix.preScale(scale, scale);
        compositionLayer.draw(canvas, matrix, alpha);   //这里会调用所有layer的绘制方法
        if (hasExtraScale) {
            canvas.restore();
        }
    }
    

    五、性能

    1.官方说明

    如果没有mask和mattes,那么性能和内存非常好,没有bitmap创建,大部分操作都是简单的cavas绘制。

    如果存在mattes,将会创建2~3个bitmap。bitmap在动画加载到window时被创建,被window删除时回收。所以不宜在RecyclerView中使用包涵mattes或者mask的动画,否则会引起bitmap抖动。除了内存抖动,mattes和mask中必要的bitmap.eraseColor()和canvas.drawBitmap()也会降低动画性能。对于简单的动画,在实际使用时性能不太明显。

    如果在列表中使用动画,推荐使用缓存LottieAnimationView.setAnimation(String, CacheStrategy) 。

    2.属性动画和Lottie动画对比

    以下性能对比是以K歌内单个礼物动画效果

     属性动画lottie使用硬件加速lottie未使用硬件加速
    帧率imgimgimg
    内容imgimgimg
    CPUimgimgimg

    Lottie动画在未开启硬件加速的情况下,帧率、内存,CPU都比属性动画差,开启硬件加速后,性能差不多。

    3、未开启硬件加速,Lottie动画大小帧率对比

    0.12倍1倍
    imgimg

    主要耗时在draw方法,绘制区域越小,耗时越小

    六、K歌可用的场景

    1.特性引导视频

    全民K歌每个大版本的首次启动都会有视频引导动画,每次都会在清晰度和文件大小平衡,最终导出一个大概有3-4M的引导视频,使用lottie可提高动画清晰度和减小安装包大小

    2.loading动画

    img

    img

    3.礼物动画

    img

    这是全民K歌的礼物面板,内部有大量礼物动画,每个礼物动画都不相同,动画过程中有大量的旋转,透明度,大小的变化,需要用属性动画实现,非常麻烦,代码可维护性也比较差。对比使用lottie后,有几大优势:

    1、100%实现设计效果

    2、客户端代码量极少,易维护

    3、每个动画可动态配置动画样式(加载不同的json)

    4、所有动画都可动态配置,动画配置文件,素材都可从网上加载

    4.说唱

    img

    K歌的说唱功能需要歌词按照特定的动画展示出来,这里就涉及歌词放大,缩小,旋转等等特效。实现时,根据当前时间,在canvas上歌词绘制出来,最终再和声音融合在一起生成一个MV视频,这里就导致动画不能特别复杂,并且有一定的规律。

    如果使用lottie后,可以把效果导出到json动画文件里,客户端加载动画文件,循环设置进度,读取每帧画面,再和声音融合生成MV。

    优势:

    1.动画丰富

    2.代码量少

    3.可使用设计导出的字体

    代码

    animationView.setProgress(progress);        //设置当前进度
    animationView.buildDrawingCache();          //强制缓存绘制数据
    Bitmap image = animationView.getDrawingCache(); //获取当前绘制数据
    

    七、总结

    1.劣势

    (1)性能不够好—某些动画特效,内存和性能不够好;相对于属性动画,在展示大动画时,帧率较低

    2.优势

    (1)开发效率高—代码实现简单,更换动画方便,易于调试和维护。

    (2)数据源多样性—可从assets,sdcard,网络加载动画资源,能做到不发版本,动态更新

    (3)跨平台—设计稿导出一份动画描述文件,android,ios,react native通用

    Lottie使用简单,易于上手,非常值得尝试。

     

    展开全文
  • 再看语音交互设计

    千次阅读 2019-08-20 22:02:00
    声音一直是人与人沟通的核心,而今也成为了人机交互的核心——智能语音交互。早在2016年,google声称其搜素请求中有20%是通过语音完成的。但是,语音交互设计并不是新兴的技术,在20多年前老码农刚刚参加工作的时候...

    行动是最好的思维方式。

    赋能是人工智能对人类最重要的事情,而智能语音(例如DuerOS)正在为人机交互的方式赋能。声音一直是人与人沟通的核心,而今也成为了人机交互的核心——智能语音交互。早在2016年,google声称其搜素请求中有20%是通过语音完成的。但是,语音交互设计并不是新兴的技术,在20多年前老码农刚刚参加工作的时候就可能已经存在多年了。

    从IVR 系统看起

    交互式语音问答(interactive vocie response,IVR)系统的出现,代表了语音交互设计的第一个重要时期。它可以通过电话线路来理解人们的话,并执行相应的任务。早期的IVR系统中,需要为对话中的每个状态指定完整的语法规则。

    在设计IVR系统时,会确保每个状态都包含一组通用组件:重复、主菜单、帮助、操作和再见。除了允许用户的请求帮助,一个全局的“退出“机制也很重要。如果没有足够的上下文信息来帮助判断,系统就需要让用户来进行确认。如果系统存在一定的局限性,那么这时候就需要让用户来缩小范围。

    "提示"是指IVR系统对用户说的话,可以是一个或一些完整的句子,也可以是短语,比如数字、日期或产品。提示列表一般有以下几种用途:

    • 从配音者提供需要录制的文案列表

    • 从用户哪里得到确认

    • 为TTS引擎提供输入

    在IVR系统设计的时候,我们已经了解到了将已经收集到的信息传递给用户、通过恰当的提示以获得特定回应、通过日志信息分析和改进系统,以及设计人物模型。这些方法对于如今的智能语音交互同样有着借鉴的意义。

    从人们的交谈看语音人机界面(VUI)

    当人们愉快地交谈时,交谈中通常包含一些关键要素:情境感知(关注你和周围的环境)、关于之前交流的记忆,以及相关问题的交流。人们对计算机和其他技术的反馈所使用的社会规则和期望,等同于与人类交往时所使用的社会规则和期望。

    VUI 思考的是在系统和终端用户间,从开始到结束的整个对话过程,思考正在解决的问题以及用户需要什么来达成他们的目的。VUI需要进行用户研究来了解用户(对方)是谁,进而通过设计、产品原型和产品定义来描述系统和用户之间的交互行为。

    VUI 通常用于单轮任务。不用强迫用户展开新一轮对话,而是去尝试了解用户的意图并允许用户继续交互。一般来说,让用户来决定对话要持续多久。如果你不能理解答案,就不要提问。如何你设置了可以完成某项任务的预期,请务必考虑与之相关(对称)的任务。

    VUI有着独特的优点:

    • 速度

    • 释放双手

    • 直觉性,每个人都知道如何说话

    • 同理心,语音中包含了语气、音量、语调和语速,这些特征传达了大量的信息

    凡事有两面性,VUI同样有着不适用的场景,例如:

    • 公众场所

    • 某些人不适应与计算机对话

    • 一些人更喜欢文字沟通

    • 隐私性的内容

    VUI往往是线性的,无法跳过。由于功能是不可见的,难以让用户通过视觉的方式来探索功能, VUI设计的主要挑战之一就是教育用户,告诉他们能做什么。

    VUI 可能的设计输出

    对于一个VUI项目而言,例如基于DuerOS的技能,其设计的交付内容可能包括:

    • 示例对话(可能包括真实的录音,特别是使用配音演员时)

    • 流程图

    • 提示列表(如果使用了配音演员或语录的语音合成片段)

    • 界面原型(如果这是一个多模态的应用)

    示例对话是第一要素,一般可以挑选5个最常见的使用场景,然后为每一个场景写一些最优路径的示例对话。

    流程图是用于展示VUI系统所有可能发生路径的图示,详细程度取决于所设计的系统类型。

    对于有屏设备而言,例如小度在家,线框图和原型在早期设计流程中也是非常重要的。

    VUI 的原型工具和传统的产品设计工具例如Azure 有些不同,国外的工具有wit.ai,dialogflow.com等,我们可以是百度UNIT平台作为对话的原型工具,当然,DBP平台的自定义回复功能,同样可以作为一个简单的原型工具。

    语音交互设计的原则

    保持用户参与度是最高原则,VUI设计应该围绕如何让用户进入下一步来进行,如果某些信息当前还用不到,就不要问用户。

    Paul Grice 于1975就提出了4个关于交互的合作准则:

    准则名称 内涵 错误用法 
    质的准则 所说的话需是自己相信的真实信息 宣传一件你做不到的事。例如,对用户说“有什么可以帮助您的”,而实际上整个VUI系统仅仅能够提供酒店预定服务
    量的准则 所说的话需满足交际中所需的信息量,但不应超出交际所需的信息量 多余的措辞。比如“请您注意听,应为我们的选项可能已经变了”(谁会想“啊,太棒啦!谢谢你告诉我”?) 
    相关准则 所说的话需与当前对话相关 给用户一些用不到的指示。比如在用户还没有下单的时候就开始解释退换政策 
    方式准则 说话需清晰,明了 使用用户难以理解的专业术语 

    对于无屏设备而言,DBP平台也给出了一些设计原则,例如:

    1. 保持简短,语音是短暂的、瞬变的、线性的。

    2. 保持自然

    3. 提供反馈

    4. 为解决歧义而设计

    5. 支持修正

    6. 注意时间的重要性

    7. 注意列表的困难性

    8. 注意文本转语音的局限性

    VUI设计中的确认策略

    在VUI设计中,最重要的是对用户问话的意图确认,也就是说,系统要向用户确认是否真正理解的是用户的意图。在决定VUI的确认策略时,要利用好能利用的一切感知通道,还要考虑:

    • 错误的后果是什么?(会预定错误的航班么?钱会被转移到错误的账户么?旅行者会听到错误城市的天气预报么?等等)

    • 系统将以什么形式进行反馈?(会有音频提示么?会有非文本的视觉反馈么?)

    • 会有一个小屏幕的显示反馈么?如智能手表或者手机中的弹窗

    • 以什么形式来确认是最合适的?(明确的确认还是隐性的确认,或者混合式的确认?)

    在确认用户的意图的时候,一般有以下几种策略:

    策略一:三级置信度

    系统在一定的阈值内(例如,45%~80%),以明确的形式确认信息,拒绝较低置信度的信息,并以隐性确认来确认超过80%阈值的信息。

    策略二:隐性确认

    连同原始问题的一部分一同回复,让用户知道系统识别到了用户的问题。

    策略三:非语言式确认

    仅使用行动进行反馈,尤其对智能家居的技能。

    策略四:通用确认

    通常应用于与用户进行开放式聊天的对话系统。

    策略五:视觉确认

    人类的记忆能力是有限的,通常用户一次性不能记住超过大约7个听觉项目。语音交互界面稍纵即逝的特征,明显为用户提出了很高的认知要求,所以使用视觉确认在很多情况下利大于弊。

    在隐性确认的情况下,可能需要允许用户取消或者后退一步。

    VUI中的语境

    语境意味着系统需要知道对话相关的信息是什么,并且知道之前发生过的对话内容。离开了语境,就不可能理解话语背后的意义,对于语音交互设计而言,最重要的一点就是能利用已知的对话,可以针对以下情况结合人工智能和情感分析进行反馈:

    • 用户的行为

    • 用户的无行为(迟钝)

    • 用户过去的行为

    • 用户的一系列行为

    • 用户所处的实际时间和空间

    • 不同使用者所处情境与行为的比较

    运用情感分析可以使VUI更智能,更具有同理心。在一段文本中对表达的观点进行定义和归类,可以用于确定用户对某一特定主题、产品以及其他内容的态度是肯定的、否定的还是中性的。情感分析的关键原则:宁求稳健,不愿冒险。

    关于多轮对话

    多轮对话,是VUI设计中的一个难点,因为用户的语音输入往往是不可控的。最简单和最自然的话术转换技巧就是“问一个问题”,当然,不要问那些你都无法理解对应答案的反问句。

    对话式中的某些关键词是让用户了解交谈进展以及进展情况的重要方式,包括以下三个方面:

    • 时间线(首先,完成一半了,最后等)

    • 接收回执(谢谢,知道了,好的,以及 很抱歉等)

    • 积极反馈(不错,干得好,很高兴听到这个消息等)

    在多轮对话中允许用户打断系统非常重要,但需要注意:

    • 最好不要使用系统打断功能

    • VUI说完后,需要进入“倾听”模式

    • 轮到用户说话时,最好有视觉指示器

    • 一个明显的提示,提示用户轮到他说话了(问一个问题或指令,如“能详细说一说么”)

    对话管理就是系统对既往会话中已产生的信息,以及在后续对话中所需要的信息进行管理的行为,在DuerOS中的对话管理由Dialog 和Session表示。只要问题与问题之间看起来是相关的,并且用户觉得问题能一步一步得到解决,用户可以容忍很多问题。

    关于可视化反馈

    交互方式正在从单纯的视觉、硬件交互转化为多感官综合的交互,这种交互模式的本质是“关系”。VUI无疑是最重要也是最自然的交互通道之一,但不要为了使用语音交互而使用语音交互。

    在某些对话系统中,显示用户所说的内容反而会分散用户的注意力,有时甚至留下负面印象。

    在某些情况下,让用户看到自己在说话可以提升参与感,可以考虑让用户控制是否开启这个功能。在DuerOS的有屏设备中设计多模态技能时,一般的VUI超时设置就不再适用,但还是需要记下app中用户长时间未应答的位置,因为在那里很可能有一个潜藏的问题,会造成用户困惑或让用户不愿意进行回复。

    VUI可以不使用虚拟形象,而使用抽象的可视化图像进行反馈。

    多通道、全链路、多角色,以及去中心化成为了设计的主旋律。允许用户同时使用语音和屏幕进行交互,是一种多模态界面(multimodal interface)。可视化组件可以让用户更从容地进行交互,视觉和语音的协同设计非常重要。

    关于容错处理

    任何时候都不要责怪用户,将错误归咎于系统是设计原则。下面在VUI可能出错的几种情况:

    • 未检测到语音

    • 检测到语音,但没有识别

    • 语音被正确识别,但系统无法处理

    • 部分语音识别错误

    人有许多方法来表明他们还不理解对方所说的话,最常见的(有效的)方式之一就是什么都不说。对于ASR工具识别错误的问题你并做不了什么,但可以通过N-Best列表和真实用户响应的数据分析来构建这类问题的解决方案。N-Best 列表 是一系列用户可能说的内容,并根据(通常是前5个或前10种可能)或按置信度排序。

    如果用户会定期使用你的系统,那么在设计中就需要包含一个不同的策略。VUI系统的目标不是简单地“训练”用户,而是应当适应用户的行为。当用户给出的答复对下一段对话内容并不重要时,可以设置一个通用的答案,也可以让用户知道,其他人也讲听取他们的答案。当发生歧义时,设立一个公用的列表,并通过进一步的询问来确认用户的真实意图。

    对于儿童类语音应用,整个交互流程不需要系统100%完美理解用户说的话就可以继续执行下去,最好能够提供图形化的选择。

    虽然处理否定词需要做些额外的工作,但一旦忽略它们就可能要付出高昂的代价。

    再看虚拟角色

    当人们知道他们是在和一个“机器人”说话时,会更加宽容。VUI系统的目标可能不是让人们误以为它是一个人,而是以高效、易用的形式,解决用户的问题。但是,没有人格的语音用户界面是不存在的。用户会通过应用的语音以及语言选择,推断出的人格或角色的标准化心理形象。

    因此,在考虑一个虚拟角色的时候,思考其背后的人格更加重要。在人格设计时,可能需要考虑:

    • 会让用户问虚拟角色自身相关的问题么?(例如:你最喜欢什么颜色?)

    • 如何处理粗鲁和粗俗的行为?决定如何对待辱骂性语言,对任何一支正在处理此问题的团队而言都是非常重要的。

    • 是否介意打破用户把VUI看作人类?

    一般的, 用文本列出药物时很好的选择,动画图解用于设备的使用说明非常有效,虚拟角色则有利于建立亲密关系。建立用户对虚拟角色信任感的方法是,适时遵循人类对话的惯例,保持用户意识错觉的建议:

    • 使用传达亲密感的对话

    • 确保虚拟角色在与不同用户交互式行为恰当

    • 确保对话看起来永不重复

    • 注意同时在线的用户数量

    • 注意用户的性别

    • 确保对话的表现是天衣无缝的

    • 当用户输入不能被识别时,避免虚拟角色的出现

    讲故事和参与式活动是使用虚拟形象的绝佳场景,使用真实的面孔是一种极好的吸引用户参与的方式,但成本也非常高。

    对一个成功的语音交互来说,虚拟形象并不是一个必要条件。但是,如果应用需要处理更敏感的话题(比如情绪或健康)时,务必识别出这些场景并妥善处理。人物模型的一致性使人们能在与它们沟通时得以预测接下来会发生什么,理想情况下,与其提高不同的声音或不同的虚拟形象,不如提高不同的人物模型,并且这些人物模型包含了不同的视觉和音频组件。

    凡事有两面性,人物模型的个性越鲜明,用户反应也会越极端。

    VUI的调研与评估

    VUI是持续演进和迭代的,可用性专家Jakob Nielson 推荐选择5名用户进行测试,他的研究发现,5人以上的测试并没有额外的益处,随着测试人数的增加,ROI会一落千丈。

    调查问卷的问题一般包含7个不同的维度:准确性,概念,建议提供(内容),易用性,会话的真实性,用户的好感度和视频流。受试者倾向于给出正面的回答,特别是在面对面的访谈中,大多数人会表现的更加友善,有时会对提供消极的反馈犹豫不决,也可能会夸大事物的积极面。受试者自己通常不会意识到这一点,但一个优秀的访谈者可以处理这些问题。在访谈过程中,用户应该可以从举行测试的人那里得到大量的线索。

    VUI测试有5个关键的衡量指标:准确性与响应速度,认知程度,清晰/混乱,友好度和声音。效果评估的指标可能包括:

    1. 任务完成率

    2. 流失率

    3. VUI的使用时长

    4. 语音打断

    5. 观察交互模式的占比:语音与GUI

    6. 高频次超时无应答和无内容匹配

    7. 延迟

    8. 完整的呼叫记录

    VUI的关键测试之一在交易式语音应答系统(IVR)中被称作“对话遍历测试”(Dialog Traversal Testing, DTT), 坚持完成,用户会感激你的细致和周全。大量的无语音超时式是提示语混乱的标志,当重现多模态App的对话是,展示屏幕交互也是非常必要的。

    其中性能在VUI项目的用户体验中占有重要的地位,一般地,延迟产生的原因有糟糕的连接性能 、系统处理进程和数据库访问等。关于智能语音系统的性能优化,可以参考智能音箱场景下的性能优化

    总之,语音交互设计的结果使得交互是省时、高效的,能够使用上下文语境,优先考虑的是个性化,而不是所谓的“个性”。

    参考资料

    • Cathy Peral(2018),Designing Voice User Interfaces:Principles of Conversational Experiences

    • Neilson,J(2012),“How Many Test Users in a Usability Study?”,https://www.nngroup.com

    • https://dueros.baidu.com/dbp

    • https://developer.amazon.com

    关联阅读

    展开全文
  • XD交互动效

    千次阅读 2021-01-21 19:00:16
    交互动效 1.打开XD,然后新建画布,用圆形工具画出一个圆形,填充颜色 2.然后点击画板名称,按住Alt键复制一个 3.把复制的圆形放大放到下面,然后点击菜单栏的原型,并选中第一个圆形 4.把圆形边上的箭头向下拉,...

    交互动效

    1.打开XD,然后新建画布,用圆形工具画出一个圆形,填充颜色在这里插入图片描述
    2.然后点击画板名称,按住Alt键复制一个在这里插入图片描述
    3.把复制的圆形放大放到下面,然后点击菜单栏的原型,并选中第一个圆形在这里插入图片描述
    4.把圆形边上的箭头向下拉,然后进行预览效果在这里插入图片描述
    在这里插入图片描述
    在属性栏可制作不同效果的动效
    在这里插入图片描述

    展开全文
  • 课程名称包装计算机辅助设计软件应用-CorelDraw 知识点9应用交互效果 作业习题9 一不定式选择题多选或少选都不给分) 1关于调和功能以下说法正确的有( ) A群组可与单一对象调和? ? B位图填充对象可以调和 C艺术笔...
  • 什么是多模态交互

    千次阅读 2021-02-21 09:16:57
    什么是多模态交互? “模态”(Modality)是德国理学家赫尔姆霍茨提出的一种生物学概念,即生物凭借感知器官与经验来接收信息的通道,如人类有视觉、听觉、触觉、味觉和嗅觉模态。多模态是指将多种感官进行融合,而...
  • React Native与Android通信交互

    万次阅读 热门讨论 2017-02-17 11:56:16
    本篇内容同样和React Native 与 原生App有关,可以说更加深入了两者之间的感情,为培养下一代做出准备:React Native与原生App的通信交互。 Android系统为我们提供了webview来加载网页,为了让webview加载的网页...
  • Chapter5 交互设计测试与评估 第一章 为什么要开展测试与评估 用户测试:请目标用户使用产品来完成任务,观察并记录用户使用产品的整个过程. 用户测试的定义:也被称为产品可用性测试,指特定的用户在特定的使用...
  • WKWebView OC与JS交互

    千次阅读 2021-04-27 08:54:53
    整体上看原理还是挺简单的,即OC端向JS中注入JS脚本或者注入一个事件对象,生成一个时间handeler,当JS触发此事件时,handler处理事件的回调用,实现相互传值和事件交互效果。 1. OC调用JS OC调用JS方法主要是通过...
  • WKWebView与JS交互之实战技巧介绍

    万次阅读 2016-04-30 18:34:00
    前言上一篇专门讲解了WKWebView相关的所有类、代理的所有API。...先看看效果图.效果图通过本篇文章,至少可以学习到: OC如何给JS注入对象及JS如何给IOS发送数据 JS调用alert、confirm、prompt时,不采用JS
  • Android 集成 Flutter 及通信交互详解

    千次阅读 2019-01-28 16:18:03
    效果图 一、Android 集成 Flutter 实现流程 闲鱼、头条 在 Android 集成 Flutter 模块都有自己的实现方案: 闲鱼团队方案  &  头条团队方案 我们以 官方方案 方式为主。 (1)创建 flutter module ...
  • Axure 9 下拉列表框选择时实现交互功能 目前网络查找的关于Axure 下拉列表...原型内容:三个页面A\B\C,每个页面包含该页面名称,每个页面包含下拉列表和该页面名称 实现目标:在下拉列表框中点击该文本时,实现对应...
  • 如果有需要视频资源的可以关注"AI产品经理人",回复关键字“网易交互设计微专业”获取下载链接~ Chapter4 让页面更优雅 第一章 你需要懂的视觉心理学 1. 为什么要懂视觉心理学? 原因1. 运用用户观察和思考的...
  • 本节目标效果如下: 基本概念 交互行为 Behavior G6 中的交互行为。G6 内置了一系列交互行为,用户可以直接使用。简单地理解,就是可以一键开启这些交互行为: drag-canvas:拖拽画布; zoom-canvas:缩放画布。 ...
  • 如何在 Adobe XD 中创建交互式原型?

    千次阅读 2020-03-31 15:08:21
    Adobe XD 允许您创建交互式原型,直观地展示如何在屏幕或线框之间导航。您可以预览交互,验证用户体验并对设计进行迭代,从而节省开发时间。您还可以录制交互过程并与利益相关者分享,以获取他们的反馈。放大/缩小并...
  • Android与前端交互之JSBridge

    千次阅读 2017-09-19 19:58:37
    在app中,经常会遇到一些...如何建立web页面和本地Native页面的深度交互,这就接下来要重点介绍的JSBridge,先看一个效果图:图一JS调用Android,图二Android调用JS。Android调用JS 在android为我们提供了WebView...
  • JavaScript人机交互

    千次阅读 多人点赞 2018-11-25 18:35:21
    3. 函数里面要做一些事情:(通常会去操作元素,提供交互) 1. 开启定时器: 执行切换图片的函数 changeImg() 4. changeImg() 1. 获得要切换图片的那个元素 1. 完成页面定时弹出广告 1.1 需求分析 ​ 一般网页...
  • P5.js 实现交互式动态绘画

    千次阅读 2018-12-30 23:00:31
    p5.js 实现交互式动态绘画1.关于交互式绘画的思考2.选定题目3.内容展示4.代码分析(1).按钮的实现(2).笔刷(画笔)(3).动作5.总结6.参考文献 1.关于交互式绘画的思考 在前几次的实验中,我们先后完成了静态码绘和动态...
  • 我的文章讲过:(0085)iOS开发之OC与JS交互高级用法(JavaScriptCore) 前言:我们知道OC 在UIWebView 加载 H5中,常常需要OC 与 H5 之间进行交互调用。采取的方法有: WebViewJavascriptBridge ...
  • 给一个程序增加菜单提供了一个比键盘更简单的方法来和程序交互,选择不同选项,而不用去记那些按键。   我们首先要做的是创建菜单,创建菜单函数 glutCreateMenu的原型如下: int glutCreateMenu( void ...
  • 什么是多模交互

    千次阅读 2019-12-31 17:09:53
    近年来比较热门的物联网可以认为是普适计算的雏形,多个小型、便宜的互联网设备广泛分布在日常生活的各个场所中,通过相互连接的方式服务用户。计算机设备将不只依赖命令行、图形界面进行人机交互,可...
  • web 交互规范

    千次阅读 2017-10-23 15:40:46
    《 Web 系统交互规范》以用户为中心,以用户的使用习惯与心理需求为出发点,结合以往项目经验,对用户习惯和产品交互各个方面做了相关的描述,为公司相关产品与项目的用户界面提供规范与指导。 在 Web 类型系统开发...
  • javaWeb前后台交互(二)

    千次阅读 多人点赞 2018-07-06 21:22:29
    接上一篇javaWeb前后台交互。链接:https://blog.csdn.net/blackplus28/article/details/80603863 一、MVC思想 责任分离思想. M:Model,数据模型对象.(JavaBean) V:View,视图界面.(JSP,Panel,Window) C:...
  • 人和机器人的自然交互

    千次阅读 2019-04-10 08:46:57
    自然是一个多方面的概念,本章试图解决其在人机交互(HRI)中的众多意义和化身,这在当前的研究中是显而易见的。 本章旨在广泛了解该领域的研究。 以下部分介绍了自然HRI的概念及其不同的方法和相互关联的概念,并...
  • 【Web前端】HTML表单:实现交互

    千次阅读 2018-09-19 19:16:04
    浏览器通过HTML表单和服务器实现交互,表单是一个可供用户输入信息的页面,用户提交表单后,表单包含的信息会发送到一个Web服务器,由服务器脚本负责处理并响应,返回一个HTML页面,最后浏览器显示这个页面。...
  • Android WebView与服务端交互Demo

    千次阅读 2014-06-19 18:07:03
    使用WebView可以让Android端的开发工作大量减少,原因是在服务端可以为其做一定的工作,下面这个小Demo就实现了从Android客户端与服务端的交互。我这里客户端使用的工具是Eclipse,服务端使用MyEclipse。 实现效果图...
  • (一)使用form表单的name属性简单实现前后端交互

    万次阅读 多人点赞 2021-11-14 13:10:10
    实现效果: 点击提交后: 前端页面源码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Ajax前后端交互_通过name属性进行</title> </head&...
  • UML交互图 -- 时序图 协作图详解

    万次阅读 2016-07-10 17:11:13
    动态图概念 : 从静态图中抽取瞬间值的变化描述系统随时间变化的行为, 动态图包括交互图活动图状态图, 这篇博客研究交互图 包括时序图和协作图; -- 时序图 : 显示对象之间的关系, 强调对象之间消息

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 147,182
精华内容 58,872
关键字:

交互效果名称

友情链接: metadata(??1).zip