先上图为敬,看完以后感兴趣的同窗在接着看下去-_-~~git
看完你们应该知道这是用来作什么的啦,没错,这是一个屏幕内任意 I 或者正反L不规则手势切换汽车挡位,根据当前所在挡位,限制垂直 I 或者正反L滑动(I L不要求很规范,可是也不能太过于倾斜弯曲).github
先说下前戏,某天早上小二正在偷偷摸鱼,领导把我叫过去开会,要作一个汽车挡位功能,这个和真实汽车同样,根据当前挡位来换挡,因为是手机操做,能够不限制跑道滑动,要求能够任意屏幕内I 正反L滑动切换挡位,小二脑子里一下想出 挡位 手势 切换的场景,怎么根据当前挡位计算垂直I 正反L滑动,这时候领导又提了一点。小二 手势切换挡位不要求限制跑道 规范手势切换。咦~~~ 这不是为难我小二么..心里自我YY中,好了,前戏结束,上代码思路流程canvas
首先第一步:确定要先画挡位和跑道,这里因为时间缘由,小二就没有用画布来画了,直接是布局写死了,主要讲的是手势 轨迹。数组
咱们先来分析一下怎么画轨迹线,当咱们手指触摸(Down)的时候做为起点,而后不断的移动(MOVE),不断的获取坐标经过画布绘制线,手指松开(UP)做为终点,听起来很简单吧。 可是实际效果是这样子的:布局
怎么回事画布DrawLines出来的线怎么都是虚线,咱们不是传了移动的坐标给了画布了么? 常常画view的伙伴能够跳过这一步骤,基础很差的同窗要认真听讲。this
咱们手指点 不断移动这中间产生了无数个坐标点(x,y),而后画布绘制线路,DrawLines是这样绘制的 两个点做为一条线相连,如图所示:spa
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
this.canvas = canvas;
potsList.clear();
for (int i = 0; i < pots.size(); i++) {
if (i >= 2 && i % 2 == 0) {
String[] pre_split = pots.get(i - 1).split(":");
String[] current_split = pots.get(i).split(":");
//这是为了让虚线之间连起来
potsList.add(Float.valueOf(pre_split[0]));
potsList.add(Float.valueOf(pre_split[1]));
potsList.add(Float.valueOf(current_split[0]));
potsList.add(Float.valueOf(current_split[1]));
potsList.add(Float.valueOf(current_split[0]));
potsList.add(Float.valueOf(current_split[1]));
} else {
String[] current_split = pots.get(i).split(":");
potsList.add(Float.valueOf(current_split[0]));
potsList.add(Float.valueOf(current_split[1]));
}
}
float[] mPOts = new float[potsList.size()];
for (int i = 0; i < potsList.size(); i++) {
mPOts[i] = potsList.get(i);
}
canvas.drawLines(mPOts, paint);
}
复制代码
那么就能够产生咱们想要的结果展现,以下图:3d
好了, 开始下一个步骤。code
咱们来分析一下 I手势,那 x的坐标必定是在可控范围,不能太过于倾斜,因此x左右浮动我这里限制了60之内,即 用户按下(down)做为判断依据点,作一个标识位,移动(move)过程当中产生的每个点都要跟依据点的坐标x对比,是否在左右60范围内,只要有一个坐标点超出,标识位即为false,那么用户松开手的时候判断一下标识位,真,就根据当前挡位来升档降档,假,则不处理。 如图:cdn
因为是不规则,就是容许中间有一些弯曲,只要不严重便可,因此,想用数学公式来计算 直角判断的同窗,别异想天开了,想出需求的人怎么可能那么容易放过你,(¬︿̫̿¬☆)哼哼。
先来讲下思路,正反L,说到正反,爱动脑的童鞋,是否是知道第一个步骤先怎么走了。嘿嘿嘿~ 1:咱们先判断哪个轴做为起始点,即当前处于正L仍是反7,这一点其实b很容易判断,正L,咱们判断移动中x轴浮动在依据点必定范围,y轴也是限制在必定范围,而且永州偏移大于x轴,例如x一直在依据点范围100之内,而y轴的偏移量大于x,且移动的y轴距离开始的依据点y轴坐标大于120(固然,这个长度根据我的喜欢任意调整),到了这里,咱们已经能知道如今是处于正L的垂直线了,以此位转折点,而后在反过来判断,只要有y轴限制浮动在100内,x轴浮动大于120,那么条件成立,这是一个不规则L,那么就能够根据当前挡位来换挡。反7,原理和上面同样,只是相反了而已。今天就说那么多了,可能说的不是那么的详细,没有多么的高深,只是记录一下平常的需求,源码连接放下面,欢迎大大们完善,指导~