亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > HTML > 正文

基于 HTML5 Canvas實現(xiàn) 的交互式地鐵線路圖

2024-08-26 00:20:29
字體:
供稿:網(wǎng)友

前言

前兩天在 echarts 上尋找靈感的時候,看到了很多有關(guān)地圖類似的例子,地圖定位等等,但是好像就是沒有地鐵線路圖,就自己花了一些時間搗鼓出來了這個交互式地鐵線路圖的 Demo,地鐵線路上的點是在網(wǎng)上隨便下載了一個,這篇文章記錄自己的一些收獲(畢竟我還是個菜鳥)以及代碼的實現(xiàn),希望能夠幫到一些朋友。當(dāng)然,如果有什么意見的可以直接跟我說,大家一起交流才會進(jìn)步。

效果圖

html5,canvas,地鐵線路圖

http://www.hightopo.com/demo/subway/index.html

地圖稍微內(nèi)容有點多,要全部展示,字顯得有點小了,但是沒關(guān)系,可以按照需求放大縮小,字體和繪制的內(nèi)容并不會失真,畢竟都是用矢量繪制的~

界面生成

底層的 div 是通過 ht.graph.GraphView 組件生成的,然后就可以利用 HT for Web 提供好的方法,調(diào)用 canvas 畫筆隨便繪制就好,先來看看怎么生成底層 div:
 

var dm = new ht.DataModel();//數(shù)據(jù)容器var gv = new ht.graph.GraphView(dm);//拓?fù)浣M件gv.addToDOM();//將拓?fù)鋱D組件添加進(jìn)body中

addToDOM 函數(shù)聲明如下:

