这是androids翻页效果原(yuán)理实现之模(mó)拟扭曲下载,使(shǐ)用贝赛尔曲线。曲线有四个点:起始点(diǎn)、终止点(diǎn)(也称锚点)以及两个相互分(fèn)离的中间点(diǎn)。滑动两个(gè)中间点,贝塞尔曲线的形状会发生变化(huà)。
androids翻页效果原理实现之(zhī)模拟扭曲是根据(jù)第一种翻页效果(guǒ)原理(lǐ)可以确定(dìng)a、e、h、f、g ,由(yóu)eh平行于cj且af垂直于eh,则 af垂直于cj则三角形egf相似于三角形cnf 则有ef:cf = gf:nf 。设n为ag中点 则有cf=(3/2)*ef ,则c点(diǎn)坐(zuò)标可求 由c点、k点坐(zuò)标已知(zhī)可知过(guò)两点间(jiān)的直线
由该直线可计算与y轴相交点j 由a、e、c、j可计算(suàn)两条直线(xiàn)的相交点b 同理可求点k。
1.初始化时(shí)创建两个bmp(bmp1、bmp2)并将其转换(huàn)为canvas(canvas1、canvas2)
2.获取手势首次触摸的区域 (例(lì):当首次点击屏幕的位(wèi)置x<50&&y<50则为左(zuǒ)上角)
3.根(gēn)据首次点击区域判断(duàn)需要展示的数据(例:首次(cì)点击处于左侧区域【左上、左下】的(de)则判断操作(zuò)为下(xià)一页操作)
4.获取下一页中数据并绘(huì)制出来在canvas2中
5.根据(jù)1中获取的区域位置调用起始动画使视图移动到手势首次点(diǎn)击位置
6.获取手势每次(cì)移(yí)动的坐标并根据移动坐标计(jì)算绘制的各个点的坐标
7.每次移动(dòng)刷新视图
由上图配合我们上面(miàn)的分(fèn)析(xī)我们可知:DB = 1/4OB,FA = 1/4OA,而点F和点D分别为两条曲(qǔ)线(如无特殊声明,我们所说的曲线均为贝赛尔曲线,下同)的起点(diǎn)(当然你(nǐ)也可以(yǐ)说是终点无所谓),这时(shí),我们以点A、B为曲线的控(kòng)制点并以其(qí)为端点分别沿(yán)着x轴和y轴方向作线段AG、BC,另(lìng)AG = AF、BC = BD,并令(lìng)点(diǎn)G、C分别为曲线(xiàn)的终点,这样,我们的这两条二阶贝塞尔曲(qǔ)线就非常(cháng)非常的特殊,例如上(shàng)图中的曲线DC,它是由起始点D、C和控制点B构成,而(ér)BD = BC,也(yě)就是说三(sān)角形BDC是的等腰三角形,进(jìn)一步(bù)地说就是曲线DC的两条控(kòng)制杆力(lì)臂相等,进(jìn)一步地我们可以推断出曲线DC的顶点(diǎn)J必定在直(zhí)线DC的中(zhōng)垂线上,更(gèng)进一(yī)步地我(wǒ)们可以根据《自定义控件其实很(hěn)简单5/12》所说的二阶贝塞(sāi)尔曲(qǔ)线公式得出当(dāng)且仅当t = 0.5时(shí)曲线的端点刚(gāng)好会在顶点J上(shàng),由此(cǐ)我(wǒ)们(men)可以非常非常简(jiǎn)单地得(dé)到曲线的顶点坐(zuò)标。好了(le),YY归YY我(wǒ)们还是要回归到具体的操作中来,首(shǒu)先(xiān),我们(men)要计(jì)算(suàn)出点(diǎn)G、F、D、C的坐标(biāo)值(zhí),这四点坐标也相当easy,就拿F点(diǎn)坐(zuò)标来说,我们过点F分别作OM、AM的垂(chuí)线:
