精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

孩子喜歡飛機,于是我給她做了一個雷達

開發 后端
作為一名非物理移動技術主管,我確實不知道從哪里開始為孩子打造一匹搖馬,但沒有什么能阻止我把這個想法變成一個很酷的應用程序。

今年夏天,我計劃帶著我的孩子出國。

她很興奮。

在此之前,我和妻子決定大肆宣傳一下這次的飛行之旅,主要是為了確保女兒能安穩地度過3小時的飛行時間。

可能是我們宣傳有點過頭了,以至于當我們不得不坐出租車去機場時,我蹣跚學步的孩子感到震驚——她原本以為會從我們家直接走上飛機。

我們登機后,發生了一件令人難以置信的事情。

原來,當機組人員發現你和一個癡迷于飛機的可愛小孩在一起時,他們會邀請你們去看看駕駛艙。

這激發了我女兒對飛機的癡迷。

從那之后,她一直要求我在天上為她尋找飛機,當我為她找到一架飛機時,她很高興。

上周,我們在花園里待了一個小時,她坐在我的肩上,看著飛機一架接一架地在夜空中閃爍。

后來我找到了FlightRadar24,它能顯示覆蓋在地圖上的飛機位置,但美中不足的是,我必須自己調整方向。

圖片

但是,對于一個孩子來說,她可能并不真正理解或關心地圖是什么。

所以我們有了繼續解決的新問題,比如方向,比如可用性。

作為一名非物理移動技術主管,我確實不知道從哪里開始為孩子打造一匹搖馬,但沒有什么能阻止我把這個想法變成一個很酷的應用程序。

在雷達上顯示附近的航班

通過研究制定的要求:

  • 該應用程序需要保持正確的方向,隨設備旋轉,以便顯示飛機的正確方向。
  • 該應用程序必須根據飛機的高度將飛機圖標顯示為更大或更小。
  • 該應用程序必須很有趣,要有一種復古兒童玩具的感覺,而不是嚴肅的商業應用程序。

這些要求導致了一些構成概念驗證的活動部分:

  • 保持方向是差異化產品的核心要求,因為現有解決方案缺少這一點。我不關心詳細的航班信息,我只是想制作一個很酷的雷達。iOS 核心位置API已被涵蓋,每次用戶重新調整設備方向時都會提供委托回調。
  • 最重要的組件是Flight Data API。OpenSky Network正是我所需要的。一個簡單的REST API,免費供非商業用途,包含某個區域的航班實時數據。我們希望每隔幾秒就對這個端點執行操作,以進行真實的雷達掃描。
  • 為了調用 API,還需要一些位置數據。Core Location可供查詢距用戶位置+/-1度的緯度,精度為0.1度(約10公里),以確保用戶的位置足夠模糊。我們也只需要在每個會話中獲取一次該數據。
  • 最后,我們需要重新掌握三角學技能,將飛行位置數據與我們自己的定向坐標進行比較。這將使我們能夠根據附近的飛機在天空中與我們的相對位置,將其繪制到屏幕上的正確位置。

概念驗證

對于圖標,我選擇了一幅女兒戴著可愛飛行員帽的卡通畫。所以我們已經有了應用程序名稱:Aviator。

方向

第一個關鍵差異化產品要求是保持方向。

為了使用便利,屏幕上的對象需要與其現實生活中的位置相對應。因此,當用戶旋轉時,屏幕本身也會旋轉并保持指向北。

final class LocationManager: CLLocationManager, CLLocationManagerDelegate {
        
    static let shared = LocationManager()
    
    private(set) var rotationAngleSubject = CurrentValueSubject<Double, Never>(0)
    
    override private init() {
        super.init()
        requestWhenInUseAuthorization()
        delegate = self
        startUpdatingHeading()
    }
    
    func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {
        rotationAngleSubject.send(-newHeading.magneticHeading)
    }
}

同時,為了獲得好看的指南針效果,我還繪制了一組隨旋轉角度變化的矩形。

@State private var rotationAngle: Angle = .degrees(0)
var body: some View {
    ZStack {
        ForEach(0..<36) {
            let angle = Angle.degrees(Double($0 * 10)) + rotationAngle
            Rectangle()
                .frame(width: $0 == 0 ? 16 : 8, height: $0 == 0 ? 3 : 2)
                .foregroundColor($0 == 0 ? .red : .blue)
                .rotationEffect(angle)
                .offset(x: 120 * cos(CGFloat(angle.radians)), y: 120 * sin(CGFloat(angle.radians)))
                .animation(.bouncy, value: rotationAngle)
        }
    }
    .onReceive(LocationManager.shared.rotationAngleSubject) { angle in
        rotationAngle = Angle.degrees(angle)
    }
}

