移動(dòng)端頁(yè)面的多點(diǎn)觸控——旋轉(zhuǎn)

今早在segmentfault上看到一篇文章《超小Web手勢(shì)庫(kù)AlloyFinger原理》,最后提到一個(gè)多點(diǎn)觸控的介紹蛋铆,因?yàn)闆](méi)寫(xiě)過(guò)所以覺(jué)得應(yīng)該蠻有意思,以下是我寫(xiě)完旋轉(zhuǎn)demo后,對(duì)問(wèn)題從分析到解決的過(guò)程:

  1. 多點(diǎn)觸控如何判定衡瓶?
var touchStart = function(event){
        if( event.touches.length == 2 ){
            startVector.x1 = event.touches[0].pageX ;
            startVector.y1 = event.touches[0].pageY ;
            startVector.x2 = event.touches[1].pageX ;
            startVector.y2 = event.touches[1].pageY ;
        }
     };
container.addEventListener('touchstart', touchStart );

當(dāng)你把兩個(gè)手指放在container上之后,event.touches這個(gè)數(shù)組的長(zhǎng)度變?yōu)?牲证。然后從里面取出所需坐標(biāo)即可哮针。

  1. 針對(duì)旋轉(zhuǎn)問(wèn)題,角度如何計(jì)算坦袍?

這里要用到向量的點(diǎn)乘十厢,先上個(gè)公式:
a?b = a.x乘b.x + a.y乘b.y = |a||b|cosθ

這里a.x代表a向量的x,a.y代表a向量的y键闺, |a|代表向量的模寿烟,也就是長(zhǎng)度。
通過(guò)點(diǎn)乘的公式辛燥,我們可以把cosθ算出來(lái)筛武,然后進(jìn)行一些從弧度到角度的轉(zhuǎn)換:

var cos  = calculateVM( vector1 , vector2 );
var angle = Math.acos(cos) * 180/ Math.PI ;

但是我們知道cosθ的范圍是-1到1,也就是從0度到180度挎塌,因此在360度旋轉(zhuǎn)時(shí)徘六,無(wú)法確定方向。

3.如何判斷旋轉(zhuǎn)方向榴都?

這里要用到向量的叉乘待锈。簡(jiǎn)單的說(shuō),叉乘計(jì)算結(jié)果的數(shù)值部分嘴高,對(duì)應(yīng)兩個(gè)向量圍成的平行四邊形的面積竿音,而正負(fù)值則對(duì)應(yīng)法向量的方向和屎,法向量的方向符合“右手定則”。于是我們通過(guò)計(jì)算結(jié)果的正負(fù)春瞬,來(lái)判斷旋轉(zhuǎn)是順時(shí)針還是逆時(shí)針柴信。
叉乘公式:

叉乘.png

理論部分結(jié)束了,下面進(jìn)入實(shí)戰(zhàn)宽气。
首先随常,需要為container綁定各種touch事件:

container.addEventListener('touchstart', touchStart );
container.addEventListener('touchmove', touchMove );
container.addEventListener('touchend', touchEnd );

我們?cè)趖ouchStart里記錄起始向量(由兩個(gè)觸點(diǎn)的位置表示),touchMove記錄移動(dòng)過(guò)程中的向量萄涯,touchEnd里對(duì)歷史角度進(jìn)行存儲(chǔ)绪氛。
然后定義一些數(shù)據(jù)結(jié)構(gòu):

    var startVector = {
        x1 : 0 ,
        x2 : 0 ,
        y1 : 0 ,
        y2 : 0 
    };
    var currentVector = {
        x1 : 0 ,
        x2 : 0 ,
        y1 : 0 ,
        y2 : 0 
    };

    function vector( x1, y1 , x2, y2 ){
        this.x = x2-x1;
        this.y = y2-y1;
    };

然后寫(xiě)一些公式:

//計(jì)算點(diǎn)乘
    function calculateVM( vector1, vector2 ){
        return (vector1.x * vector2.x + vector1.y * vector2.y)  / ( Math.sqrt(vector1.x * vector1.x + vector1.y * vector1.y) * Math.sqrt(vector2.x * vector2.x + vector2.y * vector2.y)) ;

    }
    //計(jì)算叉乘
    function calculateVC( vector1, vector2 ){
        return (vector1.x * vector2.y - vector2.x * vector1.y) > 0? 1: -1 ;
    }

