日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

优雅的监听软键盘隐藏

發(fā)布時(shí)間:2023/12/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 优雅的监听软键盘隐藏 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

背景

  • Android軟鍵盤的顯示和隱藏,從開始做直播這塊,就一直困擾著我。
  • 從布局?jǐn)D壓,到輸入?yún)^(qū)顯示不全,再到閃屏以及卡頓,這里的坑讓我跌倒無數(shù)次。
  • 各種布局監(jiān)聽,回調(diào),代碼冗余、復(fù)雜、與業(yè)務(wù)強(qiáng)耦合無法復(fù)用,還是沒有很好的解決鍵盤的彈出和隱藏
  • 為了給用戶更好的操作體驗(yàn),決定找到一種最優(yōu)解決方案。
  • 科普基礎(chǔ)知識(shí)-WindowSoftInputMode

    Activity 的主窗口與包含屏幕軟鍵盤的窗口的交互方式。改屬性的設(shè)置影響兩個(gè)方面:

    • 當(dāng)Activity成為用戶注意的焦點(diǎn)時(shí)軟鍵盤的狀態(tài)-隱藏還是可見
    • 對(duì)Activity主窗口所做的調(diào)整-是否將其尺寸調(diào)小以為軟鍵盤騰出空間,或者當(dāng)窗口部分被軟鍵盤遮擋時(shí)是否平移其那內(nèi)容使當(dāng)前焦點(diǎn)可見。

    該設(shè)置必須是下標(biāo)所列的值之一,或者一個(gè)state...值加上一個(gè)adjust...值的組合。在任一一組設(shè)置多個(gè)值(例如,多個(gè)state...值)都會(huì)產(chǎn)生未定義結(jié)果。各個(gè)值之間使用垂直條(|)分割。

    值說明
    stateUnspecified不指定軟鍵盤的狀態(tài)(隱藏還是可見)。 將由系統(tǒng)選擇合適的狀態(tài),或依賴主題中的設(shè)置。這是對(duì)軟鍵盤行為的默認(rèn)設(shè)置。
    stateUnchanged當(dāng) Activity 轉(zhuǎn)至前臺(tái)時(shí)保留軟鍵盤最后所處的任何狀態(tài),無論是可見還是隱藏。
    stateHidden當(dāng)用戶選擇 Activity 時(shí) — 也就是說,當(dāng)用戶確實(shí)是向前導(dǎo)航到 Activity,而不是因離開另一 Activity 而返回時(shí) — 隱藏軟鍵盤。
    stateAlwaysHidden當(dāng) Activity 的主窗口有輸入焦點(diǎn)時(shí)始終隱藏軟鍵盤。
    stateVisible在正常的適宜情況下(當(dāng)用戶向前導(dǎo)航到 Activity的主窗口時(shí))顯示軟鍵盤。
    stateAlwaysVisible當(dāng)用戶選擇 Activity 時(shí) — 也就是說,當(dāng)用戶確實(shí)是向前導(dǎo)航到 Activity,而不是因離開另一 Activity 而返回時(shí) — 顯示軟鍵盤。
    adjustUnspecified不指定 Activity 的主窗口是否調(diào)整尺寸以為軟鍵盤騰出空間,或者窗口內(nèi)容是否進(jìn)行平移以在屏幕上顯露當(dāng)前焦點(diǎn)。 系統(tǒng)會(huì)根據(jù)窗口的內(nèi)容是否存在任何可滾動(dòng)其內(nèi)容的布局視圖來自動(dòng)選擇其中一種模式。 如果存在這樣的視圖,窗口將進(jìn)行尺寸調(diào)整,前提是可通過滾動(dòng)在較小區(qū)域內(nèi)看到窗口的所有內(nèi)容。這是對(duì)主窗口行為的默認(rèn)設(shè)置。
    adjustResize始終調(diào)整 Activity 主窗口的尺寸來為屏幕上的軟鍵盤騰出空間
    adjustPan不調(diào)整 Activity 主窗口的尺寸來為軟鍵盤騰出空間, 而是自動(dòng)平移窗口的內(nèi)容,使當(dāng)前焦點(diǎn)永遠(yuǎn)不被鍵盤遮蓋,讓用戶始終都能看到其輸入的內(nèi)容。 這通常不如尺寸調(diào)正可取,因?yàn)橛脩艨赡苄枰P(guān)閉軟鍵盤以到達(dá)被遮蓋的窗口部分或與這些部分進(jìn)行交互。

    官方解釋

    網(wǎng)上解決方案

    第一種方案

    由于Activity.onKeyDownn()是監(jiān)聽不到向下的按鍵,所以自定義Edittext,重寫onKeyPreIme方法

    /*** 攔截鍵盤向下按鍵的 EditTextView*/ public class TextEditTextView extends DmtEditText {public TextEditTextView(Context context) {super(context);}public TextEditTextView(Context context, AttributeSet attrs) {super(context, attrs);}public TextEditTextView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overridepublic boolean onKeyPreIme(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == 1 && onKeyBoardHideListener != null) {onKeyBoardHideListener.onKeyHide();}return super.onKeyPreIme(keyCode, event);}/*** 鍵盤監(jiān)聽接口*/private OnKeyBoardHideListener onKeyBoardHideListener;public void setOnKeyBoardHideListener(OnKeyBoardHideListener onKeyBoardHideListener) {this.onKeyBoardHideListener = onKeyBoardHideListener;}public interface OnKeyBoardHideListener {void onKeyHide();} }

    為什么重寫onKeyDown()方法,監(jiān)聽不到虛擬鍵的向下按鍵,而重寫EditTextView的onKeyPreIme可以監(jiān)聽到,這篇博客寫的很明白。

    第二種方案

    使用ViewTreeObserver.OnGlobalLayoutListener來監(jiān)聽整個(gè)布局的變化,但是有問題,點(diǎn)擊軟鍵盤的“向下”按鍵,不會(huì)回調(diào)這個(gè)函數(shù)。

    View.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener(){//當(dāng)鍵盤彈出隱藏的時(shí)候會(huì) 調(diào)用此方法。@Overridepublic void onGlobalLayout() {final Rect rect = new Rect();activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);final int screenHeight = activity.getWindow().getDecorView().getRootView().getHeight();final int heightDifference = screenHeight - rect.bottom;boolean visible = heightDifference > screenHeight / 3;if(visible){Log.i(TAG,"軟鍵盤顯示");}else {Log.i(TAG,"軟鍵盤隱藏");}} });

    第三種方案

    將布局撐滿全屏,來監(jiān)聽onMeasure()的變化,這種方式可以生效,但是和業(yè)務(wù)耦合性太大,而且在全面屏的時(shí)候處理比較麻煩,就不貼代碼了

    總結(jié)

    基本上所有監(jiān)聽軟鍵盤的方式,都是通過上面的三種方式實(shí)現(xiàn)的。實(shí)現(xiàn)效果比較好是Android鍵盤面板沖突 布局閃動(dòng)處理方案

    所有的方式都是在本頁面上去彈起軟鍵盤,軟鍵盤是dialog,而且頁面的邏輯和復(fù)雜程度有各種情況,非常難以考慮。真是讓人抓耳撓腮呀。

    打個(gè)響指,換種思路

    沒有非要在一個(gè)頁面內(nèi)完成軟鍵盤的調(diào)度,我們可以另起爐灶,去實(shí)現(xiàn)這個(gè)功能。

    使用DialogFragment來實(shí)現(xiàn)軟鍵盤功能

    這種情況還是與業(yè)務(wù)有一定的關(guān)聯(lián),我不敢說這種方案能夠解決所有情況下的軟鍵盤使用問題,但是能解決很多情況下的使用。

    先說一下我的使用場(chǎng)景,因?yàn)槲沂秦?fù)責(zé)直播模塊的開發(fā),軟鍵盤的彈出和隱藏時(shí)的輸入部分ui是不相同。使用抖音的直播舉個(gè)例子

    可以看到軟鍵盤在打開和關(guān)閉的時(shí)候是不同的ui,那么就可以使用DialogFragment來實(shí)現(xiàn)功能。我們最主要實(shí)現(xiàn)就是監(jiān)聽軟鍵盤的彈出和隱藏,彈出問題不大,這里最深的坑就是監(jiān)聽鍵盤的消失,先總結(jié)一下鍵盤消失的場(chǎng)景:

  • 點(diǎn)擊空白區(qū)域消失
  • 點(diǎn)擊虛擬鍵能向下按鍵隱藏鍵盤
  • 點(diǎn)擊軟鍵盤向下按鈕隱藏鍵盤
  • 點(diǎn)擊發(fā)送按鈕后,消失鍵盤
  • ps: 2和3,看上去好像是一樣的啊,大家肯定有一些疑惑,看圖說話

    從張圖中可以清晰的看出來兩者的區(qū)別,其實(shí)android的原生鍵盤是沒有向下的按鈕的,各個(gè)第三方的輸入法自己實(shí)現(xiàn)的,andorid中沒有回調(diào)可以監(jiān)聽到這個(gè)事件(坑爹啊)。而且
    ViewTreeObserver 監(jiān)聽不到點(diǎn)擊這個(gè)按鈕時(shí)的布局變化(坑爹啊!!!),我只是在mix2手機(jī)上測(cè)試的,其他的手機(jī)類型我不敢確保也是同樣的問題。

    來來來,在做個(gè)小結(jié)

    • 軟鍵盤的彈出時(shí)可以監(jiān)聽的
    • 消失幾種情況中,除了軟鍵盤的向下按鍵其他都可以做到監(jiān)聽,或者可以拿到觸發(fā)的時(shí)機(jī)。

    搜了一大圈,好像沒有找到比較好的解決方案,怎么辦呢?但是別人家的直播都是可以做到的呀,這時(shí)看到了View.getWindowVisibleDisplayFrame()方法,來看下官方的解釋

    /*** Retrieve the overall visible display size in which the window this view is* attached to has been positioned in. This takes into account screen* decorations above the window, for both cases where the window itself* is being position inside of them or the window is being placed under* then and covered insets are used for the window to position its content* inside. In effect, this tells you the available area where content can* be placed and remain visible to users.** <p>This function requires an IPC back to the window manager to retrieve* the requested information, so should not be used in performance critical* code like drawing.** @param outRect Filled in with the visible display frame. If the view* is not attached to a window, this is simply the raw display size.*/public void getWindowVisibleDisplayFrame(Rect outRect) {if (mAttachInfo != null) {try {mAttachInfo.mSession.getDisplayFrame(mAttachInfo.mWindow, outRect);} catch (RemoteException e) {return;}// XXX This is really broken, and probably all needs to be done// in the window manager, and we need to know more about whether// we want the area behind or in front of the IME.final Rect insets = mAttachInfo.mVisibleInsets;outRect.left += insets.left;outRect.top += insets.top;outRect.right -= insets.right;outRect.bottom -= insets.bottom;return;}// The view is not attached to a display so we don't have a context.// Make a best guess about the display size.Display d = DisplayManagerGlobal.getInstance().getRealDisplay(Display.DEFAULT_DISPLAY);d.getRectSize(outRect);}

    大概意思:這個(gè)api是用來獲取窗口可視區(qū)域大小的。該大小會(huì)收到系統(tǒng)狀態(tài)欄、軟鍵盤和虛擬按鍵的影響。在應(yīng)用開發(fā)中可以利用該api來獲取狀態(tài)欄的高度,軟鍵盤的高度和虛擬按鍵的高度。

    解決方案:
    既然沒有回調(diào)能夠拿到虛擬鍵盤的向下操作,那么我們就輪詢監(jiān)聽窗口的大小,由于這個(gè)dialogFragment的生命周期只是在輸入的時(shí)候存在,那么就以為這這個(gè)輪詢時(shí)間也不會(huì)太長(zhǎng),100ms輪詢一次來監(jiān)聽窗口變化的大小,完美解決(如果還有其他優(yōu)雅的解決方案,請(qǐng)告訴我)。

    用DialogFragment實(shí)現(xiàn)輸入?yún)^(qū)域的好處:

  • 輸入部分的邏輯與其他業(yè)務(wù)本分的邏輯隔離,實(shí)現(xiàn)解耦
  • DialogFragment也是一個(gè)dialog,可以單獨(dú)處理鍵盤彈出時(shí)的邏輯
  • 有了以上兩點(diǎn)考慮,我就開始動(dòng)手寫代碼

    Version 1

    源代碼就不貼了,太長(zhǎng)了,而且大部分和業(yè)務(wù)相關(guān),所有的業(yè)務(wù)邏輯和功能邏輯全部寫在DialogFragment中,看上去沒什么問題,如果突然有一天,另外的一個(gè)地方要做到類似的邏輯,又要重新寫一遍功能邏輯,完全不能復(fù)用呀,這樣的實(shí)現(xiàn)方案是不行的,打回去重做。嗯,需要將業(yè)務(wù)邏輯和功能邏輯分割開,這樣可以很大程度上的復(fù)用當(dāng)前代碼。

    Version 2

    首先要定義一個(gè)接口,來定義此類功能的統(tǒng)一調(diào)用方式,所有要實(shí)現(xiàn)此功能的類都要實(shí)現(xiàn)這個(gè)接口

    public interface IKeyBoard {// EditTextView需要繼承TextEditTextView,TextEditTextView是用來監(jiān)聽虛擬按鍵向下的操作TextEditTextView getEditTextView();// 根布局View getRoot();// dialogFragment 銷毀時(shí)調(diào)用,也就是隱藏時(shí)void onDismiss(); }

    自定義EditTextView

    /*** 攔截鍵盤向下按鍵的 EditTextView*/ public class TextEditTextView extends DmtEditText {public TextEditTextView(Context context) {super(context);}public TextEditTextView(Context context, AttributeSet attrs) {super(context, attrs);}public TextEditTextView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overridepublic boolean onKeyPreIme(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == 1 && onKeyBoardHideListener != null) {onKeyBoardHideListener.onKeyHide();}return super.onKeyPreIme(keyCode, event);}/*** 鍵盤監(jiān)聽接口*/private OnKeyBoardHideListener onKeyBoardHideListener;public void setOnKeyBoardHideListener(OnKeyBoardHideListener onKeyBoardHideListener) {this.onKeyBoardHideListener = onKeyBoardHideListener;}public interface OnKeyBoardHideListener {void onKeyHide();} }

    最主要的類來了:

    /*** 這個(gè)類時(shí)用來實(shí)現(xiàn)輸入框隨軟鍵盤彈出的情況,這個(gè)dialogFragment只負(fù)責(zé)彈起鍵盤的操作,不負(fù)責(zé)具體的ui顯示和邏輯,* 應(yīng)該實(shí)現(xiàn)一個(gè)UI類來實(shí)現(xiàn)相應(yīng)的顯示和邏輯部分。* <p>* 使用方法:* 1. 需要實(shí)現(xiàn){@link IKeyBoard}* 2. UI類需要包含{@link TextEditTextView}* 3. 如果UI需要監(jiān)聽聲明周期,需要實(shí)現(xiàn){@link LifecycleObserver}* <p>* ps:父類的Fragment或者Activity window的setSoftInputMode設(shè)置為{@link WindowManager} SOFT_INPUT_ADJUST_NOTHING** @author liyachao* @date 2018/4/17*/public class KeyBoardDialogFragment extends DialogFragment implements TextEditTextView.OnKeyBoardHideListener,WeakHandler.IHandler {private static final String TAG = "KeyBoardDialogFragment";private IKeyBoard mKeyBoardView;private TextEditTextView mTextEditTextView;private boolean softKeyBoardIsVisible;private Activity mActivity;private WeakHandler mHandler;private Rect mRect = new Rect();public static KeyBoardDialogFragment newInstance(IKeyBoard keyBoard) {KeyBoardDialogFragment fragment = new KeyBoardDialogFragment();Bundle args = new Bundle();fragment.setArguments(args);fragment.setKeyBoardView(keyBoard);return fragment;}/*** 安全檢查* @param keyBoardView 業(yè)務(wù)邏輯的view*/public void setKeyBoardView(IKeyBoard keyBoardView) {if (keyBoardView == null) {throw new RuntimeException("keyBoardView must not be null");} else if (keyBoardView.getEditTextView() == null) {throw new RuntimeException("keyBoardView must has EditTextView");} else if (keyBoardView.getRoot() == null) {throw new RuntimeException("keyBoardView must has root layout");}mKeyBoardView = keyBoardView;mTextEditTextView = keyBoardView.getEditTextView();}/*** 設(shè)置主題 input_dialog_style_large的具體設(shè)置如下* <style name="input_dialog_style_large" parent="@android:style/Theme.Dialog">* <item name="android:windowBackground">@color/transparent</item> //winndow 背景為透明色 * <item name="android:windowNoTitle">true</item> // 沒有title* <item name="android:backgroundDimEnabled">false</item> // 沒有默認(rèn)的背景色* <item name="android:windowAnimationStyle">@style/keyboard_dialog_animation</item> //window動(dòng)畫,可以不設(shè)置* </style>* 業(yè)務(wù)邏輯view,注冊(cè)DialogFragment聲明周期* */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setStyle(STYLE_NO_TITLE, R.style.input_dialog_style_large);if (mKeyBoardView == null || mKeyBoardView.getRoot() == null) {dismiss();return;}if (mKeyBoardView.getRoot() instanceof LifecycleObserver) {getLifecycle().addObserver((LifecycleObserver) mKeyBoardView.getRoot());}mHandler = new WeakHandler(this);}@Overridepublic void onAttach(Context activity) {super.onAttach(activity);mActivity = (Activity) activity;}@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {return mKeyBoardView.getRoot();}@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);mTextEditTextView.setOnKeyBoardHideListener(this);initWindowParams();}/*** 設(shè)置window屬性*/public void initWindowParams() {Window window = getDialog().getWindow();if (window == null) {return;}WindowManager.LayoutParams lp = getDialog().getWindow().getAttributes();lp.dimAmount = 0;lp.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;lp.height = ViewGroup.LayoutParams.WRAP_CONTENT;lp.width = ViewGroup.LayoutParams.MATCH_PARENT;lp.gravity = Gravity.BOTTOM;window.setBackgroundDrawable(new ColorDrawable(0));window.setAttributes(lp);window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);}@Overridepublic Dialog onCreateDialog(Bundle savedInstanceState) {Dialog dialog = super.onCreateDialog(savedInstanceState);dialog.setCanceledOnTouchOutside(true);return dialog;}@Overridepublic void onResume() {super.onResume();mHandler.sendEmptyMessageDelayed(1, 100);}@Overridepublic void onStop() {super.onStop();dismissAllowingStateLoss();mHandler.removeMessages(1);}@Overridepublic void onDestroy() {super.onDestroy();}@Overridepublic void onDismiss(DialogInterface dialog) {super.onDismiss(dialog);mKeyBoardView.onDismiss();}@Overridepublic void onKeyHide() {dismiss();}public void onGlobalLayout() {Window window = getDialog().getWindow();if (window != null) {mRect.setEmpty();window.getDecorView().getWindowVisibleDisplayFrame(mRect);int screenHeight = UIUtils.getScreenHeight(getContext());int heightDifference = screenHeight - (mRect.bottom - mRect.top);if (heightDifference > screenHeight / 3) {Log.d(TAG, "鍵盤彈出");softKeyBoardIsVisible = true;} else {if (softKeyBoardIsVisible) {Log.d(TAG, "鍵盤隱藏");dismiss();softKeyBoardIsVisible = false;}}}}@Overridepublic void handleMsg(Message msg) {if (msg.what == 1) {onGlobalLayout();mHandler.sendEmptyMessageDelayed(1, 100);}} }

    具體的實(shí)現(xiàn)就是上面了,大部分做了注釋,也不需要解釋了,基本上可以解決大部分場(chǎng)景,可以根據(jù)自己具體的業(yè)務(wù)邏輯做一些改動(dòng)。demo就不給大家了,上面基本上就可以了。

    demo下載

    總結(jié)

    以上是生活随笔為你收集整理的优雅的监听软键盘隐藏的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: av色欲无码人妻中文字幕 | av三级 | 与子敌伦刺激对白播放的优点 | 亚洲国产精品视频 | 欧美在线免费看 | 成人精品av | 人人干人人搞 | 黄色精品在线 | 亚洲综合在线成人 | 亚洲第一页中文字幕 | 免费成人在线观看视频 | 亚洲乱码国产乱码精品精的特点 | 用力挺进新婚白嫩少妇 | 国产aⅴ爽av久久久久成人 | xxxx日本免费 | 少妇人禽zoz0伦视频 | 欧美大色网 | 老外一级黄色片 | 欧州一区二区 | 亚洲黄色小视频 | 视频二区在线观看 | 人人澡人人射 | 日韩激情小视频 | 日本美女性生活视频 | 奶水旺盛的女人伦理 | 麻豆精品视频免费观看 | 在线观看免费www | 中文字幕一区二区免费 | 操综合网| 美女乱淫 | 91美女精品网站 | 人人干免费 | 国产丝袜自拍 | 国产在线观看免费高清 | 婷婷国产成人精品视频 | 好吊操妞 | 又爽又黄又无遮挡 | 一级黄色aa| 国产日韩欧美中文字幕 | 免费日韩av | 超能一家人电影免费喜剧在线观看 | 97超碰网 | 欧美性猛交aaaa片黑人 | 国产尤物av | 天天干天天爱天天操 | 1769国产精品 | 国产叼嘿视频在线观看 | 人乳videos巨大吃奶 | 欧美福利社| 成人免费毛片观看 | 五月婷婷丁香 | 国产床上视频 | 欧洲黄视频 | 午夜日韩电影 | www.九九热.com| 久久久久成人精品无码中文字幕 | 亚洲视频二 | 九色自拍视频 | 乱色熟女综合一区二区三区 | 欧美电影一区二区三区 | 91亚色视频在线观看 | 日韩在线观看视频一区 | 午夜电影福利网 | 亚洲综合精品国产一区二区三区 | 在线不卡毛片 | 久久精品99北条麻妃 | 奇米影视第四色首页 | 丁香花高清在线观看完整动漫 | 精品久久久久成人码免费动漫 | 亚洲AV无码成人精品区东京热 | 女人18毛片一区二区三区 | 91在线资源 | 亚洲AV无码一区二区三区性 | 黑人100部av解禁片 | 午夜精品久久久久久久99黑人 | 亚洲成人黄 | 人人人射 | 精品91自产拍在线观看二区 | www日本免费 | 蜜桃视频一区二区在线观看 | 毛片2| 少妇脚交调教玩男人的视频 | 日日噜噜夜夜爽爽 | 国产不雅视频 | aaa一区二区三区 | 一区二区三区在线播放视频 | 国产精品视频免费 | 天美视频在线观看 | 我要色综合天天 | 精品人妻在线一区二区三区 | 视色av | 国产精品日日摸夜夜爽 | 欧洲熟妇的性久久久久久 | 欧美亚洲国产精品 | 欧美绿帽合集videosex | 一区二区三区视频播放 | 处破女av一区二区 | 亚洲va国产天堂va久久 en | 国产午夜一区二区 |