界面布局
重叠View导致button点击失效的处理方案
调整相机参数的几个功能是由最左边的“option button”来点击触发的,触发之后,会有一个“match_parent”的黑色半透明view,刚开始采用的是RelativeLayout,这样就会造成button和下面的view重叠,导致button点击事件失效。在回忆了当时学习Android Layout方面的知识之后,并且用eclipse的monitor解析了一个类似界面的app的布局,意识到这个问题可以用FrameLayout来实现,因为FrameLayout默认的排版就是将view按照添加的先后顺序堆在屏幕的左上角。
需要注意的是:FrameLayout只支持下面三种方式来调整排版的位置:
- layout_gravity
- layout_marginXXX
- layout_paddingXXX
SeekBar上数值随着thumb移动如何实现
最重要的是求出thumb移动时的X轴坐标位置
(如果seekbar是竖直的,则为Y轴坐标位置),重写SeekBar类中的onDraw(Canvas c)
方法,用c.drawText(String s,float x,float y,Paint p)
来实时绘制thumb上面的数值,thumb的X坐标位置+Y坐标位置(需要稍微改变下,避免与thumb重合)传入c.drawText
方法中。
注意点:
- 如果传入的数据需要外面的函数确定,则需要在重写类里写相关的实现函数。
- 由于thumb本身有大小之分,也有offset,数值的位置使用计算出的thumb的X轴坐标会跟thumb本身有些偏差,需要进行一些调整。
- 另一种解决方案是SeekBar+PopupWindow,具体例子:SeekBar+PopupWindow
自定义Toast
由于一般用户在点击切换闪光灯时都会很快速切换好几个状态,此时Toast就要满足下一个Toast出现的时候覆盖掉上一个Toast,如果不做一些限制,则Toast会按照顺序一个一个将动画效果执行完,就会出现用户执行完操作很长时间之后Toast还在进行切换。所以在这里自定义Toast做了如下的判断:
上面这段代码的意思就很容易明白了,如果mToast不为空,则立马替换里面的Text;如果为空,则先创建实例,在setText。这样就能实现每次点击,Toast实时更新。
动画相关
切换摄像头的3d旋转动画
Rotate3dAnimation是Android API Demos里面的一个类,如果第三方SDK里面没有,可以自己借鉴Android API Demos里面写一个。
旋转的角度是从0-90°
再到270°-360°
,使用了两次Rotate3dAnimation的动画效果,实现镜头绕着屏幕中间的Y轴旋转360°的效果。这个动画的主要目的是在切换镜头的时候,实现顺滑过渡。
实现思路借鉴:郭霖的博客–Android中轴旋转特效实现
Interpolator的使用
Android中默认的Interpolator有AccelerateInterpolator
、BounceInterpolator
、AccelerateDecelerateInterpolator
、AnticipateOvershootInterpolator
等等,主要的作用就是Android动画的变化率,特别是BounceInterpolator
,模仿的是物体自由落体的运动,会有几次回弹的效果,如果在使用时不满足项目要求,可以自己重写里面的回弹函数,可以控制回弹的次数以及回弹幅度。
遇到的问题
如果对某个button直接采用imagebutton.animate().rotation().setListener()
的形式加载动画,onAnimationEnd()
方法会执行两次,导致imagebutton最终的动画效果不是自己想要的,暂时没有找到问题在哪。