寫(xiě)touchmove的時(shí)候,要注意旋轉(zhuǎn)角度的累計(jì):

              var vector1 = new vector(startVector.x1, startVector.y1, startVector.x2,startVector.y2);
            var vector2 = new vector(currentVector.x1, currentVector.y1, currentVector.x2,currentVector.y2);
              var cos  = calculateVM( vector1 , vector2 );
            var angle = Math.acos(cos) * 180/ Math.PI ;

            var direction = calculateVC( vector1, vector2 );
            console.log( ' ' + angle+ ' '+ direction);
            _allDeg = direction*angle;
            
            container.style.webkitTransform = 'rotate(' + (_historyDeg+_allDeg) + 'deg)';

并在touchEnd里對(duì)historyDeg進(jìn)行記錄:

          if( endMark == false ){
            _historyDeg += _allDeg;
                endMark = true ;
        }

這里為什么增加了一個(gè)標(biāo)志位涝影,原因是兩個(gè)手指分別會(huì)調(diào)用一次touchEnd枣察,而我只需要記錄一次....

demo和代碼在這里,請(qǐng)用手機(jī)打開(kāi)袄琳,兩個(gè)手指進(jìn)行旋轉(zhuǎn)询件。

最后,我們?cè)趺凑{(diào)試唆樊?由于原來(lái)一直使用的jsconsole掛了宛琅,搜了一下,發(fā)現(xiàn)eruda非常好用逗旁,強(qiáng)烈推薦嘿辟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市片效,隨后出現(xiàn)的幾起案子红伦,更是在濱河造成了極大的恐慌,老刑警劉巖淀衣,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昙读,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡膨桥,警方通過(guò)查閱死者的電腦和手機(jī)蛮浑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)只嚣,“玉大人沮稚,你說(shuō)我怎么就攤上這事〔嵛瑁” “怎么了蕴掏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我盛杰,道長(zhǎng)挽荡,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任饶唤,我火速辦了婚禮徐伐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘募狂。我一直安慰自己,他們只是感情好角雷,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布祸穷。 她就那樣靜靜地躺著,像睡著了一般勺三。 火紅的嫁衣襯著肌膚如雪雷滚。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,394評(píng)論 1 310
  • 那天吗坚,我揣著相機(jī)與錄音祈远,去河邊找鬼。 笑死商源,一個(gè)胖子當(dāng)著我的面吹牛车份,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播牡彻,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼扫沼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了庄吼?” 一聲冷哼從身側(cè)響起缎除,我...
    開(kāi)封第一講書(shū)人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎总寻,沒(méi)想到半個(gè)月后器罐,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渐行,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年轰坊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片殊轴。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡衰倦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出旁理,到底是詐尸還是另有隱情樊零,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站驻襟,受9級(jí)特大地震影響夺艰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沉衣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一郁副、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧豌习,春花似錦存谎、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至栋艳,卻和暖如春恰聘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吸占。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工晴叨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人矾屯。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓兼蕊,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親问拘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子遍略,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 數(shù)學(xué)是計(jì)算機(jī)技術(shù)的基礎(chǔ),線(xiàn)性代數(shù)是機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的基礎(chǔ)骤坐,了解數(shù)據(jù)知識(shí)最好的方法我覺(jué)得是理解概念绪杏,數(shù)學(xué)不只是上學(xué)...
    闖王來(lái)了要納糧閱讀 22,706評(píng)論 2 48
  • 歐拉旋轉(zhuǎn)、四元數(shù)纽绍、矩陣旋轉(zhuǎn)之間的差異 除了歐拉旋轉(zhuǎn)以外蕾久,還有兩種表示旋轉(zhuǎn)的方式:矩陣旋轉(zhuǎn)和四元數(shù)旋轉(zhuǎn)。接下來(lái)我們比...
    AndrewFan閱讀 2,536評(píng)論 0 3
  • 記筆記是一門(mén)學(xué)問(wèn)拌夏。通過(guò)網(wǎng)絡(luò)了解到cornell notes, 所以僧著,什么是康奈爾筆記法呢? 與猜測(cè)一致障簿,康奈爾筆記...
    Hopstar閱讀 1,137評(píng)論 0 1
  • 回顧這幾個(gè)月………拼命的在人前裝著自己不在乎盹愚、自己很開(kāi)心、自己很順利站故。簡(jiǎn)歷陸陸續(xù)續(xù)投了4個(gè)月皆怕,可是情況沒(méi)有好轉(zhuǎn)毅舆,自...
    Ineiyo閱讀 274評(píng)論 0 0
  • 昨晚看了部老片子‘KALIFORNIA’(加州殺手)脱篙。這是布拉德·皮特年輕時(shí)演的一部黑色犯罪片族操。里面另一位男主角壮莹,...
    東城子閱讀 1,021評(píng)論 0 1