日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android应用坐标系统全面详解

發(fā)布時(shí)間:2025/4/16 Android 70 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android应用坐标系统全面详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Android應(yīng)用坐標(biāo)系統(tǒng)全面詳解

原文鏈接:CSDN@工匠若水,http://blog.csdn.net/yanbober/article/details/50419117

1. 背景

去年有很多人私信告訴我讓說(shuō)說(shuō)自定義控件,其實(shí)通觀網(wǎng)絡(luò)上的很多博客都在講各種自定義控件,但是大多數(shù)都是授之以魚(yú),卻很少有較為系統(tǒng)性授之于漁的文章,同時(shí)由于自己也遲遲沒(méi)有時(shí)間規(guī)劃這一系列文章,最近想將這一系列文章重新提起來(lái),所以就來(lái)先總結(jié)一下自定義控件的一個(gè)核心知識(shí)點(diǎn)——坐標(biāo)系。

很多人可能不屑一顧Android的坐標(biāo)系,但是如果你想徹底學(xué)會(huì)自定義控件,我想說(shuō)了解Android各種坐標(biāo)系及一些API的坐標(biāo)含義絕對(duì)算一個(gè)小而不可忽視的技能;所謂Android自定義View那幾大主要onXXX()方法的重寫(xiě)實(shí)質(zhì)其實(shí)大多數(shù)都是在處理坐標(biāo)邏輯運(yùn)算,所以我們就先來(lái)就題重談一下Android坐標(biāo)系。

2. Android坐標(biāo)系

說(shuō)到Android坐標(biāo)系其實(shí)就是一個(gè)三維坐標(biāo),Z軸向上,X軸向右,Y軸向下。這三維坐標(biāo)的點(diǎn)處理就能構(gòu)成Android豐富的界面或者動(dòng)畫(huà)等效果,所以Android坐標(biāo)系在整個(gè)Android界面中算是蓋樓房的尺寸草圖,下面我們就來(lái)看看這些相關(guān)的概念。

2-1 Android屏幕區(qū)域劃分

我們先看一副圖來(lái)了解一下Android屏幕的區(qū)域劃分(關(guān)于這個(gè)東西的深入探討你可以看下《Android應(yīng)用setContentView與LayoutInflater加載解析機(jī)制源碼分析 》一文,那兒給出了部分原理的解釋),如下:

通過(guò)上圖我們可以很直觀的看到Android對(duì)于屏幕的劃分定義。下面我們就給出這些區(qū)域里常用區(qū)域的一些坐標(biāo)或者度量方式。如下:

//獲取屏幕區(qū)域的寬高等尺寸獲取 DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); int widthPixels = metrics.widthPixels; int heightPixels = metrics.heightPixels; //應(yīng)用程序App區(qū)域?qū)捀叩瘸叽绔@取 Rect rect = new Rect(); getWindow().getDecorView().getWindowVisibleDisplayFrame(rect); //獲取狀態(tài)欄高度 Rect rect= new Rect(); getWindow().getDecorView().getWindowVisibleDisplayFrame(rect); int statusBarHeight = rectangle.top; //View布局區(qū)域?qū)捀叩瘸叽绔@取 Rect rect = new Rect(); getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(rect);

特別注意:上面這些方法最好在Activity的onWindowFocusChanged ()方法或者之后調(diào)運(yùn),因?yàn)橹挥羞@時(shí)候才是真正的顯示OK,不懂的可以看我之前關(guān)于setContentView相關(guān)的博客。

2-2 Android View絕對(duì)相對(duì)坐標(biāo)系

上面我們分析了Android屏幕的劃分,可以發(fā)現(xiàn)我們平時(shí)開(kāi)發(fā)的重點(diǎn)其實(shí)都在關(guān)注View布局區(qū)域,那么下面我們就來(lái)細(xì)說(shuō)一下View區(qū)域相關(guān)的各種坐標(biāo)系。先看下面這幅圖:

通過(guò)上圖我們可以很直觀的給出View一些坐標(biāo)相關(guān)的方法解釋,不過(guò)必須要明確的是上面這些方法必須要在layout之后才有效,如下:

View的靜態(tài)坐標(biāo)方法解釋
getLeft()返回View自身左邊到父布局左邊的距離
getTop()返回View自身頂邊到父布局頂邊的距離
getRight()返回View自身右邊到父布局左邊的距離
getBottom()返回View自身底邊到父布局頂邊的距離
getX()返回值為getLeft()+getTranslationX(),當(dāng)setTranslationX()時(shí)getLeft()不變,getX()變。
getY()返回值為getTop()+getTranslationY(),當(dāng)setTranslationY()時(shí)getTop()不變,getY()變。

同時(shí)也可以看見(jiàn)上圖中給出了手指觸摸屏幕時(shí)MotionEvent提供的一些方法解釋,如下:

MotionEvent坐標(biāo)方法解釋
getX()當(dāng)前觸摸事件距離當(dāng)前View左邊的距離
getY()當(dāng)前觸摸事件距離當(dāng)前View頂邊的距離
getRawX()當(dāng)前觸摸事件距離整個(gè)屏幕左邊的距離
getRawY()當(dāng)前觸摸事件距離整個(gè)屏幕頂邊的距離

上面就解釋了你在很多代碼中看見(jiàn)各種getXXX方法進(jìn)行數(shù)學(xué)邏輯運(yùn)算判斷的含義。不過(guò)上面只是說(shuō)了一些相對(duì)靜止的Android坐標(biāo)點(diǎn)關(guān)系,下面我們來(lái)看看幾個(gè)和上面方法緊密相關(guān)的View方法。如下:

View寬高方法解釋
getWidth()layout后有效,返回值是mRight-mLeft,一般會(huì)參考measure的寬度(measure可能沒(méi)用),但不是必須的。
getHeight()layout后有效,返回值是mBottom-mTop,一般會(huì)參考measure的高度(measure可能沒(méi)用),但不是必須的。
getMeasuredWidth()返回measure過(guò)程得到的mMeasuredWidth值,供layout參考,或許沒(méi)用。
getMeasuredHeight()返回measure過(guò)程得到的mMeasuredHeight值,供layout參考,或許沒(méi)用。

上面解釋了自定義View時(shí)各種獲取寬高的一些含義,下面我們?cè)賮?lái)看看關(guān)于View獲取屏幕中位置的一些方法,不過(guò)這些方法需要在Activity的onWindowFocusChanged ()方法之后才能使用。如下圖:

下面我們就給出上面這幅圖涉及的View的一些坐標(biāo)方法的結(jié)果(結(jié)果采用使用方法返回的實(shí)際坐標(biāo),不依賴(lài)上面實(shí)際絕對(duì)坐標(biāo)轉(zhuǎn)換,上面絕對(duì)坐標(biāo)只是為了說(shuō)明例子中的位置而已),如下:

View的方法上圖View1結(jié)果上圖View2結(jié)果結(jié)論描述
getLocalVisibleRect()(0, 0 - 410, 100)(0, 0 - 410, 470)獲取View自身可見(jiàn)的坐標(biāo)區(qū)域,坐標(biāo)以自己的左上角為原點(diǎn)(0,0),另一點(diǎn)為可見(jiàn)區(qū)域右下角相對(duì)自己(0,0)點(diǎn)的坐標(biāo),其實(shí)View2當(dāng)前height為550,可見(jiàn)height為470。
getGlobalVisibleRect()(30, 100 - 440, 200)(30, 250 - 440, 720)獲取View在屏幕絕對(duì)坐標(biāo)系中的可視區(qū)域,坐標(biāo)以屏幕左上角為原點(diǎn)(0,0),另一個(gè)點(diǎn)為可見(jiàn)區(qū)域右下角相對(duì)屏幕原點(diǎn)(0,0)點(diǎn)的坐標(biāo)。
getLocationOnScreen()(30, 100)(30, 250)坐標(biāo)是相對(duì)整個(gè)屏幕而言,Y坐標(biāo)為View左上角到屏幕頂部的距離。
getLocationInWindow()(30, 100)(30, 250)如果為普通Activity則Y坐標(biāo)為View左上角到屏幕頂部(此時(shí)Window與屏幕一樣大);如果為對(duì)話(huà)框式的Activity則Y坐標(biāo)為當(dāng)前Dialog模式Activity的標(biāo)題欄頂部到View左上角的距離。

到此常用的相關(guān)View的靜態(tài)坐標(biāo)獲取處理的方法和含義都已經(jīng)敘述完了,下面我們看看動(dòng)態(tài)的一些解釋(所謂動(dòng)靜只是我個(gè)人稱(chēng)呼而已)。

2-3 Android View動(dòng)畫(huà)相關(guān)坐標(biāo)系

其實(shí)在我們使用動(dòng)畫(huà)時(shí),尤其是補(bǔ)間動(dòng)畫(huà)時(shí),你會(huì)發(fā)現(xiàn)其中涉及很多坐標(biāo)參數(shù),一會(huì)兒為相對(duì)的,一會(huì)兒為絕對(duì)的,你可能會(huì)各種蒙圈。那么不妨看下《Android應(yīng)用開(kāi)發(fā)之所有動(dòng)畫(huà)使用詳解 》這篇博客,這里面詳細(xì)介紹了關(guān)于Android動(dòng)畫(huà)相關(guān)的坐標(biāo)系統(tǒng),這里不再累贅敘述。

2-4 Android View滑動(dòng)相關(guān)坐標(biāo)系

關(guān)于View提供的與坐標(biāo)息息相關(guān)的另一組常用的重要方法就是滾動(dòng)或者滑動(dòng)相關(guān)的,下面我們給出相關(guān)的解釋(特別注意:View的scrollTo()和scrollBy()是用于滑動(dòng)View中的內(nèi)容,而不是改變View的位置;改變View在屏幕中的位置可以使用offsetLeftAndRight()和offsetTopAndBottom()方法,他會(huì)導(dǎo)致getLeft()等值改變。),如下:

