利用ViewDragHelper实现3d效果的View

如何在安卓上实现3d效果?我们知道使用surfaceView可以达到要求,不过surfaceView属于真正的3d,其底层实现是很复杂的,

笔者也参考过使用Camera操作矩阵来实现,比如miui系统中的时钟就是这种方式实现的,本人发现虽然可以实现很酷的3d效果,

但是交互性并不是很理想,如果仅仅作为一个展示还是挺不错的;

如果想通过视觉上达到3d效果,并且有很好的交互能力,可以使用ViewDragHelper得到非常具有视觉冲击力并且交互能力很棒的view,供有需要者参考;


关于ViewDragHelper框架的学习,有需要的同学请自行网上参考,可以说摸透了该框架对于安卓滑动相关View的自定义就不在话下了:


这里仅仅说明实现原理:



扫描二维码关注公众号,回复: 2777983 查看本文章

1,、首先说一下思路

a、首先View1、View2、View3的是写在xml中,其初始大小以及位置都是一样的,三个view都是继承至viewGroup的,也就是说其是可以有子view的

b、我们还需要view4第四个view来覆盖在最上层用于能够均匀的接受或者减少水平方向滑动的距离;

c、当滑动的时候ViewDragHelper会将每个view滑动的距离传入,这时候我们统统不改变view1,view2,view3的位置,而是将位置的变化传递给view4,

那么view4的水平方向的改变量就是手指在水平方向的滑动距离

d、view4在水平方向改变会触发ViewDragHelper的OnViewPositionChanged(.......)回掉方法,在该回掉方法中处理View1、View2、View3的大小以及位置变化

e、我们以屏幕的水平对称轴作为旋转的中心,手机水平尺寸作为直径,那么view4的水平变化量比上这个模拟的圆的周长就可以得到周期或者说旋转的角度

f、根据这个角度,然后根据三角函数的更改View1、View2、View3的大小以及位置变化,需要注意一点的是,View1、View2、View3位置的变化直接更改其left,right值

调用layout方法可,而View1、View2、View3的大小的变化则变化的是其子view的大小,也就是说,我们并没有真的改变了View1、View2、View3的大小,而是通过

ViewHelper.setScalX(....)和ViewHelper.setScalY(....)Y来等比idea更改子view的大小

g、最后会有一个问题,因为这种方法仅仅是在视觉上实现3d效果,我们会发现在交互过程中,当View1、View2、View3两两重叠的过程会出现大view在前而小view在后的情况,处理这种情况,可以参考笔者的另一文章,专门列举了一些情况,笔者只是尝试了其中的通过添加一组影子view的这种情况,效果是可行的,对于别的情况,知识一种思路,有兴趣的可以自行尝试,

http://blog.csdn.net/jianjiankedizai/article/details/50832608




关于viewDragHelper的具体研究有大神有研究,下面是该框架的事件处理流程

https://www.processon.com/view/link/5550d3dce4b09739f46789bd



猜你喜欢

转载自blog.csdn.net/jianjiankedizai/article/details/50836623
今日推荐