Android自定义View——从零开始实现书籍翻页效果(一)

本文介绍如何从零开始在Android中实现书籍翻页效果,详细讲解了如何绘制连接各标识点的A、B、C区域,涉及自定义View的宽高测量、贝塞尔曲线和PorterDuffXfermode的使用。提供了完整代码示例,包括计算点坐标、绘制路径和区域闭合。
摘要由CSDN通过智能技术生成

defaultWidth = 600;
defaultHeight = 1000;

viewWidth = defaultWidth;
viewHeight = defaultHeight;

a = new MyPoint(400,800);
f = new MyPoint(viewWidth,viewHeight);
g = new MyPoint();
e = new MyPoint();
h = new MyPoint();
c = new MyPoint();
j = new MyPoint();
b = new MyPoint();
k = new MyPoint();
d = new MyPoint();
i = new MyPoint();
calcPointsXY(a,f);

pointPaint = new Paint();
pointPaint.setColor(Color.RED);
pointPaint.setTextSize(25);

bgPaint = new Paint();
bgPaint.setColor(Color.GREEN);
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//为了看清楚点与View的位置关系绘制一个背景
canvas.drawRect(0,0,viewWidth,viewHeight,bgPaint);
//绘制各标识点
canvas.drawText(“a”,a.x,a.y,pointPaint);
canvas.drawText(“f”,f.x,f.y,pointPaint);
canvas.drawText(“g”,g.x,g.y,pointPaint);

canvas.drawText(“e”,e.x,e.y,pointPaint);
canvas.drawText(“h”,h.x,h.y,pointPaint);

canvas.drawText(“c”,c.x,c.y,pointPaint);
canvas.drawText(“j”,j.x,j.y,pointPaint);

canvas.drawText(“b”,b.x,b.y,pointPaint);
canvas.drawText(“k”,k.x,k.y,pointPaint);

canvas.drawText(“d”,d.x,d.y,pointPaint);
canvas.drawText(“i”,i.x,i.y,pointPaint);
}

/**

  • 计算各点坐标
  • @param a
  • @param f
    */
    private void calcPointsXY(MyPoint a, MyPoint f){
    g.x = (a.x + f.x) / 2;
    g.y = (a.y + f.y) / 2;

e.x = g.x - (f.y - g.y) * (f.y - g.y) / (f.x - g.x);
e.y = f.y;

h.x = f.x;
h.y = g.y - (f.x - g.x) * (f.x - g.x) / (f.y - g.y);

c.x = e.x - (f.x - e.x) / 2;
c.y = f.y;

j.x = f.x;
j.y = h.y - (f.y - h.y) / 2;

b = getIntersectionPoint(a,e,c,j);
k = getIntersectionPoint(a,h,c,j);

d.x = (c.x + 2 * e.x + b.x) / 4;
d.y = (2 * e.y + c.y + b.y) / 4;

i.x = (j.x + 2 * h.x + k.x) / 4;
i.y = (2 * h.y + j.y + k.y) / 4;
}

/**

  • 计算两线段相交点坐标
  • @param lineOne_My_pointOne
  • @param lineOne_My_pointTwo
  • @param lineTwo_My_pointOne
  • @param lineTwo_My_pointTwo
  • @return 返回该点
    */
    private MyPoint getIntersectionPoint(MyPoint lineOne_My_pointOne, MyPoint lineOne_My_pointTwo, MyPoint lineTwo_My_pointOne, MyPoint lineTwo_My_pointTwo){
    float x1,y1,x2,y2,x3,y3,x4,y4;
    x1 = lineOne_My_pointOne.x;
    y1 = lineOne_My_pointOne.y;
    x2 = lineOne_My_pointTwo.x;
    y2 = lineOne_My_pointTwo.y;
    x3 = lineTwo_My_pointOne.x;
    y3 = lineTwo_My_pointOne.y;
    x4 = lineTwo_My_pointTwo.x;
    y4 = lineTwo_My_pointTwo.y;

float pointX =((x1 - x2) * (x3 * y4 - x4 * y3) - (x3 - x4) * (x1 * y2 - x2 * y1))
/ ((x3 - x4) * (y1 - y2) - (x1 - x2) * (y3 - y4));
float pointY =((y1 - y2) * (x3 * y4 - x4 * y3) - (x1 * y2 - x2 * y1) * (y3 - y4))
/ ((y1 - y2) * (x3 - x4) - (x1 - x2) * (y3 - y4));

return new MyPoint(pointX,pointY);
}
}

实体类MyPoint用来存放我们的标识点坐标

public class M

  • 30
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值