View的滑動(dòng)方法效果及描述
offsetLeftAndRight(int offset)水平方向挪動(dòng)View,offset為正則x軸正向移動(dòng),移動(dòng)的是整個(gè)View,getLeft()會(huì)變的,自定義View很有用
offsetTopAndBottom(int offset)垂直方向挪動(dòng)View,offset為正則y軸正向移動(dòng),移動(dòng)的是整個(gè)View,getTop()會(huì)變的,自定義View很有用。
scrollTo(int x, int y)View中內(nèi)容(不是整個(gè)View)滑動(dòng)到相應(yīng)的位置,參考坐標(biāo)原點(diǎn)為ParentView左上角,x,y為正則向xy軸反方向移動(dòng),反之同理。
scrollBy(int x, int y)在scrollTo()的基礎(chǔ)上繼續(xù)滑動(dòng)xy。
setScrollX(int value)實(shí)質(zhì)為scrollTo(),只是只改變Y軸滑動(dòng)。
setScrollY(int value)實(shí)質(zhì)為scrollTo(),只是只改變X軸滑動(dòng)。
getScrollX()/getScrollY()獲取當(dāng)前滑動(dòng)位置偏移量。

關(guān)于Android View的scrollBy()和scrollTo()參數(shù)傳遞正數(shù)卻向坐標(biāo)系負(fù)方向移動(dòng)的特性可能很多人都有疑惑,甚至是死記結(jié)論,這里我們簡(jiǎn)單給出產(chǎn)生這種特性的真實(shí)原因—-源碼分析,如下:

public void scrollTo(int x, int y) {if (mScrollX != x || mScrollY != y) {int oldX = mScrollX;int oldY = mScrollY;mScrollX = x;mScrollY = y;invalidateParentCaches();onScrollChanged(mScrollX, mScrollY, oldX, oldY);if (!awakenScrollBars()) {postInvalidateOnAnimation();}} }

View的該方法注釋里明確說(shuō)明了調(diào)運(yùn)他會(huì)觸發(fā)onScrollChanged()和invalidated()方法,那我們就將矛頭轉(zhuǎn)向invalidated()方法觸發(fā)的draw()過(guò)程,draw()過(guò)程中最終其實(shí)會(huì)觸發(fā)下面的invalidate()方法,如下:

public void invalidate(int l, int t, int r, int b) {final int scrollX = mScrollX;final int scrollY = mScrollY;//scroller時(shí)為何參數(shù)和坐標(biāo)反向的真實(shí)原因invalidateInternal(l - scrollX, t - scrollY, r - scrollX, b - scrollY, true, false); }

核心就在這里,相信不用我解釋大家也知道咋回事了,自行腦補(bǔ)。

scrollTo()和scrollBy()方法特別注意:如果你給一個(gè)ViewGroup調(diào)用scrollTo()方法滾動(dòng)的是ViewGroup里面的內(nèi)容,如果想滾動(dòng)一個(gè)ViewGroup則再給他嵌套一個(gè)外層,滾動(dòng)外層即可。

3. 總結(jié)

可以發(fā)現(xiàn),上面只是說(shuō)明了一些View里常用的與坐標(biāo)相關(guān)的概念,關(guān)于自定義控件了解學(xué)習(xí)這些坐標(biāo)概念只是一個(gè)基礎(chǔ),也是一個(gè)后續(xù)內(nèi)容的鋪墊,所以有必要先完全吃透此部分內(nèi)容才能繼續(xù)拓展學(xué)習(xí)新的東東。

View中還有一些其他與坐標(biāo)獲取相關(guān)的方法,但是一般都比較不常用,所以用到時(shí)可以現(xiàn)查API或者Debug看現(xiàn)象進(jìn)行學(xué)習(xí)即可,這里篇幅和時(shí)間有限就不一一道來(lái)了。

Android View的getLeft()、getRight()、getTop()、getBottom()

原文鏈接:http://www.cnblogs.com/zhengbeibei/archive/2013/05/07/3065999.html

引起疑惑

分析視圖invalidate流程的過(guò)程中發(fā)現(xiàn)view的left, right, top, bottom跟自己理解的不一樣,現(xiàn)在想分析一下這幾個(gè)值具體的含義

理解Android坐標(biāo),位置概念

坐標(biāo)系在二維視圖中通過(guò)X軸和Y軸兩個(gè)數(shù)字為組合表示某個(gè)點(diǎn)的絕對(duì)坐標(biāo)。 例如(30, 100) 通常表示X軸30, Y軸100交叉的一個(gè)點(diǎn)。 在Android中以左上角為原點(diǎn)(0,0),水平方向是X軸,從左到右,垂直方向是Y軸,從上到下,可以把left相當(dāng)于X軸值, top相當(dāng)于Y軸值, 通過(guò)這兩個(gè)值A(chǔ)ndroid系統(tǒng)可以知道視圖的繪制起點(diǎn),在通過(guò)Wdith 和 Height 可以得到視圖上下左右具體值,就可以在屏幕上絕對(duì)位置繪制視圖。right 與 bottom計(jì)算如下:

right = left + width; bottom = top + height;

View中相應(yīng)API

view.getLeft();//表示的是view左側(cè)以其父View的左上角為原點(diǎn)的水平坐標(biāo)位置 view.getRight();//表示的view右側(cè)以其父View的左上角為原點(diǎn)的水平坐標(biāo)位置 view.getTop();//表示的是view頂部以父View的左上角為原點(diǎn)的垂直坐標(biāo)位置 view.getBottom();//表示的是view底部以父View的左上角為原點(diǎn)的垂直坐標(biāo)位置 view.getWidth();//表示view寬度 view.getHeight();//表示view高度

實(shí)例分析

按照我的理解:

藍(lán)色區(qū)域位置 left = 0, top = 0 坐標(biāo)(0, 0 )

黃色區(qū)域位置 left = 60, top = 115 坐標(biāo)(60, 115)

綠色區(qū)域位置 left = 115, top = 170 坐標(biāo)(115, 170)

綠色區(qū)域,這里理解錯(cuò)誤,我認(rèn)為綠色區(qū)域的位置是針對(duì)于藍(lán)色區(qū)域的(0, 0)坐標(biāo)的值,從上圖的右下角打印出的坐標(biāo)值就可以看出與下方我列出的值不一致,看看下面的圖就明白了

總結(jié): 視圖的left , top , right , bottom 的值是針對(duì)其父視圖的相對(duì)位置, 綠色區(qū)域是針對(duì)其父視圖(即黃色區(qū)域?yàn)?0, 0)點(diǎn))的坐標(biāo),不應(yīng)該是(115, 170 ) 而是 (55, 55)

獲取坐標(biāo)值的各種方法

你真的了解View的坐標(biāo)嗎?

原文鏈接:http://blog.csdn.net/gdutxiaoxu/article/details/53700020

閑聊

View,對(duì)我們來(lái)說(shuō)在熟悉不過(guò)了,從接觸Android開(kāi)始,我們就一直在接觸View,界面當(dāng)中到處都是 View,比如我們經(jīng)常用到的TextView,Button,LinearLayout等等,但是我們真的了解View嗎?尤其是View的坐標(biāo)。mLeft,mRight,mY,mX,mTranslationY,mScoollY,相對(duì)于屏幕的坐標(biāo)等等這些概念你真的清楚了嗎?如果真的清楚了,那你沒(méi)有必要度這篇博客,如果你還是有一些模糊,建議花上幾分鐘的時(shí)間讀一下,這篇博客較短,花個(gè)幾分鐘的時(shí)間就可以閱讀完。

為什么要寫(xiě)這一篇博客呢?

因?yàn)檎莆誚iew的坐標(biāo)很重要,尤其是對(duì)于自定義View,學(xué)習(xí)動(dòng)畫(huà)有重大的意義。

這篇博客主要講解一下問(wèn)題

  • View 的 getLeft() , getRight() , getTop() , getBottom()
  • View 的 getY() , getTranslationY() , getTop() 之間的聯(lián)系
  • View 的 getScroolY 和 View 的 scrollTo() 和 scrollBy()
  • event.getY 和 event.getRawY()
  • 擴(kuò)展,怎樣獲取狀態(tài)欄(StatusBar)和標(biāo)題欄(titleBar)的高度

基本概念

簡(jiǎn)單說(shuō)明一下(上圖Activity采用默認(rèn)Style,狀態(tài)欄和標(biāo)題欄都會(huì)顯示):最大的草綠色區(qū)域是屏幕界面,紅色次大區(qū)域我們稱(chēng)之為“應(yīng)用界面區(qū)域”,最小紫色的區(qū)域我們稱(chēng)之為“View繪制區(qū)域”;屏幕頂端、應(yīng)用界面區(qū)之外的那部分顯示手機(jī)電池網(wǎng)絡(luò)運(yùn)營(yíng)商信息的為“狀態(tài)欄”,應(yīng)用區(qū)域頂端、View繪制區(qū)外部顯示Activity名稱(chēng)的部分我們稱(chēng)為“標(biāo)題欄”。

從這張圖片我們可以看到

在Android中,當(dāng)ActionBar存在的情況下,屏幕的高度=狀態(tài)欄+應(yīng)用區(qū)域的高度=狀態(tài)欄的高度+(標(biāo)題欄的高度+View繪制區(qū)域的高度)

當(dāng)ActionBar不存在的情況下,屏幕的高度=狀態(tài)欄+應(yīng)用區(qū)域的高度=狀態(tài)欄的高度+(View繪制區(qū)域的高度)

View 的 getLeft()和getRight()和 getTop() 和getBottom()

View.getLeft() ; View.getTop() ; View.getBottom(); View.getRight() ;

top是左上角縱坐標(biāo),left是左上角橫坐標(biāo),right是右下角橫坐標(biāo),bottom是右下角縱坐標(biāo),都是相對(duì)于它的直接父View而言的,而不是相對(duì)于屏幕而言的。這一點(diǎn)要區(qū)分清楚。那那個(gè)坐標(biāo)是相對(duì)于屏幕而言的呢,以及要怎樣獲取相對(duì)于屏幕的坐標(biāo)呢?