看起來相當不錯,而且也完美地響應了我的真實位置。

圖片

可能你會注意到一個有趣的視覺故障,因為動畫邏輯將0度和360度視為單獨的數字——當我經過正北時,所有矩形都會旋轉。

航班數據

熱身結束,接下來是重要的部分。

OpenSky Network API允許用戶給定一系列緯度和經度,通過一個簡單的請求返回該范圍內的本地航班數組。這意味著,只需將其粘貼到瀏覽器中,即可找出我可以看到的頭頂上空的航班數據。

REST API記錄良好,但數據按順序顯示為列表屬性。

圖片

我們需要去解碼它,讓其按順序從JSON響應中解析出字段。

struct Flight: Decodable {
    let icao24: String 
    let callsign: String?
    let origin_country: String? 
    let time_position: Int?
    let last_contact: Int
    let longitude: Double
    let latitude: Double
    // ... 
    init(from decoder: Decoder) throws {
        var container = try decoder.unkeyedContainer()
        icao24 = try container.decode(String.self)
        callsign = try? container.decode(String?.self)
        origin_country = try container.decode(String.self)
        time_position = try? container.decode(Int?.self)
        last_contact = try container.decode(Int.self)
        longitude = try container.decode(Double.self)
        latitude = try container.decode(Double.self)
        // ...
    }
}

我們還可以編寫一個簡單的API,根據用戶的位置坐標執行請求。

final class FlightAPI {
    
    func fetchLocalFlightData(coordinate: CLLocationCoordinate2D) async throws -> [Flight] {
        
        let lamin = String(format: "%.1f", coordinate.latitude - 0.25)
        let lamax = String(format: "%.1f", coordinate.latitude + 0.25)
        let lomin = String(format: "%.1f", coordinate.longitude - 0.5)
        let lomax = String(format: "%.1f", coordinate.longitude + 0.5)


        let url = URL(string: "https://opensky-network.org/api/states/all?lamin=\(lamin)&lamax=\(lamax)&lomin=\(lomin)&lomax=\(lomax)")!
        let data = try await URLSession.shared.data(from: url).0
        return try JSONDecoder().decode([Flight].self, from: data)
    }
}

這樣飛行數據就被很好地解析為內存中對象的數組,也變得易于處理。

初步結果

如何實際測試飛機圖紙的準確性?

我們可以在這些所有東西下面畫一張地圖:AviatorView頂部的指南針,繪制到屏幕上的飛機,以及樸素的SwiftUI視圖。

@State private var cameraPosition: MapCameraPosition = .camera(MapCamera(
        centerCoordinate: CLLocationCoordinate2D(latitude: 51.0, longitude: 0.0),
        distance: 100_000,
        heading: 0))
var body: some View {
    ZStack {
        Map(position: $cameraPosition) { } 
        airplanes
        compass
    }
}

這是我第一次熬夜跑出來的結果,與作為事實來源的FlightRadar進行比較。

圖片

可以看到,天空中飛機的數量和集群看起來都差不多,但位置卻相差甚遠。忽然,我靈光一閃,原來還需要使用注釋在地圖上繪制飛機。

MVP

這個想法我已經醞釀了一整天:我們使用地圖,然后在其精確地理位置的頂部繪制飛機形狀的注釋,最終,我想找到一種方法來隱藏實際地圖,并僅將飛機顯示為雷達位置上的標記。

這應該會給我們帶來我們想要的很酷的、完全定向的雷達效果。

地圖注釋

在iOS 17中,在地圖上繪制注釋非常簡單。

import MapKit
import SwiftUI
struct FlightMapView: View {
    
    @Binding var cameraPosition: MapCameraPosition
    
    let flights: [Flight]
    var body: some View {
        Map(position: $cameraPosition) {
            planeMapAnnotations
        }
        .mapStyle(.imagery)
        .allowsHitTesting(false)
    }
}

在這里,出于雷達的目的,我們希望防止命中測試——即我不希望地圖是交互式的。在構想中,地圖是不可見的,用戶只能看到航班及其位置。

