package pro.wizardroid.firebird;
import android.graphics.*;
import android.view.*;
import android.content.*;
import android.widget.*;
public class FireView extends View
{
private Path preVisibleArea = null; /* 非当前页可见区域的区域,包括当前页的背面可见区域和下一页的可见区域 */
private Path currPageBackVisibleArea = null; /* 当前页的背面可见区域 */
private Path nextPageVisibleArea = null; /* 下一页的可见区域 */
Bitmap currPageBitmap = null;
Bitmap nextPageBitmap = null;
PointF touchPoint = new PointF(); /* 屏幕触点 */
PointF cornerPoint = new PointF(); /* 触点对应的页角点 */
PointF Bezier1StartPoint = new PointF(); /* 第一条贝塞尔曲线的起点 */
PointF Bezier1EndPoint = new PointF(); /* 第一条贝塞尔曲线的终点 */
PointF Bezier1CtrlPoint = new PointF(); /* 第一条贝塞尔曲线的控制点 */
PointF Bezier1TangentPoint = new PointF(); /* 第一条贝塞尔曲线上的切点 */
PointF Bezier2StartPoint = new PointF(); /* 第二条贝塞尔曲线的起点 */
PointF Bezier2EndPoint = new PointF(); /* 第二条贝塞尔曲线的终点 */
PointF Bezier2CtrlPoint = new PointF(); /* 第二条贝塞尔曲线的控制点 */
PointF Bezier2TangentPoint = new PointF(); /* 第二条贝塞尔曲线上的切点 */
/* begin:绘制翻起页背面所需的对象 */
ColorMatrix colormatrix = null;
ColorMatrixColorFilter colorFilter = null;
Paint paint = null;
Matrix matrix = null;
/* end:绘制翻起页背面所需的对象 */
Context toastCtx = null;
private int viewWidth;
private int viewHeight;
Scroller scroller = null;
public FireView(Context context)
{
super(context);
toastCtx = context;
scroller = new Scroller(context);
preVisibleArea = new Path();
currPageBackVisibleArea = new Path();
nextPageVisibleArea = new Path();
float array[] = { 0.55f, 0, 0, 0, 80.0f, 0, 0.55f, 0, 0, 80.0f, 0, 0,0.55f, 0, 80.0f, 0, 0, 0, 0.2f, 0 };
colormatrix = new ColorMatrix();
colormatrix.set(array);
colorFilter = new ColorMatrixColorFilter(colormatrix);
matrix = new Matrix();
paint = new Paint();
paint.setStyle(Paint.Style.FILL);
touchPoint.x = 0.1f;
touchPoint.y = 0.1f;
cornerPoint.x = 0;
cornerPoint.y = 0;
}
@Override
protected void onDraw(Canvas canvas)
{
canvas.drawColor(0xFFAAAAAA);
setBezierCurvePoints();
drawCurrPageVisibleArea(canvas, currPageBitmap);
drawNextPageVisibleArea(canvas, nextPageBitmap);
drawCurrPageBackVisibleArea(canvas, currPageBitmap);
}
/* 已知触点和页角点,设置二阶贝塞尔曲线相关的点 */
public void setBezierCurvePoints()
{
/* 令两条贝塞尔曲线的控制点的连线,是触点与页角之间的线段的垂直平分线 */
float midX = (touchPoint.x + cornerPoint.x) / 2;
float midY = (touchPoint.y + cornerPoint.y) / 2;
/* 根据相似三角形边长的比例关系 */
Bezier1CtrlPoint.x = midX - (cornerPoint.y - midY) * (cornerPoint.y - midY) / (cornerPoint.x - midX);
Bezier1CtrlPoint.y = cornerPoint.y;
Bezier2CtrlPoint.x = cornerPoint.x;
Bezier2CtrlPoint.y = midY - (cornerPoint.x - midX) * (cornerPoint.x - midX) / (cornerPoint.y - midY);
/* 令两条贝塞尔曲线的起点的连线,是控制点连线的平行线;且触点与其的距离,是触点到控制点连线距离的一半 */
/* 根据相似三角形边长的比例关系 */
Bezier1StartPoint.x = Bezier1CtrlPoint.x - (cornerPoint.x - Bezier1CtrlPoint.x) / 2;
Bezier1StartPoint.y = cornerPoint.y;
Bezier2StartPoint.x = cornerPoint.x;
Bezier2StartPoint.y = Bezier2CtrlPoint.y - (cornerPoint.y - Bezier2CtrlPoint.y) / 2;
/* 令两条贝塞尔曲线的终点,是起点的连线与两条控制点和触点的连线的交点 */
Bezier1EndPoint = getCrossPoint(touchPoint, Bezier1CtrlPoint, Bezier1StartPoint, Bezier2StartPoint);
Bezier2EndPoint = getCrossPoint(touchPoint, Bezier2CtrlPoint, Bezier1StartPoint, Bezier2StartPoint);
/* 上面形成的贝塞尔曲线的起点、终点、控制点构成等腰三角形 */
/* 同时与两条贝塞尔曲线相切的直线,切点为等腰三角形底边中线的中点 */
Bezier1TangentPoint.x = (Bezier1StartPoint.x + Bezier1EndPoint.x + 2 * Bezier1CtrlPoint.x) / 4;
Bezier1TangentPoint.y = (Bezier1StartPoint.y + Bezier1EndPoint.y + 2 * Bezier1CtrlPoint.y) / 4;
Bezier2TangentPoint.x = (Bezier2StartPoint.x + Bezier2EndPoint.x + 2 * Bezier2CtrlPoint.x) / 4;
Bezier2TangentPoint.y = (Bezier2StartPoint.y + Bezier2EndPoint.y + 2 * Bezier2CtrlPoint.y) / 4;
}
/* 已知两条直线上的各两个点,获得两线的交点——保证有交点 */
public PointF getCrossPoint(PointF p1ofl1, PointF p2ofl1, PointF p1ofl2, PointF p2ofl2)
{
PointF crossPoint = new PointF();
float aofl1;
float bofl1;
float aofl2;
float bofl2;
/* begin:斜率不存在的特殊情况处理 */
if (p2ofl1.x == p1ofl1.x)
{
crossPoint.x = p1ofl1.x;
aofl2 = (p2ofl2.y - p1ofl2.y) / (p2ofl2.x - p1ofl2.x);
bofl2 = (p1ofl2.y * p2ofl2.x - p1ofl2.x * p2ofl2.y) / (p2ofl2.x - p1ofl2.x);
crossPoint.y = aofl2 * crossPoint.x + bofl2;
return crossPoint;
}
if (p2ofl2.x == p1ofl2.x)
{
crossPoint.x = p1ofl2.x;
aofl1 = (p2ofl1.y - p1ofl1.y) / (p2ofl1.x - p1ofl1.x);
bofl1 = (p1ofl1.y * p2ofl1.x - p1ofl1.x * p2ofl1.y) / (p2ofl1.x - p1ofl1.x);
crossPoint.y = aofl1 * crossPoint.x + bofl1;
return crossPoint;
}
/* end:斜率不存在的特殊情况处理 */
/* y = ax + b,a和b未知 */
aofl1 = (p2ofl1.y - p1ofl1.y) / (p2ofl1.x - p1ofl1.x);
bofl1 = (p1ofl1.y * p2ofl1.x - p1ofl1.x * p2ofl1.y) / (p2ofl1.x - p1ofl1.x);
aofl2 = (p2ofl2.y - p1ofl2.y) / (p2ofl2.x - p1ofl2.x);
bofl2 = (p1ofl2.y * p2ofl2.x - p1ofl2.x * p2ofl2.y) / (p2ofl2.x - p1ofl2.x);
/* y = ax + b,x和y未知 */
crossPoint.x = (bofl2 - bofl1) / (aofl1 - aofl2);
crossPoint.y = aofl1 * crossPoint.x + bofl1;
return crossPoint;
}
private void drawCurrPageVisibleArea(Canvas canvas, Bitmap bitmap)
{
preVisibleArea.reset();
preVisibleArea.moveTo(Bezier1StartPoint.x, Bezier1StartPoint.y);
preVisibleArea.quadTo(Bezier1CtrlPoint.x, Bezier1CtrlPoint.y, Bezier1EndPoint.x, Bezier1EndPoint.y);
preVisibleArea.lineTo(touchPoint.x, touchPoint.y);
preVisibleArea.lineTo(Bezier2EndPoint.x, Bezier2EndPoint.y);
preVisibleArea.quadTo(Bezier2CtrlPoint.x, Bezier2CtrlPoint.y, Bezier2StartPoint.x, Bezier2StartPoint.y);
preVisibleArea.lineTo(cornerPoint.x, cornerPoint.y);
preVisibleArea.close();
canvas.save();
canvas.clipPath(preVisibleArea, Region.Op.XOR); /* 补集 */
canvas.drawBitmap(bitmap, 0, 0, null);
canvas.restore();
}
private void drawNextPageVisibleArea(Canvas canvas, Bitmap bitmap)
{
nextPageVisibleArea.reset();
nextPageVisibleArea.moveTo(Bezier1StartPoint.x, Bezier1StartPoint.y);
nextPageVisibleArea.lineTo(Bezier1TangentPoint.x, Bezier1TangentPoint.y);
nextPageVisibleArea.lineTo(Bezier2TangentPoint.x, Bezier2TangentPoint.y);
nextPageVisibleArea.lineTo(Bezier2StartPoint.x, Bezier2StartPoint.y);
nextPageVisibleArea.lineTo(cornerPoint.x, cornerPoint.y);
nextPageVisibleArea.close();
canvas.save();
canvas.clipPath(preVisibleArea);
canvas.clipPath(nextPageVisibleArea, Region.Op.INTERSECT); /* 交集 */
canvas.drawBitmap(bitmap, 0, 0, null);
canvas.restore();
}
private void drawCurrPageBackVisibleArea(Canvas canvas, Bitmap bitmap)
{
currPageBackVisibleArea.reset();
currPageBackVisibleArea.moveTo(Bezier1TangentPoint.x, Bezier1TangentPoint.y);
currPageBackVisibleArea.lineTo(Bezier2TangentPoint.x, Bezier2TangentPoint.y);
currPageBackVisibleArea.lineTo(Bezier2EndPoint.x, Bezier2EndPoint.y);
currPageBackVisibleArea.lineTo(touchPoint.x, touchPoint.y);
currPageBackVisibleArea.lineTo(Bezier1EndPoint.x, Bezier1EndPoint.y);
currPageBackVisibleArea.close();
canvas.save();
canvas.clipPath(preVisibleArea);
canvas.clipPath(currPageBackVisibleArea, Reg
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
FireBird.zip (95个子文件)
Test
app
proguard-rules.pro 695B
src
main
res
drawable-hdpi
ic_launcher.png 9KB
drawable-xhdpi
ic_launcher.png 14KB
drawable-xxhdpi
ic_launcher.png 125KB
values
strings.xml 112B
styles.xml 142B
drawable-mdpi
ic_launcher.png 5KB
layout
main.xml 338B
values-v21
styles.xml 170B
assets
firebird
dawn0008.jpg 421KB
dawn0010.jpg 390KB
dawn0005.jpg 346KB
dawn0003.jpg 478KB
dawn0002.jpg 508KB
dawn0011.jpg 416KB
dawn0007.jpg 456KB
dawn0004.jpg 490KB
dawn0009.jpg 367KB
dawn0001.jpg 157KB
dawn0006.jpg 448KB
dawn0012.jpg 395KB
java
pro
wizardroid
firebird
FireView.java 11KB
MainActivity.java 4KB
AndroidManifest.xml 691B
build
bin
classes.dex 20KB
res
drawable-hdpi
ic_launcher.png 9KB
drawable-xhdpi
ic_launcher.png 14KB
drawable-xxhdpi
ic_launcher.png 52KB
drawable-mdpi
ic_launcher.png 5KB
classesdebug
pro
wizardroid
firebird
MainActivity.class 5KB
BuildConfig.class 777B
R$id$0$debug.class 194B
R$layout.class 836B
R$style$0$debug.class 197B
MainActivity$100000000$0$debug.class 3KB
R$id.class 828B
R$drawable.class 849B
R$0$debug.class 191B
FireView.class 11KB
MainActivity$0$debug.class 5KB
R$layout$0$debug.class 198B
R$attr.class 782B
R$drawable$0$debug.class 200B
R.class 1KB
R$attr$0$debug.class 196B
FireView$0$debug.class 10KB
BuildConfig$0$debug.class 211B
MainActivity$100000000.class 3KB
R$string$0$debug.class 198B
R$string.class 840B
R$style.class 837B
adrt
ADRTReflector.class 11KB
ADRTThreadLocal.class 571B
ADRTLongSet.class 4KB
ADRTLongMap.class 6KB
ADRTSender.class 3KB
ADRT.class 13KB
ADRTMetadata.class 716B
ADRTReceiver.class 2KB
ADRTLogCatReader.class 2KB
ADRTThread.class 14KB
jardex
resources.ap_ 4.84MB
classesrelease
pro
wizardroid
firebird
MainActivity.class 4KB
BuildConfig.class 320B
R$id.dex 768B
R$layout.class 377B
R$id.class 373B
R$drawable.class 388B
BuildConfig.dex 532B
FireView.class 8KB
R.dex 844B
MainActivity.dex 6KB
FireView.dex 9KB
R$drawable.dex 780B
R$attr.class 325B
R$string.dex 776B
R$style.dex 772B
R.class 594B
MainActivity$100000000.class 2KB
R$string.class 381B
MainActivity$100000000.dex 3KB
R$attr.dex 704B
R$style.class 379B
R$layout.dex 772B
adrt
ADRTSender.class 3KB
ADRTSender.dex 3KB
ADRTLogCatReader.class 2KB
ADRTLogCatReader.dex 2KB
injected
AndroidManifest.xml 726B
gen
pro
wizardroid
firebird
BuildConfig.java 165B
R.java 770B
build.gradle 535B
.gitignore 8B
settings.gradle 16B
build.gradle 434B
共 95 条
- 1
资源评论
wizarduestc
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- DSP开发实战教程-国产DSP替代进口TI DSP的使用技巧 进芯DSP替换文件
- 植被恢复能力估算python代码(KNDVI代码).zip
- 基于java打造的深度学习框架,帮助你快速搭建神经网络,实现模型推理与训练,引擎支持自动求导,多线程与GPU运算
- 界线与不动产测绘智能计算经纬度及标注软件
- CANOPEN使用方法与教程
- 极影毁片圆 · 电脑字体设置.zip
- 同态加密部分算法实现Homomorphic-Encryption-main.zip
- helib同态加密socket通信helibsocket-master.zip
- pll_inst.vhd
- 快速入门同态加密homomorphic-encryption-master.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功