目前View里面的變量還沒(méi)有一個(gè)是相對(duì)于屏幕而言的,但是我們可以獲取到相對(duì)于屏幕的坐標(biāo)。一般來(lái)說(shuō),我們要獲取View的坐標(biāo)和高度 等,都必須等到View繪制完畢以后才能獲取的到,在Activity 的 onCreate()方法 里面 是獲取不到的,必須 等到View繪制完畢以后才能獲取地到View的響應(yīng)的坐標(biāo),一般來(lái)說(shuō),主要 有以下兩種方法。

第一種方法,onWindowFocusChanged()方法里面進(jìn)行調(diào)用

@Override public void onWindowFocusChanged(boolean hasFocus) {super.onWindowFocusChanged(hasFocus); //確保只會(huì)調(diào)用一次if(first){first=false;final int[] location = new int[2]; mView.getLocationOnScreen(location);int x1 = location[0] ;int y1 = location[1] ;Log.i(TAG, "onCreate: x1=" +x1);Log.i(TAG, "onCreate: y1=" +y1);} }

第二種方法,在視圖樹(shù)繪制完成的時(shí)候進(jìn)行測(cè)量

mView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {// 移除監(jiān)聽(tīng)器,確保只會(huì)調(diào)用一次,否則在視圖樹(shù)發(fā)揮改變的時(shí)候又會(huì)調(diào)用mView.getViewTreeObserver().removeGlobalOnLayoutListener(this);final int[] location = new int[2];mView.getLocationOnScreen(location);int x1 = location[0];int y1 = location[1];Log.i(TAG, "onCreate: x1=" + x1);Log.i(TAG, "onCreate: y1=" + y1);} });

View的getY(),getTranslationY() 和 getTop() 之間的聯(lián)

getY()

Added in API level 14
The visual y position of this view, in pixels.(返回的是View視覺(jué)上的圖標(biāo),即我們眼睛看到位置的Y坐標(biāo),默認(rèn)值跟getTop()相同,別急,下面會(huì)解釋)

getTranslationY()

Added in API level 14
The vertical position of this view relative to its top position, in pixels.(豎直方向上相對(duì)于top的偏移量,默認(rèn)值為0)

那 getY() 和 getTranslationY() 和 getTop () 到底有什么關(guān)系呢?

@ViewDebug.ExportedProperty(category = "drawing") public float getY() {return mTop + getTranslationY(); }@ViewDebug.ExportedProperty(category = "drawing")public float getTranslationY() {return mRenderNode.getTranslationY();}@ViewDebug.CapturedViewPropertypublic final int getTop() {return mTop;}

從以上的源碼我們可以知道 getY()= getTranslationY()+ getTop (),而 getTranslationY() 的默認(rèn)值是0,除非我們通過(guò) setTranlationY() 來(lái)改變它,這也就是我們上面上到的 getY 默認(rèn)值跟 getTop()相同

那我們要怎樣改變 top值 和 Y 值呢? 很明顯就是調(diào)用相應(yīng)的set方法 ,即 setY() 和setTop() ,就可以改變他們 的值。

View的getScroolY 和 View 的 scrollTo() 和 scrollBy()

getScrollY是一個(gè)比較特別的函數(shù),因?yàn)樗婕耙粋€(gè)值叫mScrollY,簡(jiǎn)單說(shuō),getScrollY一般得到的都是0,除非你調(diào)用過(guò)scrollTo或scrollBy這兩個(gè)函數(shù)來(lái)改變它。

scrollTo() 和 scrollBy()

從字面意思我們可以知道 scrollTo() 是滑動(dòng)到哪里的意思 ,scrollBy()是相對(duì)當(dāng)前的位置滑動(dòng)了多少。當(dāng)然這一點(diǎn)在源碼中也是可以體現(xiàn)出來(lái)的

public void scrollTo(int x, int y) {if (mScrollX != x || mScrollY != y) {int oldX = mScrollX;int oldY = mScrollY;mScrollX = x;mScrollY = y;invalidateParentCaches();onScrollChanged(mScrollX, mScrollY, oldX, oldY);if (!awakenScrollBars()) {postInvalidateOnAnimation();}} } public void scrollBy(int x, int y) {scrollTo(mScrollX + x, mScrollY + y); }

有幾點(diǎn)需要注意的是

  • 不論是scrollTo或scrollBy,其實(shí)都是對(duì)View的內(nèi)容進(jìn)行滾動(dòng)而不是對(duì)View本身,你可以做個(gè)小實(shí)驗(yàn),一個(gè)LinearLayouy背景是黃色,里面放置一個(gè)子LinearLayout背景是藍(lán)色,調(diào)用scrollTo或scrollBy,移動(dòng)的永遠(yuǎn)是藍(lán)色的子LinearLayout。
  • 還有就是scrollTo和scrollBy函數(shù)的參數(shù)和坐標(biāo)系是“相反的”,比如scrollTo(-100,0),View的內(nèi)容是向X軸正方向移動(dòng)的,這個(gè)相反打引號(hào)是因?yàn)椴⒉皇钦嬲南喾?#xff0c;具體可以看源碼,關(guān)于這兩個(gè)函數(shù)的源碼分析大家可以看Android——源碼角度分析View的scrollBy()和scrollTo()的參數(shù)正負(fù)問(wèn)題,一目了然。

View 的 width 和 height

@ViewDebug.ExportedProperty(category = "layout") public final int getHeight() {return mBottom - mTop; }

我們可以看到 Android的 height 是由 mBottom 和 mTop 共同得出的,那我們要怎樣設(shè)置Android的高度呢?有人會(huì)說(shuō)直接在xml里面設(shè)置 android:height=”” 不就OK了,那我們?nèi)绻獎(jiǎng)討B(tài)設(shè)置height的高度呢,怎么辦?你可能會(huì)想到 setWidth()方法?但是我們找遍了View的所有方法,都沒(méi)有發(fā)現(xiàn) setWidth()方法,那要怎樣動(dòng)態(tài)設(shè)置height呢?其實(shí)有兩種方法

int width=50; int height=100; ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); if(layoutParams==null){layoutParams=new ViewGroup.LayoutParams(width,height); }else{layoutParams.height=height; } view.setLayoutParams(layoutParams);

第二種方法,單獨(dú)地改變top或者bottom的值,這種方法不推薦使用

至于width,它跟height基本一樣,只不過(guò)它是有mRight 和mLeft 共同決定而已。

需要注意的是,平時(shí)我們?cè)趫?zhí)行動(dòng)畫(huà)的過(guò)程,不推薦使用LayoutParams來(lái)改變View的狀態(tài),因?yàn)楦淖僉ayoutParams會(huì)調(diào)用requestLayout()方法,會(huì)標(biāo)記當(dāng)前View及父容器,同時(shí)逐層向上提交,直到ViewRootImpl處理該事件,ViewRootImpl會(huì)調(diào)用三大流程,從measure開(kāi)始,對(duì)于每一個(gè)含有標(biāo)記位的view及其子View都會(huì)進(jìn)行測(cè)量、布局、繪制,性能較差,源碼體現(xiàn)如下:關(guān)于requestLayout ()方法的更多分析可以查看這一篇博客Android View 深度分析requestLayout、invalidate與postInvalidate

public void setLayoutParams(ViewGroup.LayoutParams params) {if (params == null) {throw new NullPointerException("Layout parameters cannot be null");}mLayoutParams = params;resolveLayoutParams();if (mParent instanceof ViewGroup) {((ViewGroup) mParent).onSetLayoutParams(this, params);}requestLayout(); }

因此我們?nèi)绻赼pi 14 以后 ,在動(dòng)畫(huà)執(zhí)行過(guò)程中,要改變View的狀態(tài),推薦使用setTranslationY()和setTranslationX(0等方法,而 盡量避免改變LayoutParams.因?yàn)樾阅芟淤F來(lái)說(shuō)較差。

event.getY 和 event.getRawY()

要區(qū)分于MotionEvent.getRawX() 和MotionEvent.getX();,

在public boolean onTouch(View view, MotionEvent event) 中,當(dāng)你觸到控件時(shí),x,y是相對(duì)于該控件左上點(diǎn)(控件本身)的相對(duì)位置。 而rawx,rawy始終是相對(duì)于屏幕的位置。getX()是表示W(wǎng)idget相對(duì)于自身左上角的x坐標(biāo),而getRawX()是表示相對(duì)于屏幕左上角的x坐標(biāo)值 (注意:這個(gè)屏幕左上角是手機(jī)屏幕左上角,不管activity是否有titleBar或是否全屏幕)。

擴(kuò)展,怎樣獲取狀態(tài)欄(StatusBar)和標(biāo)題欄(titleBar)的高度

public void onWindowFocusChanged(boolean hasFocus) {super.onWindowFocusChanged(hasFocus);//屏幕DisplayMetrics dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);Log.e(TAG, "屏幕高:" + dm.heightPixels);//應(yīng)用區(qū)域Rect outRect1 = new Rect();getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect1);//這個(gè)也就是狀態(tài)欄的 高度Log.e(TAG, "應(yīng)用區(qū)頂部" + outRect1.top);Log.e(TAG, "應(yīng)用區(qū)高" + outRect1.height());// 這個(gè)方法必須在有actionBar的情況下才能獲取到狀態(tài)欄的高度//View繪制區(qū)域Rect outRect2 = new Rect();getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(outRect2);Log.e(TAG, "View繪制區(qū)域頂部-錯(cuò)誤方法:" + outRect2.top); //不能像上邊一樣由outRect2.top獲取,這種方式獲得的top是0,可能是bug吧Log.e(TAG, "View繪制區(qū)域高度:" + outRect2.height());int viewTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop(); //要用這種方法Log.e(TAG, "View繪制區(qū)域頂部-正確方法:" + viewTop);int titleBarHeight=viewTop;Log.d(TAG, "onWindowFocusChanged: 標(biāo)題欄高度titleBarHeight=" +titleBarHeight); }

這里我們需要注意的 是在ActionBar存在的情況下,通過(guò)這種方法我們才能夠得出titleBar的高度,否則是無(wú)法得到的,因?yàn)関iewTop 為0.