飛機縮放

定位之后,尺寸調整是下一個核心問題,現有的解決方案根本無法很好地處理這個問題。

我使用飛行高度在地圖注釋中添加了一些簡單的對數縮放,以便更高的飛機在屏幕上顯得更大。此外,我使用飛機的真實屬性,結合核心位置中的用戶方向,來顯示飛機面向正確的方向。

@State private var rotationAngle: Angle = .degrees(0)
private var planeMapAnnotations: some MapContent {
    ForEach(flights, id: \.icao24) { flight in
        Annotation(flight.icao24, coordinate: flight.coordinate) {
            let rotation = rotationAngle.degrees + flight.true_track
            let scale = min(2, max(log10(height + 1), 0.5))
            Image(systemName: "airplane")
                .rotationEffect(.degrees(rotation))
                .scaleEffect(scale)
            }
        }
        .tint(.white)
    }
}

用戶調研

現在是進行終極測試的時候了。

我和女兒一起去看飛機,現在我們有了真實的地圖注釋,能在地圖上顯示用戶的位置和方向。最重要的是,它能夠準確地找到飛機!

圖片

這獲得了巨大成功,因為我們在這上面找到了飛機。

初步測試還得出了兩條重要信息。

首先,縮放邏輯是不正確的。看看倫敦城市機場地面上的小飛機。由于應用程序的重點是定位天空中的飛機,因此我們需要反轉縮放比例,較低的平面必須顯示得更大,因為我們是用眼睛來發現它們的。

其次,我的孩子不關心地圖,只關心飛機。如果我想消除噪音并專注于發現飛機,我需要刪除地圖,并開始建造我的雷達!

更新縮放邏輯

我輕松地修復了飛機的縮放邏輯。

經過一番嘗試和錯誤后,為了查看屏幕上看起來不錯的內容,并給出合理的尺寸分布,我選擇了縮放:

min(2, max(4.7 - log10(flight.geo_altitude + 1), 0.7))

這些縮放來自我的本地開銷掃描:

Scale:  1.0835408863965839
Scale:  0.8330645861650874
Scale:  1.095791123396205
Scale:  1.1077242935783653
Scale:  2.0
Scale:  1.4864702267977097
Scale:  0.7

創建雷達

我幾乎準備好建造我所設想的雷達了,但是出現了一個問題。

API穩健性

開源OpenSky API不斷超時,返回502錯誤,或者有時生成帶有空數據的200響應。

這其實也不是問題,畢竟這不是個企業級應用程序,而且這個API不需要我花任何費用。他們沒有SLA,我也覺得自己沒有資格獲得SLA。不過為了幫助提高客戶端的穩健性,我在API調用中實現了一些基本的重試邏輯:

private func fetchFlights(at coordinate: CLLocationCoordinate2D, retries: Int = 3) async {
    do {
        try await api.fetchLocalFlightData(coordinate: coordinate)
    } catch {
        if retries > 0 {
            try await fetchFlights(at: coordinate, retries: retries - 1)
        }
    }
}

第二天,API運行良好,除了某些高流量時刻外。

覆蓋地圖

最重要的降噪任務是使實際地圖不可見。沒有這個雷達就無法工作。

我能夠使用MapPolygon來做到這一點,表面上設計這樣你就可以放置疊加層來突出顯示地圖的各個部分。但我想用它來隱藏除注釋之外的所有內容。

struct FlightMapView: View {
    var body: some View {
        Map(position: $cameraPosition) {
            planeMapAnnotations
            MapPolygon(overlay(coordinate: coordinate))
        }
        .mapStyle(.imagery)
        .allowsHitTesting(false)
    }
    // ...   
    private func rectangle(around coordinate: CLLocationCoordinate2D) -> [CLLocationCoordinate2D] {
        [
            CLLocationCoordinate2D(latitude: coordinate.latitude - 1, longitude: coordinate.longitude - 1),
            CLLocationCoordinate2D(latitude: coordinate.latitude - 1, longitude: coordinate.longitude + 1),
            CLLocationCoordinate2D(latitude: coordinate.latitude + 1, longitude: coordinate.longitude + 1),
            CLLocationCoordinate2D(latitude: coordinate.latitude + 1, longitude: coordinate.longitude - 1)
        ]
    }
    
    private func overlay(coordinate: CLLocationCoordinate2D) -> MKPolygon {
        let rectangle = rectangle(around: coordinate)
        return MKPolygon(coordinates: rectangle, count: rectangle.count)
    }
}