addToDOM = function(){       var self = this,        view = self.getView(),           style = view.style;    document.body.appendChild(view); //將組件底層div添加到body中               style.left = '0';//默認(rèn)組件是絕對定位,所以要設(shè)置位置    style.right = '0';    style.top = '0';    style.bottom = '0';          window.addEventListener('resize', function () { self.iv(); }, false); //窗口變化事件           }

現(xiàn)在我就可以在這個 div 上亂涂亂畫了~首先我獲取下載好的地鐵線路圖上的點,我將它們放在 subway.js 中,這個 js 文件全部都是下載的內(nèi)容,我沒有做其他的改動,主要是將這些點根據(jù)線路來分分配添加到數(shù)組中,比如:

mark_Point13 = [];//線路 數(shù)組內(nèi)包含線路的起點和終點坐標(biāo)以及這條線路的名稱t_Point13 = [];//換成站點 數(shù)組內(nèi)包含線路中的換乘站點坐標(biāo)以及換成站點名稱n_Point13 = [];//小站點 數(shù)組內(nèi)包含線路中的小站點坐標(biāo)以及小站點名稱mark_Point13.push({ name: '十三號線', value: [113.4973,23.1095]}); mark_Point13.push({ name: '十三號線', value: [113.4155,23.1080]}); t_Point13.push({ name: '魚珠', value: [113.41548,23.10547]}); n_Point13.push({ name: '裕豐圍', value: [113.41548,23.10004]}); 

接下來來描繪地鐵線路,我聲明了一個數(shù)組 lineNum,用來裝 js 中所有的地鐵線路的編號,以及一個 color 數(shù)組,用來裝所有的地鐵線的顏色,這些顏色的 index 與 lineNum 中地鐵線編號的 index 是一一對應(yīng)的:

var lineNum = ['1', '2', '3', '30', '4', '5', '6', '7', '8', '9', '13', '14', '32', '18', '21', '22', '60', '68'];var color = ['#f1cd44', '#0060a1', '#ed9b4f', '#ed9b4f', '#007e3a', '#cb0447', '#7a1a57', '#18472c', '#008193', '#83c39e', '#8a8c29', '#82352b', '#82352b', '#09a1e0', '#8a8c29', '#82352b', '#b6d300', '#09a1e0'];

接著遍歷 lineNum,將 lineNum 中的元素和顏色傳到 createLine 函數(shù)中,根據(jù)這兩個參數(shù)來繪制地鐵線路以及配色,畢竟 js 文件中的命名方式也是有規(guī)律的,哪一條線路,則命名后面一定會加上對應(yīng)的數(shù)字,所以我們只需要將字符串與這個編號結(jié)合即可獲得 js 中對應(yīng)的數(shù)組了:

let lineName = 'Line' + num;let line = window[lineName];createLine 的定義也非常簡單,我的代碼設(shè)置了不少的樣式,所以看起來有點多。創(chuàng)建一個 ht.Polyline 管線,我們可以通過 polyline.addPoint() 函數(shù)向這個變量中添加具體的點,通過 setSegments 可以設(shè)置點的連接方式。function createLine(num, color) {//繪制地圖線    var polyline = new ht.Polyline();//多邊形 管線    polyline.setTag(num);//設(shè)置節(jié)點tag標(biāo)簽,作為唯一標(biāo)示    if(num === '68') polyline.setToolTip('A P M');//設(shè)置提示信息     else if(num === '60') polyline.setToolTip('G F');     else polyline.setToolTip('Line' + num);    if(color) {        polyline.s({//s 為 setStyle 的簡寫,設(shè)置樣式            'shape.border.width': 0.4,//設(shè)置多邊形的邊框?qū)挾?           'shape.border.color': color,//設(shè)置多邊形的邊框顏色            'select.width': 0.2,//設(shè)置選中節(jié)點的邊框?qū)挾?           'select.color': color//設(shè)置選中節(jié)點的邊框顏色        });    }    let lineName = 'Line' + num;    let line = window[lineName];    for(let i = 0; i < line.length; i++) {        for(let j = 0; j < line[i].coords.length; j++) {            polyline.addPoint({x: line[i].coords[j][0]*300, y: -line[i].coords[j][1]*300});            if(num === '68'){//APM線(有兩條,但是點是在同一個數(shù)組中的)                if(i === 0 && j === 0) {                    polyline.setSegments([1]);                }                else if(i === 1 && j === 0) {                    polyline.getSegments().push(1);                }                else {                    polyline.getSegments().push(2);                }            }            }    }    polyline.setLayer('0');//將線設(shè)置在下層,點設(shè)置在上層“top”    dm.add(polyline);//將管線添加進(jìn)數(shù)據(jù)容器中儲存,不然這個管線屬于“游離”狀態(tài),是不會顯示在拓?fù)鋱D上的    return polyline;}

上面代碼中添加地鐵線上的點有分為幾種情況,是因為 js 中設(shè)置線的時候 Line68 有一個“跳躍”點的現(xiàn)象,所以我們必須“跳躍”過去,篇幅有限 Line68 數(shù)組具體的聲明自行看 subway.js。

這里說明一點,如果用的是 addPoint 函數(shù),不設(shè)置 segments 時,默認(rèn)將添加進(jìn)的點用直線連接,segments 的定義如下:

1: moveTo,占用 1 個點信息,代表一個新路徑的起點
 

2: lineTo,占用 1 個點信息,代表從上次最后點連接到該點
 

3: quadraticCurveTo,占用 2 個點信息,第一個點作為曲線控制點,第二個點作為曲線結(jié)束點
 

4: bezierCurveTo,占用 3 個點信息,第一和第二個點作為曲線控制點,第三個點作為曲線結(jié)束點
 

5: closePath,不占用點信息,代表本次路徑繪制結(jié)束,并閉合到路徑的起始點

所以我們要做“跳躍”的行為設(shè)置 segments 為 1 即可。

最后繪制這些地鐵線上的點,這個部分 subway.js 中也分離出來了,命名以“mark_Point”、“t_Point”以及“n_Point”開頭,我在前面 js 的展示部分有對這些數(shù)組進(jìn)行解釋,大家動動中指劃上去看看。

我們在這些點的位置添加 ht.Node 節(jié)點,當(dāng)節(jié)點一添加進(jìn) dm 數(shù)據(jù)容器中時,就會在拓?fù)鋱D上顯示,當(dāng)然,前提是這個拓?fù)鋱D組件 gv 設(shè)置的數(shù)據(jù)容器是這個 dm。篇幅有限,添加地鐵線上的點的代碼部分我只展示添加“換乘站點”的點:

var tName = 't_Point' + num;var tP = window[tName];//大站點if(tP) {//有些線路沒有“換乘站點”    for(let i = 0; i < tP.length; i++) {        let node = createNode(tP[i].name, tP[i].value, color[index]);//在獲取的線路上的點的坐標(biāo)位置添加節(jié)點        node.s({//設(shè)置節(jié)點的樣式style            'label.scale': 0.05,//文本縮放,可以避免瀏覽器限制的最小字號問題            'label.font': 'bold 12px arial, sans-serif'//設(shè)置文本的font        });        node.setSize(0.6, 0.6);//設(shè)置節(jié)點大小。由于js中每個點之間的偏移量太小,所以我不得不把節(jié)點設(shè)置小一些        node.setImage('images/旋轉(zhuǎn)箭頭.json');//設(shè)置節(jié)點的圖片        node.a('alarmColor1', 'rgb(150, 150, 150)');//attr屬性,可以在這里面設(shè)置任何的東西,alarmColor1是在上面設(shè)置的image的json中綁定的屬性,具體參看 HT for Web 矢量手冊(http://www.hightopo.com/guide/guide/core/vector/ht-vector-guide.html#ref_binding)        node.a('alarmColor2', 'rgb(150, 150, 150)');//同上        node.a('tpNode', true);//這個屬性設(shè)置只是為了用來區(qū)分“換乘站點”和“小站點”的,后面會用上    }}

所有的地鐵線路以及站點都添加完畢。但是!你可能會看不見自己繪制的圖,因為他們太小了,這個時候可以設(shè)置 graphView 拓?fù)浣M件上的 fitContent 函數(shù),我們順便將拓?fù)鋱D上的所有東西不可移動也設(shè)置一下:

gv.fitContent(false, 0.00001);//自適應(yīng)大小,參數(shù)1為是否動畫,參數(shù)2為gv與邊框的padding值gv.setMovableFunc(function(){    return false;//設(shè)置gv上的節(jié)點不可移動});

這下你的地鐵線路圖就可以顯示啦~接下來看看交互。

交互

首先是鼠標(biāo)移動事件,鼠標(biāo)滑過具體線路時,線路會變粗,懸停一會兒還能看到這條線路的編號;當(dāng)鼠標(biāo)移動到“換乘站點”或“小站點”,站點對應(yīng)的圖標(biāo)都會變大并且變色,字體也會變大,鼠標(biāo)移開圖標(biāo)變回原來的顏色并且字體變小。不同點在于鼠標(biāo)移動到“換乘站點”時,“換乘站點”會旋轉(zhuǎn)。

html5,canvas,地鐵線路圖

鼠標(biāo)滑動事件,我直接基于 gv 的底層 div 進(jìn)行的 mousemove 事件,通過 ht 封裝的 getDataAt 函數(shù)傳入事件 event 參數(shù),獲取事件下對應(yīng)的節(jié)點,然后就可以隨意操作節(jié)點了:

gv.getView().addEventListener('mousemove', function(e) {    var data = gv.getDataAt(e);//傳入邏輯坐標(biāo)點或者交互event事件參數(shù),返回當(dāng)前點下的圖元    if(name) {        originNode(name);//不管什么時候都要讓節(jié)點保持原來的大小    }    if (data instanceof ht.Polyline) {//判斷事件節(jié)點的類型        dm.sm().ss(data);//選中“管道”        name = '';        clearInterval(interval);    }    else if (data instanceof ht.Node) {        if(data.getTag() !== name && data.a('tpNode')) {//若不是同一個節(jié)點,并且mousemove的事件對象為ht.Node類型,那么設(shè)置節(jié)點的旋轉(zhuǎn)            interval = setInterval(function() {                data.setRotation(data.getRotation() - Math.PI/16); //在自身旋轉(zhuǎn)的基礎(chǔ)上再旋轉(zhuǎn)            }, 100);        }        if(data.a('npNode')) {//如果鼠標(biāo)移到“小站點”也要停止動畫            clearInterval(interval);        }        expandNode(data, name);////自定義的放大節(jié)點函數(shù),比較容易,我不粘代碼了,可以去http://hightopo.com/   查看        dm.sm().ss(data);//設(shè)置選中節(jié)點        name = data.getTag();//作為“上一個節(jié)點”的存儲變量,可以通過這個值來獲取節(jié)點    }    else {//其他任何情況則不選中任何內(nèi)容并且清除“換乘站點”上的動畫        dm.sm().ss(null);        name = '';        clearInterval(interval);    }});

鼠標(biāo)懸停在地鐵線路上時顯示“具體線路信息”,我是通過設(shè)置 tooltip 來完成的(注意:要打開 gv 的 tooltip 開關(guān)):

gv.enableToolTip();//打開 tooltip 的開關(guān)if(num === '68') polyline.setToolTip('A P M');//設(shè)置提示信息 else if(num === '60') polyline.setToolTip('G F'); else polyline.setToolTip('Line' + num);

然后我利用右下角的 form 表單,單擊表單上的具體線路,或者雙擊拓?fù)鋱D上任意一個“站點”或者線路,則拓?fù)鋱D會自適應(yīng)到對應(yīng)的部分,將被雙擊的部分展現(xiàn)到拓?fù)鋱D的中央。

html5,canvas,地鐵線路圖

form 表單的聲明部分我好像還沒有解釋。。。就是通過 new 一個 ht.widget.FomePane 類創(chuàng)建一個 form 表單組件,通過 form.getView() 獲取表單組件的底層 div,將這個 div 擺放在 body 右下角,然后通過 addRow 函數(shù)向 form 表單中添加一行的表單項,可以在這行中添加任意多個項,通過 addRow 函數(shù)的第二個參數(shù)(一個數(shù)組),對添加進(jìn)的表單項進(jìn)行寬度的設(shè)置,通過第三個參數(shù)設(shè)置這行的高度:

function createForm() {//創(chuàng)建右下角的form表單    var form = new ht.widget.FormPane();    form.setWidth(200);//設(shè)置表單寬度    form.setHeight(416);//設(shè)置表單高度    let view = form.getView();    document.body.appendChild(view);//將表單添加進(jìn)body中    view.style.zIndex = 1000;    view.style.bottom = '10px';//ht組件幾乎都設(shè)置絕對路徑    view.style.right = '10px';    view.style.background = 'rgba(211, 211, 211, 0.8)';    names.forEach(function(nameString) {        form.addRow([//向表單中添加行            {//這一行中的第一個表單項                button: {//向表單中添加button按鈕                    icon: 'images/Line'+nameString.value+'.json',//設(shè)置按鈕的圖標(biāo)                    background: '',//設(shè)置按鈕的背景                    borderColor: '',//設(shè)置按鈕的邊框顏色                    clickable: false//設(shè)置按鈕不可點擊                }            },            {//第二個表單項                button: {                    label: nameString.name,                    labelFont: 'bold 14px arial, sans-serif',                    labelColor: '#fff',                    background: '',                    borderColor: '',                    onClicked: function() {//按鈕點擊回調(diào)事件                        gv.sm().ss(dm.getDataByTag(nameString.value));//設(shè)置選中按下的按鈕對應(yīng)的線路                        gv.fitData(gv.sm().ld(), true, 5);//將選中的地鐵線路顯示在拓?fù)鋱D的中央                    }                }            }        ], [0.1, 0.2], 23);//第二個參數(shù)是設(shè)置第一參數(shù)中的數(shù)組的寬度,小于1是比例,大于1是實際寬度。第三個參數(shù)是該行的高度    });}

單擊“站點”顯示紅色標(biāo)注,雙擊節(jié)點自適應(yīng)放置到拓?fù)鋱D中央以及雙擊空白處將紅色標(biāo)注隱藏的內(nèi)容都是通過對拓?fù)浣M件 gv 的事件監(jiān)聽來控制的,非常清晰易懂,代碼如下:

var node = createRedLight();//創(chuàng)建一個新的節(jié)點,顯示為“紅燈”的樣式gv.mi(function(e) {//ht 中拓?fù)浣M件中的事件監(jiān)聽    if(e.kind === 'clickData' && (e.data.a('tpNode') || e.data.a('npNode'))) {//e.kind獲取當(dāng)前事件類型,e.data獲取當(dāng)前事件下的節(jié)點        node.s('2d.visible', true);//設(shè)置node節(jié)點可見        node.setPosition(e.data.getPosition().x, e.data.getPosition().y);//設(shè)置node的坐標(biāo)為當(dāng)前事件下節(jié)點的位置    }    else if(e.kind === 'doubleClickData') {//雙擊節(jié)點        gv.fitData(e.data, false, 10);//將事件下的節(jié)點自適應(yīng)到拓?fù)鋱D的中央,參數(shù)1為自適應(yīng)的節(jié)點,參數(shù)2為是否動畫,參數(shù)3為gv與邊框的padding    }    else if(e.kind === 'doubleClickBackground') {//雙擊空白處        node.s('2d.visible', false);//設(shè)置node節(jié)點不可見 查看 HT for Web 樣式手冊(http://www.hightopo.com/guide/guide/core/theme/ht-theme-guide.html#ref_style)    }});

注意 s(style) 和 a(attr) 定義是這樣的,s 是 ht 預(yù)定義的一些樣式屬性,而 a 是我們用戶來自定義的屬性,一般是通過調(diào)用字符串來調(diào)用結(jié)果的,這個字符串對應(yīng)的可以是常量也可以是函數(shù),還是很靈活的。

最后還做了一個小小的部分,選中“站點”,則該“站點”的上方會顯示一個紅色的會“呼吸”的用來注明當(dāng)前選中的“站點”。

html5,canvas,地鐵線路圖

“呼吸”的部分是利用 ht 的 setAnimation 函數(shù)來完成的,在用這個函數(shù)之前要先打開數(shù)據(jù)容器的動畫開關(guān),然后設(shè)置動畫:

dm.enableAnimation();//打開數(shù)據(jù)容器的動畫開關(guān)function createRedLight() {    var node = new ht.Node();    node.setImage('images/紅燈.json');//設(shè)置節(jié)點的圖片    node.setSize(1, 1);//設(shè)置節(jié)點的大小    node.setLayer('firstTop');//設(shè)置節(jié)點顯示在gv的最上層    node.s('2d.visible', false);//節(jié)點不可見    node.s('select.width', 0);//節(jié)點選中時的邊框為0,不可見    node.s('2d.selectable', false);//設(shè)置這個屬性,則節(jié)點不可選中    node.setAnimation({//設(shè)置動畫 具體參見 HT for Web 動畫手冊(http://www.hightopo.com/guide/guide/plugin/animation/ht-animation-guide.html)        expandWidth: {            property: "width",//設(shè)置這個屬性,并且未設(shè)置 accessType,則默認(rèn)通過 setWidth/getWidth 來設(shè)置和獲取屬性。這里的 width 和下面的 height 都是通過前面設(shè)置的 size 得到的            from: 0.5, //動畫開始時的屬性值            to: 1,//動畫結(jié)束時的屬性值            next: "collapseWidth"//字符串類型,指定當(dāng)前動畫完成之后,要執(zhí)行的下個動畫,可將多個動畫融合        },        collapseWidth: {            property: "width",            from: 1,             to: 0.5,            next: "expandWidth"        },        expandHeight: {            property: "height",            from: 0.5,             to: 1,            next: "collapseHeight"        },        collapseHeight: {            property: "height",            from: 1,             to: 0.5,            next: "expandHeight"        },        start: ["expandWidth", "expandHeight"]//數(shù)組,用于指定要啟動的一個或多個動畫    });    dm.add(node);    return node;}

全部代碼結(jié)束!

總結(jié)

