先上圖爲敬,看完以後感興趣的同窗在接着看下去-_-~~git
看完你們應該知道這是用來作什麼的啦,沒錯,這是一個屏幕內任意 I 或者正反L不規則手勢切換汽車擋位,根據當前所在擋位,限制垂直 I 或者正反L滑動(I L不要求很規範,可是也不能太過於傾斜彎曲).github
先說下前戲,某天早上小二正在偷偷摸魚,領導把我叫過去開會,要作一個汽車擋位功能,這個和真實汽車同樣,根據當前擋位來換擋,因爲是手機操做,能夠不限制跑道滑動,要求能夠任意屏幕內I 正反L滑動切換擋位,小二腦子裏一下想出 擋位 手勢 切換的場景,怎麼根據當前擋位計算垂直I 正反L滑動,這時候領導又提了一點。小二 手勢切換擋位不要求限制跑道 規範手勢切換。咦~~~ 這不是爲難我小二麼..心裏自我YY中,好了,前戲結束,上代碼思路流程canvas
首先第一步:確定要先畫擋位和跑道,這裏因爲時間緣由,小二就沒有用畫布來畫了,直接是佈局寫死了,主要講的是手勢 軌跡。數組
咱們先來分析一下怎麼畫軌跡線,當咱們手指觸摸(Down)的時候做爲起點,而後不斷的移動(MOVE),不斷的獲取座標經過畫布繪製線,手指鬆開(UP)做爲終點,聽起來很簡單吧。 可是實際效果是這樣子的:佈局
怎麼回事畫布DrawLines出來的線怎麼都是虛線,咱們不是傳了移動的座標給了畫布了麼? 常常畫view的夥伴能夠跳過這一步驟,基礎很差的同窗要認真聽講。this
咱們手指點 不斷移動這中間產生了無數個座標點(x,y),而後畫布繪製線路,DrawLines是這樣繪製的 兩個點做爲一條線相連,如圖所示:spa
這和咱們的實際需求是徹底不一致的,咱們要的是起點-移動點-終點一條線,究其緣由,是由於DrawLines內部是兩個座標做爲t連線,即便咱們傳進去了移動的無數座標數據數組,出來的也只會是無數條線。那麼?咱們怎麼能讓相鄰的兩條線路鏈接呢? 想想DrawLines是兩個座標做爲一條線,那麼咱們就能夠在座標數據數組上作一下手腳啊, 只須要判斷角標2的倍數時候,在他前面 插入當前座標-1的座標數據 和當前座標的數據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,原理和上面同樣,只是相反了而已。今天就說那麼多了,可能說的不是那麼的詳細,沒有多麼的高深,只是記錄一下平常的需求,源碼連接放下面,歡迎大大們完善,指導~