這種方法很有效!

我們現在可以看到飛機,但看不到地圖,就像我們想要的那樣。

最關鍵的是,蘋果將疊加層設計為位于地圖頂部、注釋下方,如果他們采取其他方式,我女兒的新玩具就會跛行。

繪制雷達

核心需求的最后一部分是雷達視圖,這本質上是一組直線、同心圓和20度的旋轉角梯度。

難不倒我。

用戶調研2

經過三個晚上的辛苦工作,女兒終于開始對我創造的玩具表現出一些興趣。

圖片

我們已經證明了這個概念,并構建了一個 MVP,可以實現我們設定的核心初始目標。

現在可以考慮把它放到App Store上了。

當然在此之前還需要進行其他的優化。

比如讓雷達有360度寬角漸變,從綠色,到透明,到透明,到透明,再到黑色。

private var radarLine: some View {
    Circle()
        .fill(
            AngularGradient(
                gradient: Gradient(colors: [
                    Color.black, Color.black, Color.black, Color.black,
                    Color.black.opacity(0.8), Color.black.opacity(0.6),
                    Color.black.opacity(0.4), Color.black.opacity(0.2),
                    Color.clear, Color.clear, Color.clear, Color.clear,
                    Color.clear, Color.clear, Color.clear, Color.clear,
                    Color.clear, Color.clear, Color.clear, Color.green]),
                center: .center,
                startAngle: .degrees(rotationDegree),
                endAngle: .degrees(rotationDegree + 360)
            )
        )
        .rotationEffect(Angle(degrees: rotationDegree))
        .animation(.linear(duration: 6).repeatForever(autoreverses: false), value: rotationDegree)
}

除此之外,我添加了CRT屏幕效果和電視掃描線,使應用程序看起來就像是在舊雷達掃描儀上繪制的。

#include <metal_stdlib>
using namespace metal;
[[ stitchable ]] half4 crtScreen(
    float2 position,
    half4 color,
    float time
) {
    
    if (all(abs(color.rgb - half3(0.0, 0.0, 0.0)) < half3(0.01, 0.01, 0.01))) {
        return color;
    }
    
    const half scanlineIntensity = 0.2;
    const half scanlineFrequency = 400.0;
    half scanlineValue = sin((position.y + time * 10.0) * scanlineFrequency * 3.14159h) * scanlineIntensity;
    return half4(color.rgb - scanlineValue, color.a);
}

我還創建了一個視圖修改器,可以將CRT效果應用到喜歡的任何視圖。

extension View {
    
    func crtScreenEffect(startTime: Date) -> some View {
        modifier(CRTScreen(startTime: startTime))
    }
}
struct CRTScreen: ViewModifier {
    
    let startTime: Date
    
    func body(content: Content) -> some View {
        content
            .colorEffect(
                ShaderLibrary.crtScreen(
                    .float(startTime.timeIntervalSinceNow)
                )
            )
    }
}

圖片

目前該應用程序已經上線了App Store。


圖片

同時下個版本的新功能也已經在構想中了,包括但不限于:

  • 向地圖添加縮放級別,以將雷達限制為僅檢測較近的飛機。
  • 使用OpenSky Network API的高級版本顯示直升機、衛星和飛機尺寸類別。
  • 切換飛機上的出發地和目的地國家/地區顯示。
  • 使用更先進的金屬著色器改善CRT屏幕效果。
  • 實施滑塊控件來過濾掉某些距離和高度,例如隱藏所有低矮、遙遠的飛機。
  • 實施“滑稽模式”,在雷達上呈現不明飛行物、巨型蟲子和外星人。
責任編輯:姜華 來源: 大數據文摘
相關推薦

2022-02-22 20:35:22

公鑰私鑰數據

2025-03-06 13:10:32

2019-05-23 08:55:41

代碼開發工具

2022-12-05 18:17:06

技術

2016-12-14 10:00:44

數據結構編譯器

2020-07-15 15:09:21

Python掃雷游戲Windows

2020-05-08 13:28:53

新擬物UI設計

2018-01-15 15:00:06

工程師項目設計師

2022-05-30 08:02:51

事務日志MySQL數據庫

2020-11-16 09:02:38

Python開發工具

2021-04-29 15:53:21

AI 數據人工智能

2025-09-01 00:00:00