這個 Demo 花了我兩天時間完成,總覺得有點不甘心啊,但是有時候思維又轉(zhuǎn)不過彎來,花費(fèi)了不少的時間,但是總的來說收獲還是很多的,我以前一直以為只要通過 getPoints().push 來向多邊形中添加點就可以了,求助了大神之后,發(fā)現(xiàn)原來這個方法不僅繞彎路而且還會出現(xiàn)各種各樣的問題,比如 getPoints 之前,一定要在多邊形中已經(jīng)有 points 才可以,但是在很多情況下,初始化的 points 并不好設(shè)置,而且會造成代碼很繁瑣,直接通過 addPoint 方法,直接將點添加進(jìn)多邊形變量中,并且還會默認(rèn)將點通過直線的方式連接,也不用設(shè)置 segments,多可愛的一個函數(shù)。

還有就是因為 ht 默認(rèn)縮放大小是 20,而我這個 Demo 的間距又很小,導(dǎo)致縮放到最大地鐵線路圖顯示也很小,所以我在 htconfig 中更改了 ht 的默認(rèn) zoomMax 屬性,記住,更改這個值一定要在所有的 ht 調(diào)用之前,因為在 htconfig 中設(shè)置的值在后面定義都是不可更改的。

以上所述是小編給大家介紹的基于 HTML5 Canvas實現(xiàn) 的交互式地鐵線路圖,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對VeVb武林網(wǎng)網(wǎng)站的支持!

 