這篇博客到此為止,關(guān)于更多自定義View 的一些例子,可以看我以下的博客

常用的自定義View例子一(FlowLayout)

自定義View常用例子二(點(diǎn)擊展開(kāi)隱藏控件,九宮格圖片控件)

常用的自定義View例子三(MultiInterfaceView多界面處理)

常用的自定義控件四(QuickBarView)

源碼角度分析View的scrollBy()和scrollTo()的參數(shù)正負(fù)問(wèn)題

原文鏈接:http://blog.csdn.net/xplee0576/article/details/24242383

為什么要寫(xiě)這篇博客?

以前在使用View的scrollBy()或者scrollTo()的時(shí)候,發(fā)現(xiàn)它們的參數(shù)在正的時(shí)候是反方向移動(dòng),負(fù)的時(shí)候是正方向移動(dòng)。于是就google了下,發(fā)現(xiàn)好多博客都要么是轉(zhuǎn)摘、要么是直接抄襲然后美起名曰原創(chuàng),更惡劣的是這些博文由于是轉(zhuǎn)摘抄襲的關(guān)系,竟然都說(shuō)View在scrollBy()或者scrollTo()的時(shí)候,它們的直角坐標(biāo)系是相反的,這明顯是一個(gè)錯(cuò)誤的觀念。
好了,廢話(huà)不多說(shuō)進(jìn)入正題。

Android設(shè)備平面直角坐標(biāo)系

在做分析之前,首先要建立起Android設(shè)備屏幕的平面直角坐標(biāo)系概念。在Android手機(jī)中,屏幕的直角坐標(biāo)系概念簡(jiǎn)單來(lái)說(shuō):
屏幕左上角為直角坐標(biāo)系的原點(diǎn)(0,0)
從原點(diǎn)出發(fā)向左為X軸負(fù)方向,向右為X軸正方向
從原點(diǎn)出發(fā)向上為Y軸負(fù)方向,向下為Y軸正方向

上述概念可通過(guò)如下圖總結(jié):

在Android中,我們通常說(shuō)View在屏幕上的坐標(biāo),其實(shí)就是view的左上的坐標(biāo)。調(diào)用View的invalidate()方法會(huì)促使View重繪。
View的scrollBy()和scrollTo()

在分析scrollBy()和scrollTo()之前,先上一段源碼片段:

/** * Set the scrolled position of your view. This will cause a call to * {@link #onScrollChanged(int, int, int, int)} and the view will be * invalidated. * @param x the x position to scroll to * @param y the y position to scroll to */ public void scrollTo(int x, int y) { if (mScrollX != x || mScrollY != y) { int oldX = mScrollX; int oldY = mScrollY; mScrollX = x; mScrollY = y; invalidateParentCaches(); onScrollChanged(mScrollX, mScrollY, oldX, oldY); if (!awakenScrollBars()) { invalidate(true); } } } /** * Move the scrolled position of your view. This will cause a call to * {@link #onScrollChanged(int, int, int, int)} and the view will be * invalidated. * @param x the amount of pixels to scroll by horizontally * @param y the amount of pixels to scroll by vertically */ public void scrollBy(int x, int y) { scrollTo(mScrollX + x, mScrollY + y); }

scrollBy()和scrollTo()的滾動(dòng)不同點(diǎn)

scrollTo(x, y):通過(guò)invalidate使view直接滾動(dòng)到參數(shù)x和y所標(biāo)定的坐標(biāo)
scrollBy(x, y):通過(guò)相對(duì)于當(dāng)前坐標(biāo)的滾動(dòng)。從上面代碼中,很容以就能看出scrollBy()的方法體只有調(diào)用scrollTo()方法的一行代碼,scrollBy()方法先對(duì)屬性mScollX加上參數(shù)x和屬性mScrollY加上參數(shù)y,然后將上述結(jié)果作為參數(shù)傳入調(diào)用方法scrollTo()

scrollBy()和scrollTo()的參數(shù)正負(fù)影響滾動(dòng)問(wèn)題

scrollBy()和scrollTo()在參數(shù)為負(fù)的時(shí)候,向坐標(biāo)軸正方向滾動(dòng);當(dāng)參數(shù)為正的時(shí)候,向坐標(biāo)軸負(fù)方向滾動(dòng)。而作為我們的認(rèn)知,應(yīng)該是參數(shù)為負(fù)的時(shí)候,向坐標(biāo)軸負(fù)方向滾動(dòng);當(dāng)參數(shù)為正的時(shí)候,向坐標(biāo)軸正方向滾動(dòng)。
那為什么這兩個(gè)方法傳入?yún)?shù)和引起的滾動(dòng)方向和我們平常的認(rèn)知不同呢?
下面就讓我們帶著這個(gè)問(wèn)題跟隨源碼分析。如果不想從它的執(zhí)行過(guò)程一步步的去分析,可以直接看本文的最后一段源碼。

源碼執(zhí)行過(guò)程分析

因?yàn)閟crollBy(x, y)方法體只有一行,并且是調(diào)用scrollTo(x, y),所以我們只要通過(guò)scrollTo(x, y)來(lái)進(jìn)行分析就可以了。
在scrollTo(x, y)中,x和y分別被賦值給了mScrollX和mScrollY,最后調(diào)用了方法invalidate(true)。貌似到了這里就無(wú)路可走了,其實(shí)不然,我們知道invalidate這個(gè)方法會(huì)通知View進(jìn)行重繪。
那么接下來(lái),我們就可以跳過(guò)scrollTo(x, y)去分析View的draw()方法了。照例,在分析onDraw方法之前上一段源碼片段:

/** * Manually render this view (and all of its children) to the given Canvas. * The view must have already done a full layout before this function is * called. When implementing a view, implement * {@link #onDraw(android.graphics.Canvas)} instead of overriding this method. * If you do need to override this method, call the superclass version. * * @param canvas The Canvas to which the View is rendered. */ public void draw(Canvas canvas) { if (ViewDebug.TRACE_HIERARCHY) { ViewDebug.trace(this, ViewDebug.HierarchyTraceType.DRAW); } final int privateFlags = mPrivateFlags; final boolean dirtyOpaque = (privateFlags & DIRTY_MASK) == DIRTY_OPAQUE && (mAttachInfo == null || !mAttachInfo.mIgnoreDirtyState); mPrivateFlags = (privateFlags & ~DIRTY_MASK) | DRAWN; /* * Draw traversal performs several drawing steps which must be executed * in the appropriate order: * * 1. Draw the background * 2. If necessary, save the canvas' layers to prepare for fading * 3. Draw view's content * 4. Draw children * 5. If necessary, draw the fading edges and restore layers * 6. Draw decorations (scrollbars for instance) */ // Step 1, draw the background, if needed int saveCount; if (!dirtyOpaque) { final Drawable background = mBGDrawable; if (background != null) { final int scrollX = mScrollX; final int scrollY = mScrollY; if (mBackgroundSizeChanged) { background.setBounds(0, 0, mRight - mLeft, mBottom - mTop); mBackgroundSizeChanged = false; } if ((scrollX | scrollY) == 0) { background.draw(canvas); } else { canvas.translate(scrollX, scrollY); background.draw(canvas); canvas.translate(-scrollX, -scrollY); } } } // skip step 2 & 5 if possible (common case) final int viewFlags = mViewFlags; boolean horizontalEdges = (viewFlags & FADING_EDGE_HORIZONTAL) != 0; boolean verticalEdges = (viewFlags & FADING_EDGE_VERTICAL) != 0; if (!verticalEdges && !horizontalEdges) { // Step 3, draw the content if (!dirtyOpaque) onDraw(canvas); // Step 4, draw the children dispatchDraw(canvas); // Step 6, draw decorations (scrollbars) onDrawScrollBars(canvas); // we're done... return; } /* * Here we do the full fledged routine... * (this is an uncommon case where speed matters less, * this is why we repeat some of the tests that have been * done above) */ boolean drawTop = false; boolean drawBottom = false; boolean drawLeft = false; boolean drawRight = false; float topFadeStrength = 0.0f; float bottomFadeStrength = 0.0f; float leftFadeStrength = 0.0f; float rightFadeStrength = 0.0f; // Step 2, save the canvas' layers int paddingLeft = mPaddingLeft; final boolean offsetRequired = isPaddingOffsetRequired(); if (offsetRequired) { paddingLeft += getLeftPaddingOffset(); } int left = mScrollX + paddingLeft; int right = left + mRight - mLeft - mPaddingRight - paddingLeft; int top = mScrollY + getFadeTop(offsetRequired); int bottom = top + getFadeHeight(offsetRequired); if (offsetRequired) { right += getRightPaddingOffset(); bottom += getBottomPaddingOffset(); } final ScrollabilityCache scrollabilityCache = mScrollCache; final float fadeHeight = scrollabilityCache.fadingEdgeLength; int length = (int) fadeHeight; // clip the fade length if top and bottom fades overlap // overlapping fades produce odd-looking artifacts if (verticalEdges && (top + length > bottom - length)) { length = (bottom - top) / 2; } // also clip horizontal fades if necessary if (horizontalEdges && (left + length > right - length)) { length = (right - left) / 2; } if (verticalEdges) { topFadeStrength = Math.max(0.0f, Math.min(1.0f, getTopFadingEdgeStrength())); drawTop = topFadeStrength * fadeHeight > 1.0f; bottomFadeStrength = Math.max(0.0f, Math.min(1.0f, getBottomFadingEdgeStrength())); drawBottom = bottomFadeStrength * fadeHeight > 1.0f; } if (horizontalEdges) { leftFadeStrength = Math.max(0.0f, Math.min(1.0f, getLeftFadingEdgeStrength())); drawLeft = leftFadeStrength * fadeHeight > 1.0f; rightFadeStrength = Math.max(0.0f, Math.min(1.0f, getRightFadingEdgeStrength())); drawRight = rightFadeStrength * fadeHeight > 1.0f; } saveCount = canvas.getSaveCount(); int solidColor = getSolidColor(); if (solidColor == 0) { final int flags = Canvas.HAS_ALPHA_LAYER_SAVE_FLAG; if (drawTop) { canvas.saveLayer(left, top, right, top + length, null, flags); } if (drawBottom) { canvas.saveLayer(left, bottom - length, right, bottom, null, flags); } if (drawLeft) { canvas.saveLayer(left, top, left + length, bottom, null, flags); } if (drawRight) { canvas.saveLayer(right - length, top, right, bottom, null, flags); } } else { scrollabilityCache.setFadeColor(solidColor); } // Step 3, draw the content if (!dirtyOpaque) onDraw(canvas); // Step 4, draw the children dispatchDraw(canvas); // Step 5, draw the fade effect and restore layers final Paint p = scrollabilityCache.paint; final Matrix matrix = scrollabilityCache.matrix; final Shader fade = scrollabilityCache.shader; if (drawTop) { matrix.setScale(1, fadeHeight * topFadeStrength); matrix.postTranslate(left, top); fade.setLocalMatrix(matrix); canvas.drawRect(left, top, right, top + length, p); } if (drawBottom) { matrix.setScale(1, fadeHeight * bottomFadeStrength); matrix.postRotate(180); matrix.postTranslate(left, bottom); fade.setLocalMatrix(matrix); canvas.drawRect(left, bottom - length, right, bottom, p); } if (drawLeft) { matrix.setScale(1, fadeHeight * leftFadeStrength); matrix.postRotate(-90); matrix.postTranslate(left, top); fade.setLocalMatrix(matrix); canvas.drawRect(left, top, left + length, bottom, p); } if (drawRight) { matrix.setScale(1, fadeHeight * rightFadeStrength); matrix.postRotate(90); matrix.postTranslate(right, top); fade.setLocalMatrix(matrix); canvas.drawRect(right - length, top, right, bottom, p); } canvas.restoreToCount(saveCount); // Step 6, draw decorations (scrollbars) onDrawScrollBars(canvas); }

在這段代碼片中,我們直接定位到onDrawScrollBars(canvas)方法,找到了這個(gè)方法離真相就不遠(yuǎn)了。上源碼:

/** * <p>Request the drawing of the horizontal and the vertical scrollbar. The * scrollbars are painted only if they have been awakened first.</p> * * @param canvas the canvas on which to draw the scrollbars * * @see #awakenScrollBars(int) */ protected final void onDrawScrollBars(Canvas canvas) { // scrollbars are drawn only when the animation is running final ScrollabilityCache cache = mScrollCache; if (cache != null) { int state = cache.state; if (state == ScrollabilityCache.OFF) { return; } boolean invalidate = false; if (state == ScrollabilityCache.FADING) { // We're fading -- get our fade interpolation if (cache.interpolatorValues == null) { cache.interpolatorValues = new float[1]; } float[] values = cache.interpolatorValues; // Stops the animation if we're done if (cache.scrollBarInterpolator.timeToValues(values) == Interpolator.Result.FREEZE_END) { cache.state = ScrollabilityCache.OFF; } else { cache.scrollBar.setAlpha(Math.round(values[0])); } // This will make the scroll bars inval themselves after // drawing. We only want this when we're fading so that // we prevent excessive redraws invalidate = true; } else { // We're just on -- but we may have been fading before so // reset alpha cache.scrollBar.setAlpha(255); } final int viewFlags = mViewFlags; final boolean drawHorizontalScrollBar = (viewFlags & SCROLLBARS_HORIZONTAL) == SCROLLBARS_HORIZONTAL; final boolean drawVerticalScrollBar = (viewFlags & SCROLLBARS_VERTICAL) == SCROLLBARS_VERTICAL && !isVerticalScrollBarHidden(); if (drawVerticalScrollBar || drawHorizontalScrollBar) { final int width = mRight - mLeft; final int height = mBottom - mTop; final ScrollBarDrawable scrollBar = cache.scrollBar; final int scrollX = mScrollX; final int scrollY = mScrollY; final int inside = (viewFlags & SCROLLBARS_OUTSIDE_MASK) == 0 ? ~0 : 0; int left, top, right, bottom; if (drawHorizontalScrollBar) { int size = scrollBar.getSize(false); if (size <= 0) { size = cache.scrollBarSize; } scrollBar.setParameters(computeHorizontalScrollRange(), computeHorizontalScrollOffset(), computeHorizontalScrollExtent(), false); final int verticalScrollBarGap = drawVerticalScrollBar ? getVerticalScrollbarWidth() : 0; top = scrollY + height - size - (mUserPaddingBottom & inside); left = scrollX + (mPaddingLeft & inside); right = scrollX + width - (mUserPaddingRight & inside) - verticalScrollBarGap; bottom = top + size; onDrawHorizontalScrollBar(canvas, scrollBar, left, top, right, bottom); if (invalidate) { invalidate(left, top, right, bottom); } } if (drawVerticalScrollBar) { int size = scrollBar.getSize(true); if (size <= 0) { size = cache.scrollBarSize; } scrollBar.setParameters(computeVerticalScrollRange(), computeVerticalScrollOffset(), computeVerticalScrollExtent(), true); switch (mVerticalScrollbarPosition) { default: case SCROLLBAR_POSITION_DEFAULT: case SCROLLBAR_POSITION_RIGHT: left = scrollX + width - size - (mUserPaddingRight & inside); break; case SCROLLBAR_POSITION_LEFT: left = scrollX + (mUserPaddingLeft & inside); break; } top = scrollY + (mPaddingTop & inside); right = left + size; bottom = scrollY + height - (mUserPaddingBottom & inside); onDrawVerticalScrollBar(canvas, scrollBar, left, top, right, bottom); if (invalidate) { invalidate(left, top, right, bottom); } } } } }

上述代碼,我們直接定位到if (drawVerticalScrollBar || drawHorizontalScrollBar)結(jié)構(gòu)語(yǔ)句塊。在水平方向滾動(dòng)與垂直方向滾動(dòng)語(yǔ)句塊中,能夠找到一行關(guān)鍵性代碼invalidate(left, top, right, bottom),接著上源碼:

/** * Mark the area defined by the rect (l,t,r,b) as needing to be drawn. * The coordinates of the dirty rect are relative to the view. * If the view is visible, {@link #onDraw(android.graphics.Canvas)} * will be called at some point in the future. This must be called from * a UI thread. To call from a non-UI thread, call {@link #postInvalidate()}. * @param l the left position of the dirty region * @param t the top position of the dirty region * @param r the right position of the dirty region * @param b the bottom position of the dirty region */ public void invalidate(int l, int t, int r, int b) { if (ViewDebug.TRACE_HIERARCHY) { ViewDebug.trace(this, ViewDebug.HierarchyTraceType.INVALIDATE); } if (skipInvalidate()) { return; } if ((mPrivateFlags & (DRAWN | HAS_BOUNDS)) == (DRAWN | HAS_BOUNDS) || (mPrivateFlags & DRAWING_CACHE_VALID) == DRAWING_CACHE_VALID || (mPrivateFlags & INVALIDATED) != INVALIDATED) { mPrivateFlags &= ~DRAWING_CACHE_VALID; mPrivateFlags |= INVALIDATED; mPrivateFlags |= DIRTY; final ViewParent p = mParent; final AttachInfo ai = mAttachInfo; //noinspection PointlessBooleanExpression,ConstantConditions if (!HardwareRenderer.RENDER_DIRTY_REGIONS) { if (p != null && ai != null && ai.mHardwareAccelerated) { // fast-track for GL-enabled applications; just invalidate the whole hierarchy // with a null dirty rect, which tells the ViewAncestor to redraw everything p.invalidateChild(this, null); return; } } if (p != null && ai != null && l < r && t < b) { final int scrollX = mScrollX; final int scrollY = mScrollY; final Rect tmpr = ai.mTmpInvalRect; tmpr.set(l - scrollX, t - scrollY, r - scrollX, b - scrollY); p.invalidateChild(this, tmpr); } } }

invalidate(left, top, right, bottom)方法體中,倒數(shù)第5行tmpr.set(l - scrollX, t - scrollY, r - scrollX, b - scrollY)設(shè)置一個(gè)view需要繪制的臟矩形,這個(gè)方法的傳入?yún)?shù)不覺(jué)得很奇怪嗎?
mScrollX和mScrollY都是作為參數(shù)的減數(shù)(負(fù)負(fù)得正,負(fù)正得負(fù)),再結(jié)合開(kāi)頭的Android屏幕直角坐標(biāo)系的概念,通過(guò)簡(jiǎn)單的邏輯分析或者計(jì)算就可以證明:當(dāng)scrollTo()的傳入?yún)?shù)為負(fù)的時(shí)候,view就向坐標(biāo)軸正方向滾動(dòng);當(dāng)為正的時(shí)候,view就向坐標(biāo)軸負(fù)方向滾動(dòng)。

總結(jié)

以上是生活随笔為你收集整理的Android应用坐标系统全面详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

