github 代码下载地址 :https://github.com/ImmortalZ/StereoView
嗯,2个月没有写博客,是要好好反省下,趁着放暑假把这两个月看的东西好好沉淀下。嗯,就立下这个Flag,希望不要自己再打自己脸。
1.概述
回到正题,这次带来的效果,是一个Android 的3D立体旋转的效果。
当然灵感的来源,来自早些时间微博上看到的效果图。
非常酷有木有!作为程序猿我当然要把它加入我的下一个项目中啦!
原效果
我们实现的效果:
(为了更加可定制化,我在原图基础上新增了新的效果)
可以快速滚动,并且无限循环
这个是对一些参数的进行设定
对图片的包裹效果
因为本身继承自ViewGroup,所以基本控件都是可以包裹的
2.分析
因为代码量有点大,感觉把代码全部粘贴上来也不现实。所以想了解我的思路的盆友可以先来这里下载代码。然后边看代码边看我的分析
下载地址 :https://github.com/ImmortalZ/StereoView
通过我们实现的效果图可以发现:
1.切换的时候是一个3D立体的效果
2.布局中的每一个Item可以自由切换,且无限循环滚动
要解决上面的效果,我们需要什么技术点呢?
1.要想实现一个3D效果,我们可以借助Android中的Camera、Matrix
2.要想实现滚动,毫无疑问,我们需要借助Scroller
当然一切看起来很简单,其实不然,除此之外,你还需要对于滑动冲突进行处理等等,下面我开始介绍啦。
这就是我们这次项目的大致
3.实现
因为我们是要打造一个容器类,所以肯定得继承自 ViewGroup 按照一般的思路,我们肯定是先要进行一些变量的申明,onMeasure,onLayout操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
private void init(Context context) { mCamera = new Camera(); mMatrix = new Matrix(); if (mScroller == null) { mScroller = new Scroller(context); } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); measureChildren(widthMeasureSpec, heightMeasureSpec); mWidth = getMeasuredWidth(); mHeight = getMeasuredHeight(); //滑动到设置的StartScreen位置 scrollTo(0, mStartScreen * mHeight); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { int childTop = 0; for (int i = 0; i < getChildCount(); i++) { View child = getChildAt(i); if (child.getVisibility() != GONE) { child.layout(0, childTop, child.getMeasuredWidth(), childTop + child.getMeasuredHeight()); childTop = childTop + child.getMeasuredHeight(); } } } |
完成这些操作后,我们需要在onTouchEvent中进行滑动事件的处理
3.1 完成无限循环滑动滚动
我们的item数量是有限的,如何实现无限循环滚动呢?很简单,以3个item为例子(分别为1,2,3),我们让屏幕显示的是2
如此反复,屏幕所在的位置始终是第2个item所在的位置,这样就实现了我们的无限循环滚动,向下滚动也是如此
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
@Override public boolean onTouchEvent(MotionEvent event) { if (mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain(); } mVelocityTracker.addMovement(event); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (!mScroller.isFinished())Z/StereoView
1.概述回到正题,这次带来的效果,是一个Android 的3D立体旋转的效果。 原效果 我们实现的效果: (为了更加可定制化,我在原图基础上新增了新的效果) 可以快速滚动,并且无限循环 这个是对一些参数的进行设定 对图片的包裹效果 因为本身继承自ViewGroup,所以基本控件都是可以包裹的 2.分析
下载地址 :https://github.com/ImmortalZ/StereoView 通过我们实现的效果图可以发现: 1.切换的时候是一个3D立体的效果 2.布局中的每一个Item可以自由切换,且无限循环滚动 要解决上面的效果,我们需要什么技术点呢? 1.要想实现一个3D效果,我们可以借助Android中的Camera、Matrix 2.要想实现滚动,毫无疑问,我们需要借助Scroller 当然一切看起来很简单,其实不然,除此之外,你还需要对于滑动冲突进行处理等等,下面我开始介绍啦。 这就是我们这次项目的大致 3.实现
完成这些操作后,我们需要在onTouchEvent中进行滑动事件的处理 3.1 完成无限循环滑动滚动
|