2020-06-02 16:38:24

華為

2021-03-02 07:33:10

VSCode插件代碼

2015-05-21 15:46:20

2015-10-15 09:58:26

HRMMMicroservic微服務

2012-09-11 13:34:27

HTML5JS

2020-04-14 10:32:10

劉強東管理快遞

2020-07-27 08:31:45

控制流通用結構

2019-08-12 10:27:34

前端程序員網絡
點贊
收藏

51CTO技術棧公眾號

狠狠噜天天噜日日噜| 亚洲一区二区三区在线免费观看| 成人片黄网站色大片免费毛片| 亚洲天堂电影| 亚洲欧洲在线观看av| 亚洲已满18点击进入在线看片 | 中文字幕中文乱码欧美一区二区| 91黄在线观看| 无码人妻精品一区二区三区9厂| 久久一本综合| 日韩电影中文字幕在线| 午夜激情av在线| www中文字幕在线观看| 国产日韩欧美精品一区| 99伊人久久| 精品一区二三区| 亚洲大胆av| 日韩在线视频二区| 国产精品无码午夜福利| 久久99成人| 欧美性猛片xxxx免费看久爱| 国产欧美日韩小视频| 欧美激情午夜| 国产三区在线成人av| 国产成人免费观看| 国产精品探花视频| 日韩av网站免费在线| 97精品一区二区三区| 一级性生活免费视频| 国产伦一区二区三区| 亚洲第一中文字幕| 国产乱码一区二区三区四区| 久久福利在线| 欧洲亚洲国产日韩| av天堂永久资源网| 成年人黄色大片在线| 亚洲曰韩产成在线| 中文字幕av日韩精品| 国模精品一区二区| 久久久综合精品| 国产精品对白刺激久久久| 亚洲在线观看av| 天堂久久一区二区三区| 538国产精品一区二区在线| 麻豆chinese极品少妇| 99热国内精品| xxxxx成人.com| 国产无遮挡在线观看| 亚洲欧洲av| 亚洲开心激情网| 久久久久国产精品区片区无码| 国产精品久久久网站| 日韩一区二区精品| 在线观看一区二区三区视频| 亚洲午夜免费| 精品福利一二区| 风韵丰满熟妇啪啪区老熟熟女| 欧美日本三级| 欧美成va人片在线观看| 伊人影院在线观看视频| 99精品国产一区二区三区2021 | 国产精品高精视频免费| 波多野结衣影片| 男女激情视频一区| 国产精品久久av| 91成品人影院| 久久国产夜色精品鲁鲁99| 91精品久久久久久综合乱菊| 国产精品日韩无码| 国产盗摄视频一区二区三区| 国产尤物99| 欧美少妇另类| 国产精品成人免费在线| 老司机午夜网站| 丁香高清在线观看完整电影视频| 午夜精品久久久久久久蜜桃app| 免费在线观看亚洲视频| 日本中文字幕一区二区| 欧美日韩国产一级片| 人妻换人妻仑乱| 丝袜美腿综合| 日韩最新在线视频| 国产午夜视频在线播放| 久久一二三区| 91丨九色丨国产在线| 亚洲AV无码一区二区三区少妇| 成年人网站91| 色一情一乱一伦一区二区三欧美| 老司机在线永久免费观看| 亚洲伊人色欲综合网| 国产日韩一区二区在线| 婷婷久久综合九色综合99蜜桃| 日韩精品一区二区三区蜜臀| 一区二区三区少妇| 手机在线电影一区| 性日韩欧美在线视频| 中文字幕在线观看精品| www.日韩在线| 中文字幕乱码一区二区三区| 韩国精品一区| 欧美精品日韩综合在线| 中国极品少妇videossexhd| 波多野结衣在线观看一区二区| 欧美成人性生活| 五月天激情四射| 国产一区二区三区视频在线播放| 精品日产一区2区三区黄免费| 在线a人片免费观看视频| 最新国产精品久久精品| 欧美韩国日本在线| 亚洲午夜精品| 久久精品福利视频| 草莓视频18免费观看| 丰满亚洲少妇av| 亚洲国产精品视频一区| 三妻四妾的电影电视剧在线观看| 91麻豆精品国产91久久久久久| 亚洲久久久久久| 亚洲影视一区| 国产精品入口尤物| 深夜福利视频在线免费观看| 一区二区高清免费观看影视大全 | 在线免费观看一区二区三区| 少妇在线看www| 日韩欧美国产午夜精品| av免费播放网站| 国产美女一区| 精品欧美一区二区在线观看视频| av色综合久久天堂av色综合在| 欧美性大战久久| 一级肉体全黄裸片| 亚洲欧美日韩精品一区二区| 国产伦精品一区二区三区四区免费| 免费av在线网站| 欧美性xxxxxxxx| 国产又粗又猛又爽又黄av | 色戒在线免费观看| 精品国产一区二区三区久久久蜜臀| 亚洲18私人小影院| 欧美在线精品一区二区三区| 亚洲最快最全在线视频| 深爱五月综合网| 小处雏高清一区二区三区| 国产精品日韩欧美综合| av在线免费观看网站| 91国产免费观看| 伊人网在线视频观看| 亚洲欧美视频| 蜜桃导航-精品导航| 午夜影院在线播放| 亚洲精品午夜精品| 无码任你躁久久久久久久| 久久久久久久综合日本| 久久综合久久色| 欧美性感美女一区二区| 国产精品免费电影| 国产网站在线免费观看| 日韩一级大片在线| 日韩乱码一区二区| 91视视频在线直接观看在线看网页在线看| 国产精品自拍片| 影视先锋久久| 国产日本欧美一区二区三区在线| 欧美性videos| 日韩欧美黄色影院| 日韩伦理在线视频| 久久久久9999亚洲精品| 污污动漫在线观看| 午夜精品久久| 女同一区二区| 国产亚洲精品精品国产亚洲综合| 久久在精品线影院精品国产| www.五月婷婷| 日韩欧美高清视频| 99自拍偷拍视频| 成人午夜在线免费| 免费日韩视频在线观看| 国产精品不卡| 国产有色视频色综合| 九色porny视频在线观看| 揄拍成人国产精品视频| 国产女人高潮毛片| 欧美日韩亚洲一区二| 国产精品久久久久久成人| 国产成人精品一区二| 国产原创popny丨九色| 成人精品影院| 成人免费看片网址| 精品成人av| 欧美大片在线看| 国产51人人成人人人人爽色哟哟| 日韩欧美一区电影| 日批视频免费在线观看| 亚洲欧美日韩国产综合| 女同毛片一区二区三区| 激情欧美一区二区三区在线观看| 人妻少妇精品无码专区二区| 日韩精品四区| 久久久久成人精品免费播放动漫| 亚洲成人毛片| 日韩av理论片| 波多野一区二区| 久久国产精品久久久久| 久蕉在线视频| 亚洲国产精品久久精品怡红院| 精品乱码一区内射人妻无码| 亚洲成人免费影院| 日本裸体美女视频| 久久久噜噜噜久噜久久综合| 欧美激情 亚洲| 精品一区二区三区免费| 国产精品亚洲二区在线观看| 国内精品99| 综合操久久久| 欧美熟乱15p| 久久国产精品一区二区三区| 国产亚洲高清一区| 国产精品一区二区三区久久| 一区二区三区电影大全| 欧美激情免费在线| 欧美尤物美女在线| 亚洲偷欧美偷国内偷| 熟妇高潮一区二区高潮| 日韩一级精品视频在线观看| 一卡二卡在线视频| 欧美性受xxxx| 国产真人无遮挡作爱免费视频| 亚洲一区二区三区影院| 在线观看成人毛片| 亚洲四区在线观看| 天天色天天综合| 国产精品欧美综合在线| 好吊视频在线观看| 91婷婷韩国欧美一区二区| 蜜臀av粉嫩av懂色av| 国产成人精品三级麻豆| 激情成人在线观看| 国产麻豆成人传媒免费观看| 欧美激情国内自拍| 精品一区二区三区在线观看| 69久久久久久| 久久精品国产精品青草| 中文字幕成人在线视频| 理论电影国产精品| 日韩中文字幕a| 精品在线播放免费| 日本超碰在线观看| 另类成人小视频在线| www.这里只有精品| 六月丁香婷婷色狠狠久久| 少妇一级淫免费播放| 久草热8精品视频在线观看| 免费成年人高清视频| 精品亚洲porn| 国产精品欧美性爱| 99精品欧美一区二区三区小说| 欧类av怡春院| 久久精品亚洲国产奇米99| 亚洲第一综合网| 国产精品视频yy9299一区| 99久久久免费精品| 亚洲精品日韩综合观看成人91| 69av视频在线| 一区二区三区四区av| 日韩欧美亚洲视频| 在线观看日韩一区| 国产又大又粗又硬| 精品久久久三级丝袜| 天堂在线视频免费| 亚洲天堂色网站| 免费在线看黄网站| 久久久久久国产| 欧美三级网址| 成人字幕网zmw| 超碰在线一区| 日本一区高清在线视频| 午夜片欧美伦| 天堂…中文在线最新版在线| 久久精品一区二区三区中文字幕| 狠狠操狠狠干视频| 成人高清视频免费观看| 久久久久亚洲av无码a片| 日韩一区中文字幕| 国产稀缺真实呦乱在线| 在线免费观看一区| 99久久久久久久| 亚洲精品中文字| 国产一二区在线观看| 97成人精品区在线播放| 成人午夜在线| 精品日产一区2区三区黄免费| 欧美成人激情| 日本精品免费在线观看| 国产综合色产在线精品| 在线观看av中文字幕| 中文字幕在线视频一区| 精品国产免费观看| 欧美精品少妇一区二区三区| 五月天婷婷激情网| 久久精品一本久久99精品| 亚洲欧美韩国| 91久久极品少妇xxxxⅹ软件 | 法国空姐在线观看免费| 夜夜嗨网站十八久久| 天堂av2020| 久久蜜臀精品av| 亚洲一区二区91| 777xxx欧美| 日本人妖在线| 久久久久女教师免费一区| 免费一区二区三区四区| 精品久久精品久久| 欧美 日韩 国产精品免费观看| 亚洲综合在线网站| 91一区二区三区在线播放| 成熟的女同志hd| 欧美日韩一区二区三区视频| 青青九九免费视频在线| 97国产一区二区精品久久呦| 日韩高清在线观看一区二区| 中文字幕中文字幕在线中一区高清| 玖玖视频精品| 粉嫩av蜜桃av蜜臀av| 亚洲一区二区五区| 国产99对白在线播放| 色狠狠av一区二区三区香蕉蜜桃| 性孕妇free特大另类| 亚洲free嫩bbb| 久久久久久久久久久妇女| 三级a在线观看| 国产日韩欧美电影| 亚洲图片欧美日韩| 国产视频精品在线| 涩涩视频在线免费看| 久久久com| 亚洲欧美日韩国产一区二区| 中国黄色a级片| 大荫蒂欧美视频另类xxxx| 天天摸天天碰天天爽天天弄| 欧美精品福利在线| 精品成人自拍视频| 成人一区二区免费视频| av电影天堂一区二区在线观看| 久久久久久久久久久97| 日韩精品一区二区三区在线 | 人妻 丝袜美腿 中文字幕| 亚洲欧美一区二区三区国产精品| 97久久人国产精品婷婷| 久久精品视频网站| 日韩08精品| 亚洲美免无码中文字幕在线| 久久只精品国产| 无码人妻熟妇av又粗又大 | 99久久精品免费观看国产| 91精品免费视频| 欧美成人高清| 加勒比精品视频| 91福利视频网站| 欧美激情二区| av在线不卡一区| 亚洲免费黄色| 男人天堂av电影| 欧美精品粉嫩高潮一区二区| 97影院秋霞午夜在线观看| 国产精品久久久久久久小唯西川 | 91亚洲精品一区二区| 午夜精品亚洲| 中文字幕乱码在线| 色视频欧美一区二区三区| 欧美日本一道| 国产麻豆日韩| 三级一区在线视频先锋| 永久免费看片视频教学| 日韩精品专区在线影院重磅| 日本不卡1234视频| 日韩在线导航| 国产一本一道久久香蕉| 成人午夜视频精品一区| 在线视频日韩精品| 伊色综合久久之综合久久| 国产成人无码精品久久久性色| 中文av一区二区| 亚洲黄色精品视频| 国产精品第10页| 欧美啪啪一区| 欧洲美一区二区三区亚洲| 日韩色视频在线观看| 欧美大电影免费观看| 一级黄色录像免费看| 91在线码无精品| 91成人一区二区三区| 3344国产精品免费看| 外国成人免费视频| 国产ts丝袜人妖系列视频| 欧美福利视频一区| 国产精品伦理| 99热这里只有精品免费| 日本一区二区动态图| 人妻91麻豆一区二区三区| 国产一区二区在线免费|