免费观看xxxx9999片 | 欧美日韩高清一区二区 | 国产一区二区在线播放视频 | 二区在线播放 | 日韩免费在线视频观看 | 国产精品久久久久久久久大全 | 欧美国产日韩在线观看 | 免费h精品视频在线播放 | 国产一区二区在线免费观看 | 成人四虎影院 | 中中文字幕av | 国产午夜精品一区二区三区在线观看 | 黄网站色视频 | 国产小视频免费观看 | 美国av片在线观看 | 五月开心综合 | 国产精品色婷婷视频 | 久久免费的精品国产v∧ | 中文字幕国产亚洲 | 美女黄网站视频免费 | 亚洲一二三区精品 | 久草视频2| 精品免费一区二区三区 | 国产色网 | 免费激情在线电影 | 亚洲综合激情网 | 色狠狠操| 欧美一区二区精美视频 | 丁香影院在线 | 亚洲精品在线免费 | 亚洲 欧洲 国产 日本 综合 | 久久激情电影 | 国产精品xxxx18a99| 国产男女无遮挡猛进猛出在线观看 | 亚洲国产激情 | av软件在线观看 | 在线色网站 | av一级片| 人人插人人艹 | 久久久久观看 | 在线精品视频免费播放 | 久久免费在线观看视频 | 国产九九精品视频 | 综合久久网 | 国产 日韩 欧美 中文 在线播放 | 国产在线a不卡 | 91精品国产综合久久婷婷香蕉 | 久久亚洲福利视频 | 色永久免费视频 | 久久全国免费视频 | 国产精品久久久久999 | 天天综合网在线观看 | 91色一区二区三区 | 日本三级久久久 | 99999精品| 国产裸体bbb视频 | 欧美十八 | 国产在线更新 | 国产成人一区二区三区在线观看 | 国产精品久久久久久久久久久免费 | 高清精品视频 | 香蕉视频18 | 久久久久综合视频 | 在线观看黄污 | 在线观看色网站 | 日韩网站视频 | 免费福利在线观看 | 亚洲精品资源在线观看 | av色综合| 96亚洲精品久久久蜜桃 | 亚洲精品一区二区三区在线观看 | 91精品伦理 | 亚洲综合激情五月 | 狠狠干成人综合网 | 在线国产一区二区 | 日韩一三区 | 国语精品视频 | 久久久网址 | 久久国产精品第一页 | 亚洲欧洲国产视频 | 亚洲成熟女人毛片在线 | www.av在线.com | 欧美日韩在线精品一区二区 | 国产一区在线播放 | 中文字幕在线观看视频免费 | 国产高清不卡在线 | 一区二区三区在线观看 | 欧美一区二区三区在线观看 | 欧美韩国日本在线 | 久久国产精品网站 | 国产精品午夜av | 欧美一区二区三区激情视频 | 中文字幕黄色 | 91激情视频在线观看 | 国内精品久久久久久久 | 成年人免费在线 | 国产精品一区二区在线免费观看 | 亚州视频在线 | 精品国精品自拍自在线 | 99精品国产99久久久久久福利 | 97超碰人人在线 | 操操综合 | 久久久久久国产精品久久 | 久久精品综合网 | 亚洲一区二区精品3399 | 91久久精品一区二区二区 | 国产精品黄色 | 亚洲另类在线视频 | 久久国产精品系列 | 欧美国产日韩激情 | 成人免费在线看片 | 黄色小说在线免费观看 | av网站手机在线观看 | 国产免费一区二区三区最新6 | 手机看片午夜 | 国产一区二区不卡视频 | 91精品国产麻豆国产自产影视 | 97色在线观看 | 日韩精品一区二区三区三炮视频 | 欧美一级片免费观看 | 99自拍视频在线观看 | 综合色天天 | 中文字幕丝袜 | av在线免费播放网站 | 四虎影视8848dvd | 91香蕉视频720p | 日韩乱码中文字幕 | 国产中的精品av小宝探花 | 亚洲一区二区视频在线 | 天天干,夜夜操 | 天天操夜夜操国产精品 | 久久五月激情 | 国产精品久久久久久久久大全 | 久久国产午夜精品理论片最新版本 | 亚洲欧美国内爽妇网 | 日韩欧美综合 | 日韩高清在线一区二区三区 | 欧美一级特黄aaaaaa大片在线观看 | 国产福利91精品一区 | 日韩三级免费 | 黄色大片网 | 中文av在线天堂 | 日韩动漫免费观看高清完整版在线观看 | 91精品视屏 | 蜜桃av久久久亚洲精品 | 久久国产影院 | 天天干,天天干 | 91中文字幕在线播放 | 国产色中涩 | 美女免费视频一区 | 日日夜夜精品视频天天综合网 | 亚洲视频一级 | 国产视频中文字幕 | 国产色视频一区二区三区qq号 | 手机在线看永久av片免费 | 日韩精品91偷拍在线观看 | 蜜臀av性久久久久蜜臀av | 中文在线a√在线 | 国产视频一区精品 | 午夜精品久久久久久久99 | 91视频免费观看 | 成年人视频免费在线播放 | 成人av在线网址 | 天堂久色| av夜夜操| 免费观看一级特黄欧美大片 | 久草免费在线观看 | 日韩免费专区 | 欧美人交a欧美精品 | 欧美大jb| 最新日韩视频在线观看 | 亚洲激情综合网 | 国产专区在线看 | 久久国产手机看片 | 日韩免费在线视频观看 | 日韩欧美综合精品 | 久久精品综合一区 | 国产精品久久久久久久久久久久午夜 | 亚洲精品一区二区18漫画 | 456免费视频 | 麻豆免费精品视频 | 人交video另类hd | 夜夜躁日日躁狠狠躁 | 一区精品久久 | 久久久 精品 | 久久激情综合网 | 2019中文 | 欧美日韩在线观看视频 | 亚洲一级电影视频 | 日韩视频欧美视频 | 久久人人精 | 国产亚洲免费观看 | 成人中心免费视频 | 中文字幕中文字幕在线中文字幕三区 | 四虎在线视频免费观看 | 91在线观看视频 | 亚洲欧洲国产视频 | 最近最新mv字幕免费观看 | 婷婷在线看 | 欧美午夜精品久久久久久孕妇 | 免费av在 | 婷婷久久亚洲 | 天堂在线一区二区 | 在线观看亚洲a | 一区二区精品在线视频 | 欧美激情第八页 | 亚洲国产99 | 福利一区视频 | 欧美一级黄色视屏 | 精品99在线视频 | 中文字幕制服丝袜av久久 | 99久久99久久精品国产片果冰 | 亚洲精品国产拍在线 | av在线免费网站 | 91亚洲精品国偷拍自产在线观看 | 国产一级在线看 | av不卡免费在线观看 | 在线免费国产视频 | 久久艹免费 | 国产精品欧美一区二区三区不卡 | 日本黄色免费大片 | 91完整版在线观看 | 黄网在线免费观看 | 91高清不卡 | 亚洲精选在线 | 视频一区二区视频 | 日本久久影视 | 免费在线观看日韩 | 欧美日韩高清在线 | 欧美 日韩 国产 成人 在线 | 国产精品乱码久久久久久1区2区 | 亚洲国内精品视频 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 成年人网站免费在线观看 | 丁香网五月天 | 国产亚洲精品久久久久久移动网络 | 狠狠色狠狠综合久久 | 精品专区一区二区 | 四虎在线免费视频 | 国产专区精品 | 日本一区二区不卡高清 | 在线色亚洲| 97人人模人人爽人人喊中文字 | 激情综合网五月 | 视频国产在线观看18 | 国产精品网址在线观看 | 天天干天天干天天射 | 91精品视频在线看 | 81国产精品久久久久久久久久 | 久久久久久久国产精品视频 | 日韩三级视频在线观看 | 欧美一级特黄aaaaaa大片在线观看 | 中文字幕精品久久 | 国产成人av电影在线观看 | www.狠狠| 天天骚夜夜操 | 98超碰在线观看 | 福利视频| 精品在线视频一区二区三区 | 99一级片 | 丝袜美腿亚洲 | 片网址| 香蕉一区| 在线播放你懂 | 99热精品国产 | 亚洲日日日| 福利视频一区二区 | 成人av片在线观看 | 9在线观看免费高清完整版在线观看明 | 久久人人97超碰国产公开结果 | 18+视频网站链接 | 黄色免费大片 | 狠狠色丁香婷婷综合欧美 | 国产成人久久av | 国产视频在线免费 | 不卡av在线播放 | 国产中文字幕视频在线 | 亚洲精品国精品久久99热 | 亚洲国产成人在线播放 | 国产视频亚洲精品 | 在线观看亚洲精品视频 | 中文字幕精 | 国产专区日韩专区 | 久久国产精品久久精品 | 久久久久这里只有精品 | 国产成人精品一区一区一区 | 天天操天天干天天操天天干 | 精品在线视频播放 | 国精产品一二三线999 | 在线探花| 在线电影日韩 | 五月天综合 | 麻豆精品传媒视频 | 天天操天天艹 | 欧美成年人在线视频 | 特级毛片在线观看 | 91你懂的 | 精品国产理论片 | 在线电影日韩 | 亚洲黄色免费网站 | 91麻豆精品国产91 | 国产一区二区午夜 | 欧美一级电影在线观看 | 国产资源网 | 99久久精品久久久久久清纯 | 国产麻豆视频免费观看 | 国产黄影院色大全免费 | jizz欧美性9 国产一区高清在线观看 | 久久久久久久久久国产精品 | 成人网页在线免费观看 | 久久久久久久久久久久久久免费看 | 又黄又爽又刺激 | 免费在线色视频 | 97超碰超碰 | 久久国产一二区 | 午夜视频在线网站 | 三级视频片 | 99中文视频在线 | 黄色大片日本免费大片 | 日韩v欧美v日本v亚洲v国产v | 日本h在线播放 | 婷婷网址 | 天天搞夜夜骑 | 视频国产在线观看18 | 国产精品毛片一区视频播不卡 | 九月婷婷色 | 亚洲日本一区二区在线 | 四虎在线观看 | 缴情综合网五月天 | 成人av直播 | www日日| 欧美一区二区三区在线 | 91完整版| 人人插人人 | 夜夜摸夜夜爽 | av永久网址 | 福利区在线观看 | 91麻豆精品国产91久久久久久 | www五月天婷婷 | 天天干天天想 | 久久久久久久网站 | 久久免费成人网 | 中文字幕资源网在线观看 | 久久字幕 | 去看片 | 免费日韩 | 99色国产 | 成人啪啪18免费游戏链接 | 久久久国产精品人人片99精片欧美一 | 久久99视频免费 | 99久久激情 | 91视频高清免费 | 国产色拍| 激情欧美丁香 | 久草香蕉在线 | 色噜噜噜噜 | 蜜桃视频精品 | 狠狠色丁香婷婷综合最新地址 | av黄色影院 | 亚洲动漫在线观看 | 欧美黑人性猛交 | 911亚洲精品第一 | 亚洲精品国产综合99久久夜夜嗨 | 伊人影院得得 | 麻豆国产在线视频 | 波多在线视频 | 日韩av高清在线观看 | 97操碰| 伊甸园永久入口www 99热 精品在线 | 手机在线小视频 | 亚洲片在线资源 | 国产精品h在线观看 | 91看片在线看片 | 天天干天天综合 | 国模精品在线 | 久久九九国产视频 | 欧美日韩亚洲精品在线 | 国产高清久久久 | 人人躁| 天天搞天天干 | 美女视频黄是免费的 | 999视频在线播放 | 日本福利视频在线 | 国产精品99久久久久久久久 | 成人av在线影院 | 色婷婷九月 | 午夜黄色 | 五月婷婷黄色 | 亚洲精品视频网站在线观看 | 精品国产一区二区三区男人吃奶 | 色婷婷av一区二 | 99视频在线观看免费 | 国产精品久久久影视 | 久久久国产成人 | 成人免费在线观看入口 | 国产中文字幕在线 | 97精品国产97久久久久久久久久久久 | 精品美女在线观看 | 亚洲粉嫩av | 日韩免费三区 | 久久免费精彩视频 | 超碰午夜 | 精品91在线 | 成人黄大片 | 免费在线观看黄色网 | 精品美女视频 | 日韩精品不卡 | 日韩欧美高清在线观看 | 欧美日韩精品影院 | 久久狠狠干 | 欧美久久精品 | 中文字幕av有码 | 免费看十八岁美女 | 九九在线高清精品视频 | 日本特黄特色aaa大片免费 | 丝袜美腿在线播放 | 911香蕉视频| 狠狠操狠狠干2017 | 69精品在线 | 国产成人在线观看免费 | 午夜精品久久久久久久99 | 日韩成人不卡 | 伊人色综合久久天天网 | 日韩一区正在播放 | 亚洲黄在线观看 | 日日综合| 国产精品久久久久久久99 | 中文字幕精品三级久久久 | 国产精品国内免费一区二区三区 | 国产一区二区免费在线观看 | 国产精品毛片久久蜜 | 国产五月天婷婷 | 二区中文字幕 | 丁香久久综合 | 国产在线一区二区三区播放 | 丁香婷婷激情国产高清秒播 | 日韩电影中文字幕 | 99久久久久久久 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 超级av在线 | 国产精品视频免费看 | 美女av免费看 | 97偷拍在线视频 | www.看片网站| 亚洲视频一级 | 三上悠亚一区二区在线观看 | 狠狠干免费 | 国产精品国产亚洲精品看不卡15 | 久久噜噜少妇网站 | 日本狠狠色 | 一区二区三区中文字幕在线观看 | 国产精品久久久久影视 | 99免费看片| 中文字幕精品一区久久久久 | 六月丁香婷婷网 | 日韩精品不卡在线 | av成人黄色| 亚洲国产成人精品久久 | 成人免费一级 | 亚洲欧美激情精品一区二区 | 91久久久久久久 | av在线播放一区二区三区 | 美女网站在线观看 | 亚洲黄色免费在线看 | 日韩欧美在线不卡 | 91片在线观看| 蜜桃视频日韩 | 在线中文字幕一区二区 | 亚洲免费在线播放视频 | 久草99| 亚洲精品一区二区18漫画 | 国产精品美女免费 | 成人欧美一区二区三区在线观看 | 中文字幕有码在线观看 | 日韩电影精品一区 | 国产精品高清免费在线观看 | 久久综合久久88 | av免费试看 | 黄色免费网站大全 | 日韩精品久久久久久 | 久久久久久久免费 | www.日日日.com | 色综合亚洲精品激情狠狠 | 国内成人精品2018免费看 | 外国av网 | 免费国产黄线在线观看视频 | 黄色片免费看 | av性网站 | 久久成人免费电影 | 成人久久久久久久久 | 一本之道乱码区 | 在线欧美最极品的av | 天天干天天天 | 不卡精品 | 五月天丁香综合 | 一区二区三区日韩在线 | 国产打女人屁股调教97 | 激情开心| 精品久久国产一区 | 国产啊v在线观看 | 国产精品国产三级国产专区53 | 超碰成人免费电影 | 99热这里只有精品久久 | 国产免费a | 免费黄a大片 | 18+视频网站链接 | 91亚洲精品久久久蜜桃借种 | 久久优| 一级一片免费视频 | 国产91精品一区二区麻豆网站 | 国产成人一级电影 | 97色在线观看免费视频 | 久久久这里有精品 | 亚州中文av | 在线三级播放 | 99理论片 | 人人爽人人 | 国产一区二区三区午夜 | 成人久久视频 | 免费在线观看一区二区三区 | 天堂网一区二区三区 | 国产视频日本 | 69欧美视频 | 久久综合狠狠综合久久激情 | 国产黄色免费观看 | 色综合天天狠狠 | 99久久er热在这里只有精品66 | 欧美a级免费视频 | 国产香蕉97碰碰碰视频在线观看 | 亚洲国产中文字幕在线 | av中文字幕网站 | 成 人 黄 色 免费播放 | 亚洲视频国产 | 日韩av影片在线观看 | 91精品国产91久久久久 | 久久久久久国产精品 | 五月开心六月伊人色婷婷 | 国产小视频在线观看免费 | 日韩成人黄色av | 丁香婷婷激情 | 黄色大全在线观看 | 精品免费国产一区二区三区四区 | 婷婷中文字幕在线观看 | 91在线视频免费观看 | 欧美日韩国产精品久久 | 亚洲国产精品传媒在线观看 | 国产精在线 | 国产中文伊人 | 99在线精品免费视频九九视 | 国产麻豆精品一区 | 99久久久久国产精品免费 | 黄色在线观看网站 | 人人爽人人爽人人爽 | 国产日产精品一区二区三区四区 | 99在线热播精品免费99热 | 91精品国自产在线观看 | 伊人网综合在线观看 | av资源免费观看 | 色婷婷综合久久久中文字幕 | 天天射天天干天天 | 成人综合婷婷国产精品久久免费 | 婷婷综合伊人 | 色就干| 婷婷在线精品视频 | 国产精品久久久久久婷婷天堂 | 免费观看一区二区三区视频 | 视频在线亚洲 | 午夜精品一二区 | 国产va饥渴难耐女保洁员在线观看 | 中文字幕免费高清av | 欧美国产大片 | 99九九99九九九视频精品 | 插综合网 | 成人三级网站在线观看 | 黄色视屏免费在线观看 | 天堂资源在线观看视频 | 国产精品一区二区久久久 | 亚洲综合在线五月天 | 成人在线免费小视频 | 亚洲成av人影院 | 久久99欧美 | 最新中文字幕 | 国产亚州精品视频 | 婷婷av综合 | 亚洲精品www. | 日韩在线观 | 97av视频 | 亚洲精品免费观看 | 狠狠干夜夜操天天爽 | 在线观看 亚洲 | 日本精品久久久一区二区三区 | 中文字幕高清有码 | 伊人看片 | 中文字幕av影院 | 国产精品久久一区二区无卡 | 伊人成人激情 | 日本精品久久久久影院 | 色小说在线 | 亚洲成人av电影在线 | 美女网站免费福利视频 | 插综合网 | 麻豆免费在线视频 | 亚洲高清在线视频 | 婷婷丁香在线 | 特级毛片在线免费观看 | 国产精品欧美日韩 | 日韩视频一区二区 | 久久国产品| 成人av在线播放网站 | 色综合婷婷 | 激情av网址 | 久久久这里有精品 | 狠狠地日| 美女视频a美女大全免费下载蜜臀 | 日韩在线二区 | 亚洲视屏在线播放 | 久久久在线免费观看 | 国产高清av在线播放 | 国产裸体视频网站 | 亚洲黄色在线播放 | 久久艹艹 | 亚洲国产精品成人精品 | 国产无套视频 | 久日精品 | 99中文字幕视频 | 麻豆精品视频在线观看免费 | 伊人狠狠操 | 亚洲国产黄色片 | 亚洲精品在线观看的 | 欧美三人交 | 成人免费在线观看入口 | 97成人精品区在线播放 | 欧美黑人xxxx猛性大交 | 欧美精品你懂的 | 日日操日日干 | 91高清视频在线 | 亚洲男男gⅴgay双龙 | 丰满少妇一级片 | 日韩黄色免费看 | 久久永久免费视频 | 成人资源在线观看 | 国产精品永久在线观看 | 欧美日韩国产欧美 | 狠狠夜夜 | 1024手机看片国产 | 国产在线a | 亚洲一区二区三区毛片 | v片在线播放 | 精品久久久久久久久久久久久久久久 | 丁香国产视频 | 成人精品999 | 亚洲国产中文在线 | 13日本xxxxxⅹxxx20 | 夜又临在线观看 | 久久九精品 | 久久不卡国产精品一区二区 | 欧美成年黄网站色视频 | 欧美激情第十页 | 成人午夜剧场在线观看 | 黄色a视频免费 | 在线免费黄色av | 亚洲精品99久久久久中文字幕 | 国产一线二线三线性视频 | 日韩久久精品 | 日韩精品极品视频 | а中文在线天堂 | 色网站免费在线看 | 中文字幕在线视频一区二区 | 国产精品一区二区 91 | 探花视频在线版播放免费观看 | 国产精品99在线播放 | 欧美日韩一区二区久久 | 97在线观看免费高清完整版在线观看 | 久久精品成人欧美大片古装 | 亚洲精品国偷拍自产在线观看蜜桃 | 久久久久久99精品 | 欧美激情视频一区二区三区免费 | 久久手机精品视频 | 91精品国产自产老师啪 | 日日夜夜精品 | 伊人资源视频在线 | 成人av在线电影 | 一本色道久久综合亚洲二区三区 | 深爱激情婷婷网 | 欧美成人久久 | 国产一级精品在线观看 | 91视频免费看网站 | 91九色porn在线资源 | 夜夜躁天天躁很躁波 | 久久久麻豆 | 国产精品一区二区三区免费视频 | 久久视频这里只有精品 | 国产69久久久| 久久久久久激情 | 四虎成人精品在永久免费 | 色网av | 成人在线小视频 | 国产伦理久久精品久久久久_ | 久久经典国产视频 | 日韩久久精品一区二区三区 | 日韩精品一区二区在线 | 一区二区三区日韩视频在线观看 | 国产黄色大片 | 久久99最新地址 | 亚洲精品字幕在线观看 | 日韩中文字幕免费视频 | 日韩一二三 | 激情网站免费观看 | 五月婷婷另类国产 | 99看视频在线观看 | 欧美伦理一区二区三区 | 激情久久五月天 | 免费在线成人av | 亚洲天堂va | 欧美与欧洲交xxxx免费观看 | 国产精品黄 | 成人av影院在线观看 | 午夜电影av| 亚洲综合精品在线 | 最近中文字幕视频网 | 91九色视频在线观看 | 欧美一级片免费播放 | 992tv在线观看| 亚洲精品在线观看av | 99精品视频在线播放免费 | 免费av一级电影 | 亚洲成人黄色av | a午夜电影 | 亚洲精品一区二区三区四区高清 | 久久久久麻豆v国产 | 国产精品久久久毛片 | 日韩av成人在线 | 免费日韩三级 | 久久精品免费电影 | 中文乱码视频在线观看 | 免费福利小视频 | 中文字幕在线看视频 | 我爱av激情网 | 国产精品中文久久久久久久 | 91在线视频观看免费 | 成人h电影 | 亚洲黄色免费 | 色婷婷免费视频 | 亚洲 欧美变态 另类 综合 | 久久99亚洲网美利坚合众国 | 国内精品小视频 | 国产成人亚洲精品自产在线 | 亚洲狠狠操 | 国产成人av网站 | 黄色av在| 色播亚洲婷婷 | jizz18欧美18| 99人久久精品视频最新地址 | 999成人 | 五月婷婷天堂 | 在线有码中文字幕 | 亚洲免费在线视频 | 亚洲专区免费观看 | 亚洲午夜精品在线观看 | 国产精品高清一区二区三区 | 色网站视频 | 黄色aaa毛片 | 在线观看成人一级片 | 天天射成人 | 五月天婷亚洲天综合网精品偷 | 国内99视频 | 久久人人爽人人爽人人片 | 天天射天天艹 | 亚洲综合在线观看视频 | 五月婷婷激情综合网 | 免费涩涩网站 | 久久97超碰| 91成人免费看 | 99久久激情视频 | 国产区免费在线 | 亚洲欧美视频在线播放 | 亚洲欧美日韩精品一区二区 | 在线观看日韩精品 | 999国内精品永久免费视频 | 亚洲在线精品 | 高清不卡毛片 | 中文字幕在线观看国产 | 欧美日韩精品免费观看 | 99久精品视频 | 久久字幕网 | 91精品国产乱码久久 | 亚洲男男gaygay无套同网址 | 久久久精品久久日韩一区综合 | av丝袜在线 | 97福利| 成人a级黄色片 | 日本二区三区在线 | 在线观看涩涩 | 亚洲精选久久 | 亚洲精品66| 一级黄色大片在线观看 | 国产高清 不卡 | 久久爽久久爽久久av东京爽 | 欧美一级xxxx| 国产精品一区二区在线观看 | 欧美三级在线播放 | 久久久官网 | 婷婷www| 免费a网站 | 久久久久久久久久福利 | 黄色毛片一级 | 性色av免费看 | 在线观看黄色免费视频 | 精品毛片一区二区免费看 | 欧美另类交人妖 | 亚洲日日日 | 久久高视频 | 精品久久久久久久久久岛国gif | 日韩精品视频第一页 | 日本精品一区二区三区在线播放视频 | www.人人干| 天天干天天干天天色 | 婷婷色在线资源 | 96久久久| 国产区精品视频 | 婷婷久草 | 99精品黄色 | 免费的黄色av | 伊人婷婷网 | 欧美日韩视频精品 | 欧美日韩一区二区在线观看 | 国产精品网站 | 成人毛片一区二区三区 | 免费a级毛片在线看 | 亚洲人成免费网站 | 日韩在线视频观看 | 女人魂免费观看 | 青青草华人在线视频 | 日日爽天天爽 | 国产精品涩涩屋www在线观看 | www激情网 | 久久一区国产 | 91久久国产精品 | 久久久www成人免费精品张筱雨 | 在线va视频 | 国产精品久久久久久久久久久免费 | 久热精品国产 | 天天草天天插 | 久久激情视频网 | 国产资源精品在线观看 | 久日视频 | 免费日韩视 | 国产一区二区电影在线观看 | 激情五月播播久久久精品 | 黄色tv视频 | 99re中文字幕 | 91天堂素人约啪 | 99久久精品免费看国产免费软件 | 婷婷亚洲五月色综合 | 在线免费视频一区 | 中文字幕第一 | 亚洲综合最新在线 | 国产精品久久久免费看 | 国产无遮挡又黄又爽馒头漫画 | 99久久成人 | 99久久精品免费看 | 99一区二区三区 | 在线观看免费成人 | av网站免费线看精品 | 成人av免费网站 | 国产美女主播精品一区二区三区 | 日韩高清不卡一区二区三区 | 欧美一级专区免费大片 | 国产精久久久久久妇女av | 成人免费在线播放 | 夜夜操综合网 | 久久免费视频这里只有精品 | 久久视屏网 | 日日干,天天干 | 久草国产视频 | 久久色中文字幕 | 夜夜操狠狠操 | 欧美性一级观看 | 国产精品毛片一区二区三区 | 嫩嫩影院理论片 | 亚洲一区日韩精品 | 一级成人网 | 最近中文字幕国语免费av | 黄色a在线观看 | 午夜视频在线观看一区二区三区 | 中文字幕在线免费97 | 就操操久久 | 国产精品麻豆视频 | 亚洲欧美日韩在线一区二区 | 日日夜夜天天久久 | 五月激情视频 | 日韩午夜av | 国产亚洲视频系列 | 日日夜夜天天久久 | 亚洲精品国产精品久久99热 | 亚洲va韩国va欧美va精四季 | 五月天国产精品 | 天堂久久电影网 | 亚洲午夜久久久久久久久久久 | 久久99精品久久久久久三级 | 在线看国产视频 | 欧美午夜一区二区福利视频 | av在线免费观看网站 | 成人午夜网址 | av午夜电影| 亚洲三级在线播放 | 国产亚洲一区二区在线观看 | 欧美日韩在线观看一区 | 丁香色婷 | www.夜夜操| 狠狠色丁香久久婷婷综合丁香 | 亚洲精品午夜国产va久久成人 | 欧美精品一区二区性色 | 久久久www成人免费毛片 | 亚洲天天综合网 | 免费的国产精品 | 免费看三片 | 久久这里有 | 91九色国产在线 | 亚洲一级片在线看 | 亚洲精品大全 | 色99色| 国产成人精品亚洲 | 久久精品123| 97在线观看免费高清 | 天天干天天拍天天操天天拍 | 就要干b | 国产精品毛片一区二区在线看 | 成人av中文字幕在线观看 | 国产精品一区在线 | 国产精品久久久亚洲 | 午夜999| 狠狠做深爱婷婷综合一区 | 久久97超碰| 久久久国产精品一区二区三区 | 亚洲精品视频在线观看免费 | 亚洲国产综合在线 | 99热这里精品 | www久久 | 久久精品99国产 | 中文字幕国产在线 | av一级片网站 | 成人动漫精品一区二区 | 超级碰99| 91亚色视频| 国产永久免费观看 | 超碰国产在线播放 | 黄在线免费观看 | 精品高清视频 | 久久99精品久久久久蜜臀 | 又紧又大又爽精品一区二区 | 国产午夜精品福利视频 | www.色在线| 免费亚洲一区二区 | 久久久www免费电影网 | 欧美 高跟鞋交 xxxxhd | 久久精品伊人 | 国产清纯在线 | 亚洲高清av | 国产亚洲精品久久久久久久久久 | 中文字幕有码在线播放 | 亚洲专区视频在线观看 | 亚洲精品免费在线播放 | 97精品视频在线播放 | 午夜精品电影 | 中文字幕视频三区 | 免费观看一级一片 | av大全在线播放 | 91视频 - x99av| 久久国产露脸精品国产 | 久久资源总站 | 久久视频在线观看中文字幕 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 91九色视频网站 | 国产在线资源 | 91在线视频一区 | 国产精品免费一区二区 | 91免费观看视频网站 | 成人aⅴ视频 | 中文字幕在线观看免费 | 91人人在线 | 国产精品99久久久久久久久久久久 | www在线观看国产 | 日本精品视频免费观看 | 久精品在线观看 | 日韩一二区在线 | 中文字幕免费不卡视频 | 成人91免费视频 | 免费观看黄| 色视频网站在线观看一=区 a视频免费在线观看 | 成人免费在线视频观看 | 国产免费成人 | 久久久久久亚洲精品 | 香蕉久久久久久久 | 日本性久久 | 天天干天天在线 | 欧美少妇xxx | 久草视频资源 |