注:相關(guān)教程知識閱讀請移步到HTML教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
色综合999| 黄色羞羞视频在线观看| 日本一不卡视频| 亚洲成人五区| 亚洲精品一线二线三线无人区| 在线永久免费观看黄网站| 国产精品视频一区二区三区四| 欧美电影免费| 一本色道久久综合亚洲| 欧美wwwww| 韩日精品视频| 中文国产在线观看| 日韩一级成人av| 中文字幕一区二区在线播放| 日本免费一区视频| 国产无遮挡又黄又爽| 国产88在线观看入口| 欧美视频成人| caoporn国产精品免费公开| 无码国产精品96久久久久| 日韩视频免费| 成人av免费观看| 色婷婷综合网站| 在线日韩影院| av大片在线播放| 国产精品极品美女在线观看免费| 激情六月婷婷久久| 久久精品成人欧美大片| 天堂中文а√在线| 日本一区网站| 成人av在线一区二区| 91视频 -- 69xx| 亚洲一区二区在线免费| 国产精品综合不卡av| 轻轻草在线视频| 久久国产乱子伦免费精品| 久久久爽爽爽美女图片| 动漫一区二区在线| 亚洲国产综合久久| 久久综合视频网| 无人在线观看的免费高清视频| 午夜福利一区二区三区| 亚洲欧美久久久久| 欧美精品久久久久久| 噜噜噜在线观看播放视频| 欧美富婆性猛交| free性欧美69巨大| 国产精品二区一区二区aⅴ污介绍| 欧美欧美全黄| fc2成人免费人成在线观看播放| 国产精品国产三级国产传播| 成人福利视频导航| 成人欧美一区二区三区在线湿哒哒| 日韩欧美国产二区| 精品深夜av无码一区二区老年| 色婷婷综合久久| 久久久国产免费| 国产欧美精品va在线观看| av香蕉成人| 波多野结衣家庭教师在线播放| 亚洲图片欧美视频| 久久精品亚洲一区二区| 久久日免费视频| 欧美成人一区二区| √8天堂资源地址中文在线| 日本精品久久久久中文字幕| 黄色亚洲精品| 久久99精品久久久水蜜桃| 在线观看免费污视频| 亚洲美女福利视频| 女同互添互慰av毛片观看| 成人免费看片载| 精品夜色国产国偷在线| 午夜免费福利视频| 国产人成一区二区三区影院| 久久久久久久久久久国产精品| 欧美日韩国产a| 国产日韩中文在线中文字幕| 国产麻花豆剧传媒精品mv在线| 色综合一区二区三区| 欧美老少配视频| 欧美国产激情视频| 黄色免费电影网站| 日本aa在线| 激情小说亚洲色图| 中文字幕免费在线观看视频| 亚洲一区二区在线| 青娱乐国产盛宴| 第一视频专区在线| 国产精品久久久久久亚洲av| 国产盗摄一区二区三区| 成人av毛片在线观看| 欧洲成人午夜免费大片| 国产伦精品一区二区三区在线观看| 中文字幕久热精品在线视频| 亚洲一区二区三区成人| 成人片黄网站色大片免费毛片| 亚洲国产岛国毛片在线| 日韩网站中文字幕| 婷婷激情一区| 国内精品久久久久国产盗摄免费观看完整版| 亚洲天堂第一页| 在线满18网站观看视频| 黄瓜视频网站| 女人天堂在线| 国产三级精品三级在线观看| 日韩av有码在线| 欧美午夜a级限制福利片| 午夜视频在线免费观看| 欧美精品一区二区久久久| 美女被艹视频网站| 爽爽爽爽爽爽爽成人免费观看| 久久香蕉网站| 视频免费一区二区| 国产精品视频一区视频二区| 久久久久久久久久久99999| 亚洲激情图片qvod| 四虎精品影院在线观看视频| 日本一区二区三区网站| 亚洲一区二区三区精品视频| jizzjizzjizzjizzjizzjizzjizz| 五月婷婷激情综合网| 亚洲 欧美 日韩 综合| 性做久久久久久免费观看| 香蕉久久精品日日躁夜夜躁| 免费污污视频在线观看| 国产精品久久综合青草亚洲AV| 日本成人在线免费| 久久99精品国产99久久6尤物| 人人狠狠综合久久亚洲婷| 丰满少妇高潮久久三区| 丁香资源影视免费观看| 极品白嫩丰满美女无套| a级片免费观看| 久久婷婷久久| 中文国产字幕在线观看| 久久国产一二区| 国产精品亚洲天堂| 日韩精品免费一线在线观看| 亚洲色图综合| 91直播在线观看| 国产小视频自拍| 国产精品91在线观看| 中文字幕av在线一区二区三区| 欧美日韩日本国产| 56国语精品自产拍在线观看| 欧美精品欧美精品系列| 女人黄色片免费| 国产亚洲欧美精品久久久久久| 少妇无套高潮一二三区| 国产色噜噜噜91在线精品| 岛国av一区二区在线在线观看| 国产四区在线观看| 激情文学综合插| 国产原创剧情av| 蜜桃视频在线观看www| 精品视频国内| 99热这里只有精品8| 毛片在线免费视频| 久久r热视频| 三上悠亚一区二区| 色婷婷综合久久久久中文字幕1| 欧美成人观看免费全部完小说| 丰满岳乱妇一区二区三区| 99国产精品免费视频观看| 国产精品欧美在线| av观看成片免费网站| 国产精品视频第一区二区三区| 亚洲国产精品一区制服丝袜| 日韩美女视频在线| 亚洲精品自产拍在线观看app| 日日操夜夜爽| 91九色在线看| 理论片大全免费理伦片| 国产综合成人久久大片91| 91国产精品视频在线| 五月激情丁香一区二区三区| 欧美精品中文| 中文字幕第8页| 网站免费在线观看| 国产成人一区二区三区影院在线| 美女精品久久久| 成年人网站在线观看免费| 91毛片在线观看| 色婷婷av一区二区三区gif| 亚洲精品久久久久中文字幕欢迎你| 亚洲v日本v欧美v久久精品| 三级欧美韩日大片在线看| 亚洲欧美精品中文字幕在线| 人人妻人人澡人人爽精品欧美一区| 天堂av在线免费| 综合激情丁香| 最好看的2019年中文视频| 麻豆精品蜜桃一区二区三区| 91精品国产电影| 一区二区国产在线| 中文字幕av播放| 4438x成人网最大色成网站| 色欲综合视频天天天| 国产精品夫妻自拍| av网站在线看| 亚洲一级二级| 天堂网在线.www天堂在线视频| 国产成人欧美日韩在线电影| 亚洲精品一区二区三区中文字幕| 国产美女裸体无遮挡免费视频| 亚洲婷婷国产精品电影人久久| 亚洲国产导航| 综合综合综合综合综合网| 亚洲第一在线综合在线| 在线看黄的网站| 欧美在线视频导航| 男人添女人下面高潮视频| 天天操天天干天天综合网| 伊人久久综合97精品| 日韩在线视频免费播放| 国产视频精品一区二区三区| 黑人粗进入欧美aaaaa| 日本a在线天堂| 国产精品国产三级国产专播精品人| 国产日韩欧美视频| 色网站免费在线观看| 99精品99久久久久久宅男| 亚洲AV无码乱码国产精品牛牛| 久久久综合久久久| 男人av在线播放| 日韩精品视频在线观看视频| 日本精品视频| 另类小说综合网| 久久国产色av免费观看| 亚洲午夜一区二区三区| 国产美女主播在线观看| 九色porny蝌蚪视频在线观看| 2021天堂中文幕一二区在线观| 国产免费一区二区三区香蕉精| 影音先锋日韩在线| 激情校园亚洲图片| 伊人影院中文字幕| 在线中文字幕亚洲| 国产91免费观看| 欧美肉体xxxx裸体137大胆| 97中文字幕在线观看| 欧美一区成人| 日韩美女主播在线视频一区二区三区| 91精品麻豆| 国内精品久久久久久影院8f| 99riav1国产精品视频| 日本在线视频一区| 亚洲男人天堂影院| 欧美国产日本| 久久天天久久| 四虎影视精品成人| 在线观看欧美| 欧美亚洲国产免费| 青娱乐自拍偷拍| 日本一道本视频| 欧美大奶子在线| 日本大片在线播放| 在线视频一区观看| 日韩.欧美.亚洲| 毛片精品免费在线观看| 91精品国产一区二区三区香蕉| 欧美老女人在线视频| 污污的网站在线观看| www.国产亚洲| 欧美日韩一二三| 男捅女免费视频| 成人高潮视频| 免费污视频在线一区| 一区二区视频免费观看| 亚州av综合色区无码一区| 孩xxxx性bbbb欧美| 9191国语精品高清在线| 国产91久久婷婷一区二区| 九色蝌蚪在线| 国产精品日本一区二区三区在线| 日韩精品――中文字幕| 国产日韩精品一区二区浪潮av| 精品午夜一区二区三区在线观看| 亚洲一区有码| 免费在线一区观看| 精品久久久久久中文字幕大豆网| 国产v日产∨综合v精品视频| 日韩精品在线视频美女| 综合激情网五月| 日本精品一区二区在线观看| 亚洲欧美日韩不卡一区二区三区| 亚洲精品视频99| 国产精品拍天天在线| 一道在线中文一区二区三区| 久久久久综合网| 国产999在线观看| 免费精品一区二区三区在线观看| 欧美一区国产在线| 女同互添互慰av毛片观看| 欧美一区二不卡视频| 亚洲另类中文字| 欧美特大特白屁股xxxx| 久久亚洲精品国产精品紫薇| 污视频免费在线观看网站| 日韩av在线免播放器| 成人免费毛片男人用品| 亚洲精品一区二区三区四区五区| 蜜臀久久99精品久久一区二区| 亚洲伦理精品| 亚洲夜晚福利在线观看| 国产午夜精品一区理论片| 在线观看免费一区二区| 精品无人区一区二区三区| 国产精品视频专区| 影音先锋国产精品| 色婷婷av久久久久久久| 亚洲成人自拍视频| 成人av免费| 日韩专区在线视频| 在线观看国产精品91| 中文字幕在线永久在线视频2020| 亚洲成人精品av| 亚洲天堂一区二区| 91精品国产一区| 亚洲日本黄色片| 色悠久久久久综合先锋影音下载| 国产成人精品av| 91视频福利| 国产精品免费视频一区二区三区| 免费极品av一视觉盛宴| 91极品身材尤物theporn| 国产欧美1区2区3区|