本文链接:https://rainmonth.github.io/posts/A191224.html
摘要
功能
需要有以下功能
- 要有良好的可移植性
- 基本的播放控制(播放、暂停、拖动、播放状态判断、播放模式选择)
- 支持列表播放
做一个有追求的青年
本文链接:https://rainmonth.github.io/posts/A191224.html
摘要
需要有以下功能
刚开始分析ExoPlayer源码时,对于Timeline的概念不是很理解,这几天重新看了下,这里对Timeline及其相关概念做个简单分析
Timeline是一种数据结构,可以灵活的代表各种媒体的结构,Timeline的实例不可修改,对于直播流媒体,Timeline提供的是当前状态的快照。
Timeline由Timeline.Period和Timeline.Window组成。Period是Media逻辑上的代表(可以是单个的媒体文件、也可以是包含掺入广告的播放信息的插入广告的媒体文件)。Window可以横跨多个Period,定义了默认的播放开始位置,所在Period可以播放的范围。
本文链接:https://rainmonth.github.io/posts/A191206.html
摘要
结合源码,分析下ijkplayer的初始化流程,并对这个过程中的一些关键点(如消息循环、线程创建C层和Java层的通信几个方面来)做了一个详细分析。
自定义View永远逃不了一个话题,就时View的绘制,而View的绘制就逃不了要同今天的主角——Canvas来打交道。
Canvas控制着view绘制相关的所有调用,也就是说,view上显示的元素都需要通过Canvas调用形影的drawXX方法来绘制出来,当然要想完成View的绘制,需要一下四要素:
Canvas可以通过一系列的drawXXX
方法来进行基本元素的绘制,下面进行简单说明:
SRC_OVER
混合模式);Canvas的变化操作主要包括:平移、缩放、旋转、错切,分别对应一下方法:
translate(float dx, float dy)
,canvas上的对象X、Y分别都平移 dx 和 dy;scale(float sx, float sy)
,canvas上的对象X、Y分别都乘以 sx 和 sy;rotate(float degrees, float px, float py)
skew(float x, float y)
concat(Matrix matrix)
,将matrix 矩阵变换应用到 canvas的所有对象上;Matrix
是一个3*3的矩阵(如何在Markdown中表示矩阵),
矩阵各个值的含义:
scaleX(Y)、skewX(Y)、transX(Y),分别代表X、Y轴上相应的 scale(缩放)、skew(错切)、translate(平移)操作;
persp0、persp1、persp2 这三个值和透视有关,一般很少用到;
注意:
如果需要 通过矩阵 进行旋转造作,需要同时修改scaleX、skewX、scaleY、skewY。
pre
开头的表示要进行 矩阵的 左乘, post
开头的表示要进行 矩阵的 右乘
通用功能——矩阵的操作(todo);
getWidth()
与getMeasuredWidth()
的区别View 的
width
和height
、measuredWidth
和measuredHeight
的意义,分别的使用场景和赋值时机?
getWidth()
代码:
1 | public final int getWidth() { |
getMeasuredWidth()代码:
1 | public final int getMeasuredWidth() { |
getWidth()
的值在layout(int l, int t, int r, int b)
执行完成后真正确定;getMeasureWidth()
的值是在onMeasure(int widthMeasureSpec, int heightMeasureSpec)
中的setMeasuredDimension(int measureWidth, int measrueHeight)
执行完成后确定的,mMeasureWidth
本身是包含测量模式和测量的具体值的,但在调用getMeasureWidth()
后,进行了掩码操作,将高两位移除了;结论:子View最终的位置是在onLayout 中确定的,但子View的宽高是在onMeasure中确定的
MeasureSpec
相关到底是个啥?各种值的含义?mode和size分别代表什么意思?
MeasureSpec
表示的是View的测量结果,用一个int值表示(int值四个字节)其中高两位用来表示mode(测量模式),低30位用来表示size(测量的值),测量模式有三种:
UNSPECIFIED
:不对View大小做限制,如:ListView
,ScrollView
EXACTLY
:确切的大小,如:100dp或者march_parent
AT_MOST
:大小不可超过某数值,如:wrap_content
着重看一下ViewGroup的getChildMeasureSpec(int spec, int padding, int childDimension)
方法
1 | /** |
针对以上ViewGroup的getChildMeasureSpec代码做个小结:
EXACTLY
match_parent
,则模式与父View相同,且大小同父View(若父View是UNSPECIFIED
,则子View大小为0)wrap_content
,则模式是AT_MOST,大小同父View,表示不可超过父View大小(若父View是UNSPECIFIED
,则子View大小为0)View的一般绘制流程是什么?
measure->layout->draw
事件分发机制(参考一文读懂Android View事件分发机制)
1 | public boolean dispatchTouchEvent(MotionEvent ev) { |
ViewPager.OnPageChangeListener
的onPageScrollStateChanged
,但触发onPageSelected
instantiateItem
和destroyItem
两个方法这个时候可以重写Adapter的getItemPostion方法,让其返回POSITION_NONE(该方法默认放回UNCHANGED,但这个时候需要自己解决显示View列表的缓存问题
如果不解决,那么ViewPager中的View就会越来越多
先看看横向生成的代码
1 | using UnityEngine; |
游戏是在XZ这个坐标平面上的,X轴是横向的,Z轴是纵向的,所以你纵向生产的位置由spawnPosZ
决定,纵向生成范围由spawnRangeX
决定。类似的,如果要支持横向生成,那么要定义一下子两个类型的变量:
问题点:
简单的交互玩法:
官方教程地址:3D Game Kit
资源包中,提供了一个菜单Kit Tools,点击该菜单,然后选择Create New Scece就可以创建一个包含了主角Ellen和地面的简单场景了。
注意:Unity可以自定义编辑器,官方出的Game Kit,都通过代码方式,对编辑器进行了修改,添加了好多功能菜单,这就是为什么这个3D Game Kit为什么说不用编码也能开始游戏设计的原因,因为需要编码的部分都被“组件化”了,只需要利用已经封装好的功能
可以通过WASD控制角色的移动,空格控制跳跃,鼠标控制摄像机的视角,这里需要分析下这里的代码实现:
1 | 1. WASD控制角色的移动很好实现,通过InputManager的GetAxis来获取相应的轴,然后进行位移即可; |
Game Kit提供了很多预制件,有可交互的,也有不可交互的,对于这些预制件,可以拖动到场景中,然后看看他都有哪些Component组成,在具体看看哪些脚本组件的具体实现代码。
ProBuilder是Unity自带的建模工具。参考链接: