timeline_timeline 自定义轨道 - CSDN
精华内容
参与话题
  • Timeline使用手册

    千次阅读 2018-02-27 14:49:26
    TIMELINETimeline就是一个assets,就像动画,图片或者其他unity资源Timeline Asset:Timeline是一个外部assets,是Timeline Editor的一部分,就像市面上的视频编辑器有一个时间线,用时间线作为参考,就可以对动画,...

    介绍

    Timeline是一个能够创建过场动画,游戏序列和复杂的粒子系统的新工具。

    TIMELINE

    Timeline就是一个assets,就像动画,图片或者其他unity资源

    Timeline Asset:

    Timeline是一个外部assets,是Timeline Editor的一部分,就像市面上的视频编辑器有一个时间线,用时间线作为参考,就可以对动画,声音,脚本,游戏对象在时间线上进行安排。

    接下来是创建一个Timeline:

    Assets->Create->Timeline

    Playable Director组件:

    把刚才新创建的Timeline拖到一个对象上,那么这个对象就会有一个叫Playable Director的组件,这个组件控制timeline什么时候开始,什么时间和怎样进行。

    其中的参数:

    Playable:要播放的序列

    Update Method:回放将遵循(DSP,游戏,任何游戏,手动或固定)

    Play on Awake:是否一开始就播放

    Wrap Mode:当序列到达终点时会发生什么(循环,None,保持)

    Initial Time:什么时候开始播放(秒)

    这个Playable Director组件可以通过脚本动态控制开始和停止

    下面是栗子:

    2.1,先打开一个Timeline Editor:

    window->Timeline Editor

    创建后就是一个类似于视频编辑软件的界面,

    下面是Timeline可以添加的组件:

    add->

    Activation Track:控制游戏对象的出现和隐藏,若对象本身带有动画,那么对象隐藏后再出现,动画会重新播放

    Animation Track:允许你用动画轨迹将动画片段剪辑在一起,使场景中的游戏对象运动。

               Animation Clips组件的添加:把一个动画拖到Animation Track中,右键Animation Track,选择Add From Animation Clip或者直接把动画资源拖进clips里也可以。

    Multiple:可以在一个轨道上放置多个剪辑以创建动画序列。可以使用“轨迹选项”菜单添加“重写”曲目,允许动画分层。

    Audio Tracks:顾名思义,就是控制声音的部分(需要注意,并不能控制播放的长短,就算把声音条拉小,依旧会全部播放)

    Playable Track:timeline最强大的特性之一是它是建立在完全开放的体系结构之上的。动画、音频和播放曲目是完全建立在C #上,使用相同的API提供给用户。说白了就是别的视频编辑软件不能编程,但timeline可以的意思,也就是官方宣传的“可编程摄像头”。设想一个游戏有一个由UI元素转换组成的复杂UI(如面板淡入淡出、按钮滑动进出等),或者也许游戏需要一个灵活的文字对话系统,文本、声音和动画混合在一起。或者,也许你想创建一个集合时间剪辑,控制摄像头的程序。Timeline允许您创建自定义的剪辑,不仅用C #,也允许你创建完全跟踪的新类型。

    Cinemachine Track:cinemachine的工作在Timeline上有轨道线, cinemachine轨道 包含cinemachine镜头剪辑 触发虚拟摄像机。



    Cinemachine unity包下载:http://download.csdn.net/download/ilypl/9988614



    加载Cinemachine包到unity,创建一个Virtual Camera 来设置Cinemachine摄像头

    创建了Virtual Camera之后,主摄像机后面会有CM的logo,

    然后在Timeline中add一个Cinmachine,并把主摄像机拖到Cinemachine那里。

    虚拟摄像机,用电影里面的术语来说,就是一个分镜的意思。

    右键Cinemachine创建一个短条;

    再创建一个虚拟摄像头,和随意个短条,把不同的虚拟摄像头作为不同短条的摄像头,就可以实现电影分镜的效果:

    创建多个短条:

    把你想要的虚拟摄像头作为短条的摄像头:

    blending clips(混合剪辑):

    两个片段相互重叠在一个轨道上时,这两个剪辑被称为“混合”。Timeline自动创建缓和输出输入曲线,以控制如何2个剪辑将顺利地结合在一起播放回来。(注意,您可以通过检查人员定制和微调这些共混物,见下文)

    Inspectors:

    里面的s为秒,f为帧;

    Ease In Duration:曲线长度

    Ease Out Duration:缓和曲线长度

    Clip In:开始播放源剪辑的偏移量。例如,如果您想播放10秒音频剪辑的第二部分,请将剪辑值设置为5。

    Speed Multiplier:在剪辑的重放速度上的倍数。此值必须大于0。更改剪辑的这个值将改变剪辑的持续时间以播放相同的内容。

    Blend Curves(混合曲线):如上所述,当两个片段重叠时,每个曲线都会自动生成混合曲线。默认情况下,使用缓和曲线和缓和曲线。您可以自定义曲线通过改变曲线从“自动”到“手动”,然后点击曲线。曲线编辑器将出现在检查窗口下面的预览窗口中。

    在这里,你可以选择不同的预置或手动编辑曲线。编辑器将强制所有曲线的混合在1结束,混合曲线从1开始。

    Ease In/Out(渐近渐出):


    Extrapolation(外推???):

    动画轨道是一个很好的例子,支持外推法。没有选择模式时,Timeline会自动设置Hold模式,避免不良的绑定姿势。使用外推法,我们可以根据最近的剪辑来改变这些间隙中的行为。

    外推法重复剪辑,直到另一个剪辑出现在轨道上,并通过操纵剪辑的本地时间来完成。

    (这个我不是很懂)


    Sequence Playback(顺序播放):

    有2种方式来播放时间表:在编辑模式和播放模式

         In-Editor Playback(播放模式中)

            Timeline:对象的控制和释放

            场景窗口显示所有活动,Timeline对所有绑定到它们的对象的影响。使用时间线切换器切换时间线或选择“否”,以创建一个新的序列在任何没有一个Playable Director组件的对象上。

        Scrubbing(擦洗?)

            Moving the playhead positioner allows the user to preview the effect of the timeline on the objects in the scene.(暂时保留)

        Preview Playback(预览播放):

            打开游戏控制菜单中的播放按钮(空格键)将在场景视图窗口中启动当前序列的预览。播放将从当前位置开始播放头。序列回放一旦到达序列的末端,其行为就在导演组件的包装模式设置下定义:

    Hold模式:当播放头到达结束的时间表,播放于时间轴的最后一帧中断播放直到用户关闭播放按钮

    None模式:释放Timeline,允许Unity恢复到游戏。



        Play Range(播放范围):

            


        Playmode(播放模式):当在Playmode中,timelines是通过Playable Director组件控制。 然而,Timeline窗口的“互动”与播放的时间控制时间(使用playhead)或停止/恢复时间在玩的游戏。

        这有助于接管目前在游戏中进行调试的时间轴。

                                                                              MODIFYING CLIPS

    Clip selection(短条的选择【意译】):通过单击所需短条的任意位置来选择单个短条。 Timeline让你知道已选择的短条会显示白色边框和颜色突出。你也可以通过使用“Shift +点击”来选择一个范围或者“Ctrl +点击”来独立选择多个剪辑。

    Duplicating clip(s,其实就是ctrl + D,复制)

    通过右键单击短条并从上下文菜单中选择编辑>重复,可以选择所选剪辑或多个剪辑。 重复片段自动添加当前轨道的尽头。

    Clip Editing(短条的编辑):

        Trimming(裁剪):Edit -> Trim Start or Edit-> Trim End

    Clip Modifiers(修饰符):右键短条就会有个speed选项

        Speed Modifier(速度调整):

            Accelerate - Speed -> Double Speed.

            Slow -Speed -> Half Speed

            Reset -Speed -> Reset



                                                                    RECORDING AND EDITING ANIMATION


    Recording with Animation Tracks(动画记录):记录物体的位置和动画属性使用动画轨迹。

    用户可以很容易地创建Timeline的关键帧动画创建新对象的变换参数或动画属性

    To record a new animation(记录新的动画):

        1,把你希望要展示的动画拖到timeline的animate中;2,从pop-up中选择animation track,举个栗子:主相机可以拖动到timeline,并绑定到动画轨道;3,按可见头红色录制按钮使自动密钥记录。(注:记录按钮只有在动画属性跟踪)无限记录径迹;

    4,选择要动画的层次结构的对象,在时间线上移动播放头到你想要的第一个关键帧的位置和设置对象所需的通过检查或在你的场景视图变换值。

    5,将playhead移到时间轴上的不同位置,记录一个新的关键帧。

    6,完成后,关闭自动密钥记录按跟踪记录按钮。

    7,您可以保留您的轨道作为一个无限的轨道或转换到剪辑轨道选择“转换为剪辑轨道”从轨道的选择菜单。

    记录在自定义的可播放的轨道上:

    关键帧也可以记录在任何动画属性以相同的方式在Custom Playable tracks中

    展开全文
  • Unity 2017.1 Timeline & Cinemachine功能解析

    千人学习 2019-06-24 13:33:35
    本次课程将会介绍Unity在七月的2017.1版本中即将推出的Timeline模块。 Timeline为游戏开发,影视制作,广告,建筑等行业打开了一扇全新的大门。 Timeline不仅仅只是一个可被游戏行业应用的工具,它可以为各个行业的...
  • Unity TimeLine实用功能讲解

    万次阅读 2019-03-16 22:38:17
    这一个技术相对于其他动画系统,最大的区别就是,TimeLine针对多个游戏物体做出的一系列动画,主要用于过场动画的制作,实现电影级的那种分镜效果 注意:使用TimeLine需要2017以上的版本 在菜单栏中点Window,找到...

    这一个技术相对于其他动画系统,最大的区别就是,TimeLine针对多个游戏物体做出的一系列动画,主要用于过场动画的制作,实现电影级的那种分镜效果
    注意:使用TimeLine需要2017以上的版本
    在菜单栏中点Window,找到TimeLine,点开后同样也是一个面板,与Anmation类似,也是必须选中一个游戏物体后才能查看创建,其创建也可以像Animation一样先在Project窗口中先创建了再指定
    在这里插入图片描述
    创建的TimeLine片段将会以.playable文件的格式存储
    为物体创建后TimeLine会以时间轴的方式显示,且该游戏物体会自动挂载PlayableDirector和Animator这两个组件
    在这里插入图片描述
    其中Playable Director组件就是专门用来播放TimeLine的
    在这里插入图片描述
    类似于Pr或者是Vegas的编辑器,左边就是素材【在unity中就叫做要参与的游戏物体】而,右边就是时间轴,单位为帧.
    删除这个轨道,正式开始讲解
    先创建一个简单的场景。创建一个空物体,叫做TimeLine,把刚刚那个Playable Director组件挂载到其上,并指定一个空的playable片段
    将需要进行TimeLine动画的游戏物体拖入到左边栏,此时会有3个选项

    在这里插入图片描述
    有3种轨道可以添加
    第一个是 物体的激活与禁用的动画
    第二个是 一般的Animation,以前讲过的,一般为运动,动作动画,当然其也可以实现物体的激活与禁用,组件数据的调节
    第三个是 可以控制这个物体身上的声音
    【以下先演示最常见的Animation track 关于运动的】
    添加两个物体过来,都选择Animation Track,对动画进行设定,你可点击红色按钮,开始录制,录制结束后再点一次则关闭,这里面通用也可以对组件属性上进行操作
    在这里插入图片描述
    这个红点的原理和Animation窗口的红点类似,点击后只要有改动就会自动创建关键帧。然后换个位置继续改动,再次创建关键帧
    在这里插入图片描述
    右边的图标代表编辑曲线,和animattion的curev类似,该面板默认的单位是帧,可以修改为其他的比如秒
    在这里插入图片描述
    点击窗口右边的小齿轮就可以修改
    为每个参与的游戏物体创建关键帧后,就可以查看合运动了。【单独的Animation也可以完成这些功能,只不过这个稍微方便一些,且用于多物体动画】
    TimeLine的动画片段不能完成帧事件,帧事件只有Animation能实现
    如果在观察/编辑时只想看其中一个物体的,不想受到其他物体运动的干扰。你可以对其他物体的轨道静音
    右键左边的游戏物体选择Mute静音
    在这里插入图片描述
    注意!!只要参与了TimeLine动画的游戏物体都会被挂上Animator组件,虽然组件上的设置都为空,但不能删除,否则就不能播放TimeLine动画了,因为从Animator下面的信息看,里面是有动画的clip的
    在这里插入图片描述
    对刚刚生成的动画,可以点击右键Convert to Animation就会转换为一个动画快,可以拖动,复用
    在这里插入图片描述
    由于这两个动画都是只改变了Transform里面的属性,Transform是共有的,所以上面的动画可以直接拖下来给下面的用也是可行的,【如果存在不共有的属性,那么就不能拖】
    在这里插入图片描述
    多个动画片段衔接自然的话,可以向内托一点,重复一些,就会有线性变化
    在这里插入图片描述
    注意!在动画片段的 前 后部分,其游戏物体的属性不会保持原有的属性,而是在开始之前的时间与开始时相同,等待开始,结束之后的时间与结束时相同,保持结束时的状态【默认–该模式可修改*A】
    在这里插入图片描述
    片段的长短也可以修改,拉升边缘可以减少增加一些帧,【但不能像Vegas按住Ctrl拖那样,保证帧不丢失而改变播放时长来达到减短变长的效果】

    当点击TimeLine里面的动画片段之后,回到检视窗口可以对齐一些属性进行修改
    在这里插入图片描述
    Start end主要修改开始和结束的时间/帧的位置
    Duration可以理解为缩放比:即该动画的时长/帧长,改大则放得更慢,改小则放的更快
    在这里插入图片描述
    就代表开始与结束时的淡入淡出,填写值后就会变为这样【和Vegas类似】
    在这里插入图片描述
    该值默认为0

    【这些属性值可以直接通过快捷键+拖动的方式修改【和Vegas类似】】
    1直接拖动边界:就是剪切和保留片段的部分,拖的长度大于本身动画的长度,将会自动循环【前提是该动画被设置为循环Loop Time loopPose,此时拉长会显示L1,L2,L3循环次数,对于不是循环的动画拉开将会显示Hold】
    2按住Ctrl拖动边界:对两端添加淡入淡出效果【Activation无效】
    3按住shift拖动边界:修改缩放比,越短越快,越长越慢。声音也有效

    【*A Extrapolate相关设置】
    Pre代表动画片段播放之前,Post则道标动画片段播放之后。
    默认状态为Hold,即在开始之前保持开始时状态,在结束之后保持结束时状态
    其余还有几个选项:
    NONE:【代表不受TimeLine控制】有动画状态机的话由其原本的动画状态机控制,无动画状态机则代表在播放前后在世界坐标0,0,0的位置
    Loop:则代表循环播放这一段动画
    PingPong:则代表来回播放,即播放完一段后,反向播放一段,一直往复,和乒乓球一样
    Continue:先播放一次,然后等到时间到之后在播放这个片段一次

    TimeLine实现人形动画
    【人形动画预览时都会回到原点,运行时就正常了(加了anmatorcontroller情况下)】
    将上次 Unity动画系统 案例1中的人物及其动作导入到该项目中
    要先对材质上进行一些设置,对于Unity2017则稍有不同,要到Project菜单,选择模型文件打开Material,先将贴图和材质球分离出来后才能设置
    将模型拖入层级窗口后,再将人物拖入TimeLine面板创建Animation Track
    将所需动画也放入轨道,即可直接播放
    在这里插入图片描述
    注意!!!对于人物的动画可以发现,在预览的时候都会回到世界坐标0,0,0,然后在运行时也自动回到了原点,然而其他的物体并没有回到原点。解决这个问题的办,【1】为人物模型指定一个动画状态机AC,这个动画状态机本身可以什么都不用写,但是要有。这下在运行播放时,就会回到原点播放了
    在这里插入图片描述
    【2】可以不用为人物指定创建动画状态机,直接选择这个轨道,回到检视面板
    在这里插入图片描述
    勾选Track offset,点击那两个图标就可以进行对初始位置的设定了

    TimeLine的另外两种轨道类型
    Activation Track主要控制游戏物体的激活
    其最常用的功能就是控制摄像机的切换镜头,做分镜,相机切换
    先在场景中创建两个摄像机,【此时第二个摄像机的depth会高于第一个,且模式还是保持为skybox,不要透视depthonly】
    在这里插入图片描述
    第二个Camera默认是禁用的,到时间后启用,由于第二个相机的Depath属性高于主摄像机,所以主摄像机不显示,显示这个第二个摄像机,实现了摄像机切换,分镜。

    在这个条之前,该游戏物体保持其自己本身的激活/禁用状态,进入条后,激活,离开条后又会被禁用
    更加完善的设置如下,【即保证每时刻只有一个摄像机被启用】
    在这里插入图片描述

    Audio Track音效轨道
    你可以直接把音频拖过来,预览时并不会播放,在运行时他会播放。在没有指定AudioSource情况下,其使用静态方法播放,不能设置播放的音量等属性,当然,也可以指定一个AudioSource组件给他,这样就可以设置了

    Control Track和playable track是高级用法,它可以使用脚本进行一些自定的控制【后期讲解】
    案例1:实现上一次动画系统中,案例1中人物跳跃和滑动时给个镜头特写
    打开UnityCharacterAnimation场景
    创建空物体TimeLine,挂上Playable Director,并创建一个空的TimeLine 取名为CameraTranslate指定给他
    !!!由于,这个动画不是由时间定死了的,他是根据情况才切换相机,所以必须要控制他,而不是单纯的,一运行就启用。
    取消勾选TimeLine上Playable Director的Play on wake单选框。回到Player脚本中,引入Playable命名空间,拿到这个组件的引用。在射线检测代码部分追加以下程序
    在这里插入图片描述
    如果想实现每个栏都可以播放第二相机并且照住他,那么要第二相机跟随到人物一起运动,把第二相机作为人物的子物体,就已经到达效果了,再加个相机的旋转移动动画,就更加高大上了

    案例2:对车进行各种角度的特写,利用摄像机的TimeLine实现,需要导入一个 真实赛车控制 的插件。
    把里面的场景赋值一份备份,将这个场景拿来我们做TimeLine动画
    目标:只需要实现刚进游戏的自动播放就可以了,所以不需要程序控制。
    先拖入声音。
    再创建一个摄像机取名为CGCAMER,depth低于原来的RCC摄像机,将RCC摄像机禁用.由于要切换多个镜头户需要多个摄像机,并要同时对Active 与Animation同时操作。
    当轨道太多时可以用Track group统一管理,放进去的就不能再编辑了
    在这里插入图片描述
    为了相机切换时有更好的效果,所以实现相机切换的时的渐变效果
    这需要在Canvas创建一张图片当作遮罩使用,通过动画来改alpha通道来实现

    在TimeLine中创建的动画轨道AnimationTrack是会被文件的形式存储下来的,只不过他整合在.playable文件里面,想单独拿出来使用可以复制一份

    在这里插入图片描述

    展开全文
  • Unity 2017.1 推出的Timeline功能,不仅可以高效的帮助大家实现游戏场景中的物体动画,还可以制作出更为复杂的过场动画及电影内容。今天这篇文章将由Unity大中华区技术经理成亮,通过实例分析让大家了解Timeline的多...

    转载注明出处:点击打开链接

    Unity 2017.1 推出的Timeline功能,不仅可以高效的帮助大家实现游戏场景中的物体动画,还可以制作出更为复杂的过场动画及电影内容。今天这篇文章将由Unity大中华区技术经理成亮,通过实例分析让大家了解Timeline的多轨道,把各类场景中的元素整合实现更为复杂的动画。


    Timeline简介

    Timeline 是一套基于时间轴的多轨道动画系统,它支持可视化编辑,实时预览,主要包括Timeline 资源,PlayableDirector,组件以及Timeline编辑器。下图底部展示了Timeline的编辑器,可以看到每一条轨道左边是绑定的场景中的物体,这部分信息会记录在PlayableDirector中;右边就是轨道的播放数据,这部分信息会记录在Timeline资源中。下图中部的红框展示了PlayableDirector组件,它的主要作用是播放Timeline资源,以及保存Timeline所绑定的场景物体。



    目前Timeline包括以下六个基本轨道类型:
    • Animation:用于播放AnimationClip或者关键帧动画

    • Activation:用于控制物体的激活状态。

    • Audio:用于音效的播放。

    • Control:用于控制粒子,或者另一个Timeline对象的播放。

    • Playable:用于自定义的播放行为。

    • Cinemachine:用于控制Cinemachien相机系统的播放。


    Timeline提供给了用户足够的扩展性,可以通过Playable轨道,自定义任何我们想要的动画行为。比如改变图片Alpha值,或者材质中的某个参数。下面我们将会用实际案例帮助大家了解Timeline基本使用方法及一些特性的应用。

    Timeline基本使用方法



    上图中角色从咖啡机取咖啡的动画就是使用Timeline完成的。它使用了Animation,Activation,Audio以及Control四种基本轨道类型,上图中Timeline的轨道如下图所示:




    Animation 轨道


    这是最常用的轨道类型,角色和咖啡机都使用了Animation轨道。首先我们看到角色的Animation轨道除了一段human_idle_01的Animation Clip,还包含了一段子轨道Action Track。这段子轨道比较特别,我们称之为覆盖轨道(Override Track),它的作用是在这个时间段内优先播放子轨道的内容,也就是角色取咖啡这一段动画。再来看一下咖啡机的轨道,轨道上包含了一系列Animation Clip,它们会按照先后顺序进行播放。另外,Animation轨道还支持关键帧动画的编辑并导出到Animation Clip,具体使用可以参考官方手册。

    Activation轨道

    咖啡杯(CoffeeCup)对象的出现,隐藏使用了Activation轨道。这个轨道的功能很简单,就是控制对象的激活状态。这个功能确实非常的实用。

    Audio轨道

    Audio轨道的使用也很简单,将声音素材直接拖入轨道即可。下图展示了AudioClip的属性,可以看到每一段Clip都有对应的音效素材。



    Control轨道

    本例中Control轨道用于控制咖啡流出的粒子效果的播放。用Control轨道来播放粒子效果,可以预览每一帧的粒子效果,这个功能对粒子效果的调试非常的有帮助。当然Control轨道还有更多的控制功能,比如它还可以控制子Timeline的播放。



    在Timeline中我们可以通过多轨道很方便的控制场景中不同物体的动画,同时轨道覆盖以及粒子效果预览等功能也为动画制作提供了很好的帮助。

    复用Timeline

    可以被复用是Timeline一个很重要的特性。只要是有相同的动画行为,即使是不同的物体,也可以复用相同的Timeline资源。比如说游戏中常见的收集物品,通常都有相同的一些动画表现效果,如果每一类物品都要单独制作动画,显然从制作和性能上都是低效的。下面我们就以收集物动画的例子来分析Timeline 是如何被复用的。



    下图中所示的红心、五角星、磁铁、翻倍四个收集物的动画行为完全一致,因此它们的收集动画统一使用了PickedUp-CollectableTimeline这个Timeline资源。在Timeline窗口中第一个轨道是收集者的动画,由于在预制件中是无法知道场景中的收集者的,所以需要动态绑定收集者,因此暂时留空;第二个轨道是缩放和旋转收集物的动画,直接绑定到目标对象上即可;第三,四条轨道通过Control轨道播放相同的粒子效果。



    如何动态绑定轨道的目标对象,如下面这段代码所示,collectedTimeline就是Timeline资源所对应的PlayableDirector,首先通过遍历的方式找到相应的轨道playableAssetOutput,然后调用PlayableDirector的SetGenericBinding把收集者动态绑定到轨道上。



    从上述例子可以看到,Timeline通过把动画数据和动画目标分离,实现了资源复用的特性,可以大大提升使用效率。

    Timeline嵌套

    有时候在场景中常常会出现这种情况,一个物体会在某一处按照一定间隔出现,比如天空中的闪电。闪电本身是一个动画序列,而控制闪电的间隔本身也可以看作是一段动画。而这样的双层动画也可以通过Timeline来实现,因为Timeline支持嵌套。



    我们首先来看主Timeline的轨道,这里有六条控制闪电的轨道,都是Control类型的轨道,在每一条轨道中控制闪电出现的时机和间隔。

     


    而具体闪电的表现效果由Control Clip对应的子Timeline来负责。如下图所示,闪电效果的Timeline包含四条Control类型的轨道,分别控制不同粒子效果的播放。
        
     


    结语

    通过今天的学习,可以让大家初步了解Timeline的多轨道机制,以及资源复用和嵌套使用等特性。可以帮助大家实现很多之前需要代码才能完成的功能。后面我们还将继续为大家分享Timeline强大的扩展性,即自定义行为的Playable轨道。以及结合Cinemachine智能相机系统所创造的丰富表现力等内容在Unity官方中文社区(unitychina.cn),请保持关注!
    展开全文
  • H-Express Library——–timeline这是母项目 H-Express 中的那个自定义时间轴view,现抽取出来分享给大家,这个自定义view比较简单,作为学习自定义view入门的朋友可不能错过了。一般可以应用在单号追踪、历史事件...

    H-Express Library——–timeline

    这是母项目 H-Express 中的那个自定义时间轴view,现抽取出来分享给大家,这个自定义view比较简单,作为学习自定义view入门的朋友可不能错过了。

    一般可以应用在单号追踪、历史事件记录、任务完成度显示等方面,作为Recyclerview或者listview的item布局即可。


    先上图:

    这里写图片描述         这里写图片描述
    左边为H-Express中的效果,右边为原始效果,横向和竖向。


    import

    AS:

        dependencies {
                compile 'com.qht1003077897.timeline:timelinelibrary:0.1'
        }

    EC:
    使用eclipse的同学直接到项目的github地址下面timelinelibrary中拷贝出两个类,一个attrs出来,放到自己项目中即可。


    使用

        <com.bt.mylibrary.TimeLineMarkerView
            android:id="@+id/time1"
            android:layout_width="150dp"
            android:layout_height="100dp"
            android:paddingTop="20dp"
            app:beginLine="@color/blue_sky"
            app:endLine="@color/blue_sky"
            app:oritation="true"
            app:marker="@drawable/timeline_bg_blue"/>

    看完了怎么用下来就该看看源码实现了

    timeline的实现很简单,我这里以竖向为例,横向的类似。总结为2点:

    1. 首先以整个view的正中心然后靠左边界为基准绘制中间的圆,如图。为什么要靠左边呢,因为放在左边界再加上合适的paddingLeft就很容易能控制圆的位置了(同理,横向的靠上边,使用paddingTop控制圆的位置)。
    2. 然后以这个圆为基准,再绘制上面的线条和下面的线条。

      下面是6个属性,以供xml中进行设置。

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="TimeLineMarker">
            <!--圆点大小-->
            <attr name="markerSize" format="dimension" />
            <!--圆点颜色或者图片-->
            <attr name="marker" format="color|reference" />
            <!--上面/左边线段颜色或者图片-->
            <attr name="beginLine" format="color|reference" />
            <!--下面/右边线段颜色或者图片-->
            <attr name="endLine" format="color|reference" />
            <!--线段粗细-->
            <attr name="lineSize" format="dimension" />
            <!--横向还是竖向-->
            <attr name="oritation" format="boolean" />
        </declare-styleable>
    </resources>

    很简单的 onMeasure() 方法,如果你的自定义 view 没有什么特殊需求,直接把这个拿去用,通用版。

    @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    
            int widthSpecSize= MeasureSpec.getSize(widthMeasureSpec);
            int heightSpecSize= MeasureSpec.getSize(heightMeasureSpec);
            int widthSpecMode= MeasureSpec.getMode(widthMeasureSpec);
            int heightSpecMode= MeasureSpec.getMode(heightMeasureSpec);
            //判断横向还是竖向,true为横向
            if(oritation){
                if(widthSpecMode== MeasureSpec.AT_MOST && heightSpecMode== MeasureSpec.AT_MOST){
                    setMeasuredDimension(120,80);//针对wrap情况做处理
                }else if(widthSpecMode== MeasureSpec.AT_MOST ){
                    setMeasuredDimension(120,heightSpecSize);
                }else if(heightSpecMode== MeasureSpec.AT_MOST ){
                    setMeasuredDimension(widthSpecSize,80);
                }
            }else{
                if(widthSpecMode== MeasureSpec.AT_MOST && heightSpecMode== MeasureSpec.AT_MOST){
                    setMeasuredDimension(80,120);//针对wrap情况做处理
                }else if(widthSpecMode== MeasureSpec.AT_MOST ){
                    setMeasuredDimension(80,heightSpecSize);
                }else if(heightSpecMode== MeasureSpec.AT_MOST ){
                    setMeasuredDimension(widthSpecSize,120);
                }
            }
        }

    因为我们使用的元素为3个 drawable,是现成的 view,所以已经不需要在 ondraw()方法中进行绘制了,而更多的是调整每个 drawable 的位置,所以下面的方法写在 onSizeChanged() 中更合适。

     @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            initDrawableSize();
            if (mBeginLine != null) {
                mBeginLine.draw(canvas);
            }
            if (mEndLine != null) {
                mEndLine.draw(canvas);
            }
            if (mMarkerDrawable != null) {
                mMarkerDrawable.draw(canvas);
            }
        }
    

    主要看一下 initDrawableSize() 方法:

     private void initDrawableSize() {
            int pLeft=getPaddingLeft();
            int pRight=getPaddingRight();
            int pTop=getPaddingTop();
            int pBottom=getPaddingBottom();
            int width=getWidth();
            int height=getHeight();
            int cWidth=width-pLeft-pRight;
            int cHeight=height-pTop-pBottom;
            Rect bounds;
            int mMarkerSizepx=ResourceUtil.dip2px(getContext(),mMarkerSize);
            int mLineSizepx=ResourceUtil.dip2px(getContext(),mLineSize);
            //以竖向为例
    if(mMarkerDrawable!=null){
                    int marksize= Math.min(Math.min(cWidth,cHeight), mMarkerSizepx);
                    mMarkerDrawable.setBounds(pLeft,pTop+height/2-marksize/2,pLeft+marksize,pTop+height/2-marksize/2+marksize);
                    bounds=mMarkerDrawable.getBounds();
                }else{
                    bounds=new Rect(pLeft+mLineSizepx/2,pTop+height/2,pLeft+mLineSizepx/2,pTop+height/2);
                }
                int halfLine=mLineSizepx >> 1;
                int lineLeft=bounds.centerX()-halfLine;
                if(mBeginLine!=null){       mBeginLine.setBounds(lineLeft,0,lineLeft+mLineSizepx,bounds.top);
                }
                if(mEndLine!=null){
    mEndLine.setBounds(lineLeft,bounds.bottom,lineLeft+mLineSizepx,height);
      }
    }

    先了解一下 setBounds() 方法:

    这里写图片描述

    这句话的意思是:为Drawable 指定一个矩形区域,在onDraw() 方法被调用时使用。

    这个矩形区域参数要求:矩形左边距view左边界的距离,矩形上边距view上边界的距离,矩形右边距view左边界的距离,矩形下边距view上边界的距离。

    这里写图片描述

    首先设置 mMarkerDrawable 的 bounds,左边的距离为pleft,上下为中心位置,确定了这个 bounds 为基准位置之后,再去绘制上下线条。

    如果 mMarkerDrawable 为空,即在 xml 中不要这个圆,那么我们此处是将它看做一个点,一个左边的距离为pleft,上下为中心位置的点,作为我们的基准点,然后再去绘制上下线条,最终绘制出来的即为一条线段。

    对于上下线的绘制很简单,这里以上线条为例,线条上端紧挨view的顶端,下端紧挨这个bounds的顶部,线条的长度为 bounds 的顶端距离上边界的距离。线条长度和 bounds 挂上钩之后,我们如果在 xml 中设置 paddingTop ,则 bounds.top 变大,线条长度变长,圆相应的往下移动。bounds.top= pTop +(height/2-mMarkerSize/2)。

     //下来提供几个方法。以供代码动态设置
        public void setMarkerSize(int markerSize) {
            if (this.mMarkerSize != markerSize) {
                mMarkerSize = markerSize;
                invalidate();
            }
        }
    
        public void setBeginLine(Drawable beginLine) {
            if (this.mBeginLine != beginLine) {
                this.mBeginLine = beginLine;
                if (mBeginLine != null) {
                    mBeginLine.setCallback(this);
                }
                invalidate();
            }
        }
        ·············
    

    源码github地址:

    https://github.com/qht1003077897/timeline

    我的QQ: 1003077897
    我的csdn:http://blog.csdn.net/u012534831

    欢迎交流。

    展开全文
  • TimeLine-时间线

    2019-05-26 10:47:46
    开发工具与关键技术:VS 作者:楠木 撰写时间:2019.5.26 这好像多多的新闻播报,但是播不完的那种就得显示出来咯,而...这用到ul标签,li标签,ul的类引用layui的layui-timeline这个,直接用就可以了,li引用layu...
  • TimeLine讲解

    千次阅读 2017-09-10 22:40:25
    TimeLine时间曲线,用于做类似于动画效果的一系列帧。1.创建TimeLine节点右键,输入 TimeLine 点击。 2.熟悉界面 第一个是创建一个浮点型类型的轨迹。 第二个是创建一个向量类型的轨迹。 第三个是创建一个事件触发...
  • Unity2017中Timeline的简单使用方法

    万次阅读 多人点赞 2020-01-07 11:11:46
    Timeline是Unity2017版本中新加入的功能,可以非常方便的进行场景动画的创建和修改,包括物体、声音、粒子、动画、特效、自定义Playable以及子Timeline等多种资源进行整合,从而能够较方便的生成效果很棒的场景动画...
  • Unity TimeLine

    千次阅读 2019-05-28 18:12:26
    TimeLine 制作剧情动画 打开窗口(版本不同,位置不同): Window ---> TimeLine Window ---> Sequencing --->TimeLine Cinemachine 相机管理工具 导入: 在Asset Store(资源商店) 搜索...
  • 官方给的timeline组件太过于复杂, 对于不熟悉的朋友, 只是看逻辑就浪费很多时间 以下是基础版的示例, <!DOCTYPE html> <html style="height: 100%"> <head> <meta charset="utf-8"> </...
  • 最近搞timeline剧情相关东西 timeline很方便,就会傻瓜式,容易上手,就像会声会影一样,就那些时间轴,拖一下看效果那种 最大亮点就是可以在非运行模式下预览 非运行模式预览方便美术策划调效果,具体使用教程...
  • echarts中如何使用timeline组件

    万次阅读 2019-08-09 14:44:15
    1.吃碗面 ...当我看了echarts3关于timeline的使用,我就觉得我有必要写一篇Echarts中timeline组件的使用。这玩意东西时间久了,真心容易忘,就当是做个备忘吧。 这里还是要再说两句,百度的echa...
  • 大家好,我是SKODE。 小提示:选中左侧目录,可快速找到所...选中某物体,Windows-Sequencing-TimeLine,给该物体创建TimeLine属性。 2、创建 DialogueBehaviour 脚本,内容如下: 一起成长, 我是SKODE...
  • Preview按钮:选择是否在Game窗口中显示当前Timeline实例的预览动画(的第一帧)。点击播放按钮可自动切换至预览模式。 Timeline选择按钮:选择场景中存在的Timeline,括号中会显示与Timeline关联的游戏对象。 ...
  • 写这篇文章的目的:既然后面与Timeline常常打交道,那么就先将先把这个工具磨砺磨砺,方便后面使用,以后有些地方遗忘的了,可以倒回来再看看。 因为Timeline工具,我想着为以后这么一些功能使用: 无交互剧情流程 ...
  • Unity Timeline动态修改绑定资源

    千次阅读 2019-08-30 14:25:34
    使用Timeline可以非常方便的进行场景动画的创建和修改,包括物体、声音、粒子、动画、特效、自定义Playable以及子Timeline等多种资源进行整合,从而能够较方便的生成效果很棒的场景动画。 有些时候在使用Timeline...
  • Android代码-TimeLineView

    2020-07-22 23:32:47
    TimeLineView Android Timeline View Library demonstrate the the power of ConstraintnLayout and RecyclerView. Showcase     Quick Setup 1. Include library Using Gradle TimelineView is currently...
  • echarts ——timeLine组件

    千次阅读 2019-07-12 15:48:19
    echarts ——timeLine插件 带timeLine 插件的动态图表,从官网找的代码,放到自己代码中显示不正确,下面的1月、2月…,只显示0,1,2,3…找了好久没有找到问题在哪儿,项目空闲期再回看代码发现问题所在。 地址:...
  • Unity-Timeline初探

    千次阅读 2018-02-09 19:08:35
    Timeline是个好东西,自己一直想感受一下,不过一直拖到现在才算稍微做出了点自己满意的东西,达到了自己满意的效果。 我的想法是 实现一个技能效果(很low的效果,不会美术):首先在主角身边生成一把剑,然后主角...
1 2 3 4 5 ... 20
收藏数 33,319
精华内容 13,327
关键字:

timeline