Android翻页效果原理实现之引入折线

Android翻页效果原理实现之引入折线

ID:39464584

大小:878.50 KB

页数:41页

时间:2019-07-03

Android翻页效果原理实现之引入折线_第1页
Android翻页效果原理实现之引入折线_第2页
Android翻页效果原理实现之引入折线_第3页
Android翻页效果原理实现之引入折线_第4页
Android翻页效果原理实现之引入折线_第5页
资源描述:

《Android翻页效果原理实现之引入折线》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Android翻页效果原理实现之引入折线先以折页的方式对翻页过程进行一个细致的分析,然后再在下一节将折线变为曲线。折页的实现可分为两种方式,一种是纯计算,我们利用已知的条件根据各类公式定理计算出未知的值,第二种呢则是通过图形的组合巧妙地去获取图形的交并集来实现,第二种方式需要很好的空间想象力这里就先不说了,而第一种纯计算的方式呢又可以分为使用高等数学和解三角形两种方法,前者对于数学不好的童鞋来说不易理解,这里我们选择后者使用解三角形来计算,首先我们先来搞个简单的辅助图:图很简单,一看就懂,大家可以拿个本子或者书尝试折

2、页,不管你如何折,折叠区域AOB和下一页显示的区域APB必定是完全相等的对吧,那么我们就可以得到一个惊人的事实:角AOB恒为直角,这时我们来添加一些辅助线便于理解:我们设折叠后的三角形AOB的短边长度为x而长边长度为y,由图可以得出以下运算:我们可以使用相同的方法去解得y的值,这里我使用的是等面积法,由图可知梯形MOBP的面积是三角形MOA、AOB、APB面积之和:我们可以使用相同的方法去解得y的值,这里我使用的是等面积法,由图可知梯形MOBP的面积是三角形MOA、AOB、APB面积之和:这样我们可以根据任意一点得出

3、两边边长,我们来代码中实践一下看看是不是这样的呢?为了便于理解,这里我重新使用了一个新的FoldView:[java]viewplaincopyprint?publicclassFoldViewextendsView{publicFoldView(Contextcontext,AttributeSetattrs){super(context,attrs);}}那么尝试根据我们以上分析的原理来绘制这么一个折页的效果,获取事件点、获取控件宽高就不说了,我们重点来看看onDraw中的计算:[java]viewplainco

4、pyprint?@OverrideprotectedvoidonDraw(Canvascanvas){//重绘时重置路径mPath.reset();//绘制底色canvas.drawColor(Color.WHITE);/**如果坐标点在右下角则不执行绘制*/if(pointX==0&&pointY==0){return;}/**额,这个该怎么注释好呢……根据图来*/floatmK=mViewWidth-pointX;floatmL=mViewHeight-pointY;//需要重复使用的参数存值避免重复计算floa

5、ttemp=(float)(Math.pow(mL,2)+Math.pow(mK,2));/**计算短边长边长度*/floatsizeShort=temp/(2F*mK);floatsizeLong=temp/(2F*mL);/**生成路径*/mPath.moveTo(pointX,pointY);mPath.lineTo(mViewWidth,mViewHeight-sizeLong);mPath.lineTo(mViewWidth-sizeShort,mViewHeight);mPath.close();//绘制

6、路径canvas.drawPath(mPath,mPaint);}每次绘制的时候我们需要重置Path不然上一次的Path就会跟这一次叠加在一起,效果如下:(PS:动态效果图MicrosoftWord2003不好上传只有截图)效果是大致出来了,但是我们发现有一处不对的地方,当我们非常靠左或非常靠下地折叠时:如果再往左折此时我们的Path就会消失掉,其实这跟我们我们现实中的折页是一样的,折页的过程是有限制的,如下图:右下角点P因为受装订线的制约,其半径最大只能为纸张的宽度,如果我们始终以该宽度为半径折页,那么点P的轨迹就

7、可以形成曲线Q,图中半透明红色区域为一个半圆形,也就是说,我们的点P只能在该范围内才应当有效对吧,那么该如何做限制呢?很简单,我们只需在计算长短边长之前判断触摸点是否在该区域即可:[java]viewplaincopyprint?/***计算短边的有效区域*/privatevoidcomputeShortSizeRegion(){//短边圆形路径对象PathpathShortSize=newPath();//用来装载Path边界值的RectF对象RectFrectShortSize=newRectF();//添加圆形

8、到PathpathShortSize.addCircle(0,mViewHeight,mViewWidth,Path.Direction.CCW);//计算边界pathShortSize.computeBounds(rectShortSize,true);//将Path转化为RegionmRegionShortSize.setPath(path

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。