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

首頁 > 系統 > Android > 正文

android自定義RadioGroup可以添加多種布局的實現方法

2020-04-11 12:03:57
字體:
來源:轉載
供稿:網友

android自帶的RadioGroup是繼承自LinearLayout,如果布局的時候不是直接寫radiobutton,即radiobutton外面還包了一層容器,這時分組是不成功的,因為查找不到radiobutton,如果要實現這種效果呢,于是看了RadioGroup的源碼,發現問題在于addView方法和自定義的PassThroughHierarchyChangeListener;

下面就這兩個地方動手腳,先拷貝源碼,然后去掉RadioGroup(Context context, AttributeSet attrs) 中的方法,我新增了一個方法,查找viewGroup控件中的radioButton

復制代碼 代碼如下:

/** 查找radioButton控件 */
    public RadioButton findRadioButton(ViewGroup group) {
        RadioButton resBtn = null;
        int len = group.getChildCount();
        for (int i = 0; i < len; i++) {
            if (group.getChildAt(i) instanceof RadioButton) {
                resBtn = (RadioButton) group.getChildAt(i);
            } else if (group.getChildAt(i) instanceof ViewGroup) {
                findRadioButton((ViewGroup) group.getChildAt(i));
            }
        }
        return resBtn;
    }

addView的實現如下:

復制代碼 代碼如下:

@Override
    public void addView(View child, int index, ViewGroup.LayoutParams params) {
        if (child instanceof RadioButton) {
            final RadioButton button = (RadioButton) child;
            if (button.isChecked()) {
                mProtectFromCheckedChange = true;
                if (mCheckedId != -1) {
                    setCheckedStateForView(mCheckedId, false);
                }
                mProtectFromCheckedChange = false;
                setCheckedId(button.getId());
            }
        } else if (child instanceof ViewGroup) {  //這里是我添加的代碼
            final RadioButton button = findRadioButton((ViewGroup) child);
            if (button.isChecked()) {
                mProtectFromCheckedChange = true;
                if (mCheckedId != -1) {
                    setCheckedStateForView(mCheckedId, false);
                }
                mProtectFromCheckedChange = false;
                setCheckedId(button.getId());
            }
        }

        super.addView(child, index, params);
    }


然后在自定義的PassThroughHierarchyChangeListener中修改:
復制代碼 代碼如下:

private class PassThroughHierarchyChangeListener implements
            ViewGroup.OnHierarchyChangeListener {
        private ViewGroup.OnHierarchyChangeListener mOnHierarchyChangeListener;

        public void onChildViewAdded(View parent, View child) {
            if (parent == MyRadioGroup.this && child instanceof RadioButton) {
                int id = child.getId();
                // generates an id if it's missing
                if (id == View.NO_ID) {
                    id = child.hashCode();
                    child.setId(id);
                }
                ((RadioButton) child)
                        .setOnCheckedChangeListener(mChildOnCheckedChangeListener);
            } else if (parent == MyRadioGroup.this   //這里是我添加的代碼
                    && child instanceof ViewGroup) {
                RadioButton btn = findRadioButton((ViewGroup) child);
                int id = btn.getId();
                // generates an id if it's missing
                if (id == View.NO_ID) {
                    id = btn.hashCode();
                    btn.setId(id);
                }
                btn.setOnCheckedChangeListener(mChildOnCheckedChangeListener);
            }

            if (mOnHierarchyChangeListener != null) {
                mOnHierarchyChangeListener.onChildViewAdded(parent, child);
            }
        }

        public void onChildViewRemoved(View parent, View child) {
            if (parent == MyRadioGroup.this && child instanceof RadioButton) {
                ((RadioButton) child).setOnCheckedChangeListener(null);
            } else if (parent == MyRadioGroup.this
                    && child instanceof ViewGroup) {
                findRadioButton((ViewGroup) child).setOnCheckedChangeListener(
                        null);
            }
            if (mOnHierarchyChangeListener != null) {
                mOnHierarchyChangeListener.onChildViewRemoved(parent, child);
            }
        }
    }


做好了上面的步驟,下面布局就可以按照自己的意思來了,并且分組效果也不會影響

下面我的布局文件demo:

復制代碼 代碼如下:

<com.huaheng.wy.view.MyRadioGroup
        android:id="@+id/rg"
        android:layout_width="fill_parent"
        android:layout_height="65dp"
        android:layout_alignParentBottom="true"
        android:background="@drawable/yst_i_bottom"
        android:orientation="horizontal" >

        <!-- 首頁 -->

        <FrameLayout
            android:id="@+id/left"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_marginBottom="2dp"
            android:layout_marginTop="3dp"
            android:layout_weight="1" >

            <RadioButton
                android:id="@+id/rbtn_home"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:background="@null"
                android:button="@null"
                android:drawableTop="@drawable/yst_i_bottomhome_selector"
                android:gravity="center_horizontal"
                android:text="首頁"
                android:textColor="@color/white"
                android:textSize="@dimen/font_5" />

            <Button
                android:id="@+id/btn_home_point"
                android:layout_width="21dp"
                android:layout_height="20dp"
                android:layout_gravity="top|right"
                android:layout_marginRight="10dp"
                android:layout_marginTop="0dp"
                android:background="@drawable/notice_bg"
                android:text="1"
                android:textColor="@color/white"
                android:textSize="@dimen/font_6"
                android:visibility="gone" />
        </FrameLayout>
        <!-- 歷史 -->

        <RadioButton
            android:id="@+id/rbtn_his"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_marginBottom="2dp"
            android:layout_marginTop="3dp"
            android:layout_weight="1"
            android:background="@null"
            android:button="@null"
            android:drawableTop="@drawable/yst_i_bottomhis_selector"
            android:gravity="center_horizontal"
            android:text="歷史"
            android:textColor="@color/white"
            android:textSize="@dimen/font_5" />

        <!-- 掃描 -->

        <Button
            android:id="@+id/rbtn_scan"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:background="@drawable/scan_selector"
            android:button="@null"
            android:gravity="center_horizontal|bottom"
            android:paddingBottom="7dp"
            android:text="掃描"
            android:textColor="@color/white"
            android:textSize="@dimen/font_5" />

        <RadioButton
            android:id="@+id/rbtn_seek"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_marginBottom="2dp"
            android:layout_marginTop="3dp"
            android:layout_weight="1"
            android:background="@null"
            android:button="@null"
            android:drawableTop="@drawable/yst_i_bottomseek_selector"
            android:gravity="center_horizontal"
            android:text="搜索"
            android:textColor="@color/white"
            android:textSize="@dimen/font_5" />

        <RadioButton
            android:id="@+id/rbtn_more"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_marginBottom="2dp"
            android:layout_marginTop="3dp"
            android:layout_weight="1"
            android:background="@null"
            android:button="@null"
            android:drawableTop="@drawable/yst_i_bottommore_selector"
            android:gravity="center_horizontal"
            android:text="更多"
            android:textColor="@color/white"
            android:textSize="@dimen/font_5" />
    </com.huaheng.wy.view.MyRadioGroup>


所有實現代碼都在這里,下面我就把自定義的radioGroup的代碼,完整的貼出來
復制代碼 代碼如下:

/*
 * Copyright (C) 2006 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.huaheng.wy.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton;
import android.widget.LinearLayout;
import android.widget.RadioButton;

public class MyRadioGroup extends LinearLayout {
    // holds the checked id; the selection is empty by default
    private int mCheckedId = -1;
    // tracks children radio buttons checked state
    private CompoundButton.OnCheckedChangeListener mChildOnCheckedChangeListener;
    // when true, mOnCheckedChangeListener discards events
    private boolean mProtectFromCheckedChange = false;
    private OnCheckedChangeListener mOnCheckedChangeListener;
    private PassThroughHierarchyChangeListener mPassThroughListener;

    public MyRadioGroup(Context context) {
        super(context);
        setOrientation(VERTICAL);
        init();
    }

    public MyRadioGroup(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        mChildOnCheckedChangeListener = new CheckedStateTracker();
        mPassThroughListener = new PassThroughHierarchyChangeListener();
        super.setOnHierarchyChangeListener(mPassThroughListener);
    }

    @Override
    public void setOnHierarchyChangeListener(OnHierarchyChangeListener listener) {
        // the user listener is delegated to our pass-through listener
        mPassThroughListener.mOnHierarchyChangeListener = listener;
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();

        // checks the appropriate radio button as requested in the XML file
        if (mCheckedId != -1) {
            mProtectFromCheckedChange = true;
            setCheckedStateForView(mCheckedId, true);
            mProtectFromCheckedChange = false;
            setCheckedId(mCheckedId);
        }
    }

    @Override
    public void addView(View child, int index, ViewGroup.LayoutParams params) {
        if (child instanceof RadioButton) {
            final RadioButton button = (RadioButton) child;
            if (button.isChecked()) {
                mProtectFromCheckedChange = true;
                if (mCheckedId != -1) {
                    setCheckedStateForView(mCheckedId, false);
                }
                mProtectFromCheckedChange = false;
                setCheckedId(button.getId());
            }
        } else if (child instanceof ViewGroup) {
            final RadioButton button = findRadioButton((ViewGroup) child);
            if (button.isChecked()) {
                mProtectFromCheckedChange = true;
                if (mCheckedId != -1) {
                    setCheckedStateForView(mCheckedId, false);
                }
                mProtectFromCheckedChange = false;
                setCheckedId(button.getId());
            }
        }

        super.addView(child, index, params);
    }

    /** 查找radioButton控件 */
    public RadioButton findRadioButton(ViewGroup group) {
        RadioButton resBtn = null;
        int len = group.getChildCount();
        for (int i = 0; i < len; i++) {
            if (group.getChildAt(i) instanceof RadioButton) {
                resBtn = (RadioButton) group.getChildAt(i);
            } else if (group.getChildAt(i) instanceof ViewGroup) {
                findRadioButton((ViewGroup) group.getChildAt(i));
            }
        }
        return resBtn;
    }

    /**
     * <p>
     * Sets the selection to the radio button whose identifier is passed in
     * parameter. Using -1 as the selection identifier clears the selection;
     * such an operation is equivalent to invoking {@link #clearCheck()}.
     * </p>
     *
     * @param id
     *            the unique id of the radio button to select in this group
     *
     * @see #getCheckedRadioButtonId()
     * @see #clearCheck()
     */
    public void check(int id) {
        // don't even bother
        if (id != -1 && (id == mCheckedId)) {
            return;
        }

        if (mCheckedId != -1) {
            setCheckedStateForView(mCheckedId, false);
        }

        if (id != -1) {
            setCheckedStateForView(id, true);
        }

        setCheckedId(id);
    }

    private void setCheckedId(int id) {
        mCheckedId = id;
        if (mOnCheckedChangeListener != null) {
            mOnCheckedChangeListener.onCheckedChanged(this, mCheckedId);
        }
    }

    private void setCheckedStateForView(int viewId, boolean checked) {
        View checkedView = findViewById(viewId);
        if (checkedView != null && checkedView instanceof RadioButton) {
            ((RadioButton) checkedView).setChecked(checked);
        }
    }

    /**
     * <p>
     * Returns the identifier of the selected radio button in this group. Upon
     * empty selection, the returned value is -1.
     * </p>
     *
     * @return the unique id of the selected radio button in this group
     *
     * @see #check(int)
     * @see #clearCheck()
     */
    public int getCheckedRadioButtonId() {
        return mCheckedId;
    }

    /**
     * <p>
     * Clears the selection. When the selection is cleared, no radio button in
     * this group is selected and {@link #getCheckedRadioButtonId()} returns
     * null.
     * </p>
     *
     * @see #check(int)
     * @see #getCheckedRadioButtonId()
     */
    public void clearCheck() {
        check(-1);
    }

    /**
     * <p>
     * Register a callback to be invoked when the checked radio button changes
     * in this group.
     * </p>
     *
     * @param listener
     *            the callback to call on checked state change
     */
    public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {
        mOnCheckedChangeListener = listener;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public LayoutParams generateLayoutParams(AttributeSet attrs) {
        return new MyRadioGroup.LayoutParams(getContext(), attrs);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
        return p instanceof MyRadioGroup.LayoutParams;
    }

    @Override
    protected LinearLayout.LayoutParams generateDefaultLayoutParams() {
        return new LayoutParams(LayoutParams.WRAP_CONTENT,
                LayoutParams.WRAP_CONTENT);
    }

    /**
     * <p>
     * This set of layout parameters defaults the width and the height of the
     * children to {@link #WRAP_CONTENT} when they are not specified in the XML
     * file. Otherwise, this class ussed the value read from the XML file.
     * </p>
     *
     * <p>
     * See {@link android.R.styleable#LinearLayout_Layout LinearLayout
     * Attributes} for a list of all child view attributes that this class
     * supports.
     * </p>
     *
     */
    public static class LayoutParams extends LinearLayout.LayoutParams {
        /**
         * {@inheritDoc}
         */
        public LayoutParams(Context c, AttributeSet attrs) {
            super(c, attrs);
        }

        /**
         * {@inheritDoc}
         */
        public LayoutParams(int w, int h) {
            super(w, h);
        }

        /**
         * {@inheritDoc}
         */
        public LayoutParams(int w, int h, float initWeight) {
            super(w, h, initWeight);
        }

        /**
         * {@inheritDoc}
         */
        public LayoutParams(ViewGroup.LayoutParams p) {
            super(p);
        }

        /**
         * {@inheritDoc}
         */
        public LayoutParams(MarginLayoutParams source) {
            super(source);
        }

        /**
         * <p>
         * Fixes the child's width to
         * {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} and the
         * child's height to
         * {@link android.view.ViewGroup.LayoutParams#WRAP_CONTENT} when not
         * specified in the XML file.
         * </p>
         *
         * @param a
         *            the styled attributes set
         * @param widthAttr
         *            the width attribute to fetch
         * @param heightAttr
         *            the height attribute to fetch
         */
        @Override
        protected void setBaseAttributes(TypedArray a, int widthAttr,
                int heightAttr) {

            if (a.hasValue(widthAttr)) {
                width = a.getLayoutDimension(widthAttr, "layout_width");
            } else {
                width = WRAP_CONTENT;
            }

            if (a.hasValue(heightAttr)) {
                height = a.getLayoutDimension(heightAttr, "layout_height");
            } else {
                height = WRAP_CONTENT;
            }
        }
    }

    /**
     * <p>
     * Interface definition for a callback to be invoked when the checked radio
     * button changed in this group.
     * </p>
     */
    public interface OnCheckedChangeListener {
        /**
         * <p>
         * Called when the checked radio button has changed. When the selection
         * is cleared, checkedId is -1.
         * </p>
         *
         * @param group
         *            the group in which the checked radio button has changed
         * @param checkedId
         *            the unique identifier of the newly checked radio button
         */
        public void onCheckedChanged(MyRadioGroup group, int checkedId);
    }

    private class CheckedStateTracker implements
            CompoundButton.OnCheckedChangeListener {
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
            // prevents from infinite recursion
            if (mProtectFromCheckedChange) {
                return;
            }

            mProtectFromCheckedChange = true;
            if (mCheckedId != -1) {
                setCheckedStateForView(mCheckedId, false);
            }
            mProtectFromCheckedChange = false;

            int id = buttonView.getId();
            setCheckedId(id);
        }
    }

    /**
     * <p>
     * A pass-through listener acts upon the events and dispatches them to
     * another listener. This allows the table layout to set its own internal
     * hierarchy change listener without preventing the user to setup his.
     * </p>
     */
    private class PassThroughHierarchyChangeListener implements
            ViewGroup.OnHierarchyChangeListener {
        private ViewGroup.OnHierarchyChangeListener mOnHierarchyChangeListener;

        public void onChildViewAdded(View parent, View child) {
            if (parent == MyRadioGroup.this && child instanceof RadioButton) {
                int id = child.getId();
                // generates an id if it's missing
                if (id == View.NO_ID) {
                    id = child.hashCode();
                    child.setId(id);
                }
                ((RadioButton) child)
                        .setOnCheckedChangeListener(mChildOnCheckedChangeListener);
            } else if (parent == MyRadioGroup.this
                    && child instanceof ViewGroup) {
                RadioButton btn = findRadioButton((ViewGroup) child);
                int id = btn.getId();
                // generates an id if it's missing
                if (id == View.NO_ID) {
                    id = btn.hashCode();
                    btn.setId(id);
                }
                btn.setOnCheckedChangeListener(mChildOnCheckedChangeListener);
            }

            if (mOnHierarchyChangeListener != null) {
                mOnHierarchyChangeListener.onChildViewAdded(parent, child);
            }
        }

        public void onChildViewRemoved(View parent, View child) {
            if (parent == MyRadioGroup.this && child instanceof RadioButton) {
                ((RadioButton) child).setOnCheckedChangeListener(null);
            } else if (parent == MyRadioGroup.this
                    && child instanceof ViewGroup) {
                findRadioButton((ViewGroup) child).setOnCheckedChangeListener(
                        null);
            }
            if (mOnHierarchyChangeListener != null) {
                mOnHierarchyChangeListener.onChildViewRemoved(parent, child);
            }
        }
    }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美黑人xxxx| 亚洲美女视频网站| 青草热久免费精品视频| 成人妇女免费播放久久久| 91网在线免费观看| 91成人在线视频| 日韩激情av在线免费观看| 日本成人黄色片| 中文亚洲视频在线| 国产女人18毛片水18精品| 成人精品久久一区二区三区| 欧美激情亚洲国产| 亚洲国产精品va在线看黑人动漫| 国产精品久久久久aaaa九色| 精品视频www| 亚洲精品自在久久| 亚洲欧美日韩天堂一区二区| 国产午夜精品视频| 欧美一级视频一区二区| 欧美韩日一区二区| 久久大大胆人体| 成人免费黄色网| 久久视频中文字幕| 亚洲国产成人精品女人久久久| 韩国三级电影久久久久久| 亚洲自拍欧美色图| 久久成人精品一区二区三区| 国产日韩欧美日韩| 亚洲福利在线播放| 91社区国产高清| 91亚洲精华国产精华| 色偷偷av一区二区三区| 亚洲精品久久7777777| 97在线观看免费高清| 日韩av中文字幕在线播放| 欧美黑人狂野猛交老妇| 国产在线拍揄自揄视频不卡99| 久久精品色欧美aⅴ一区二区| 成人黄色片在线| 国内精品视频在线| 国产精品美女999| 色综合伊人色综合网| 96sao精品视频在线观看| 久久久久久久久久亚洲| 国产精品老女人精品视频| 18一19gay欧美视频网站| 欧美日韩国产激情| 国产在线观看一区二区三区| 国产精品久久久久高潮| 成人黄色av网站| 欧美激情乱人伦| xxav国产精品美女主播| 91精品91久久久久久| 久久精品国产亚洲7777| 成人福利网站在线观看| 国产视频在线观看一区二区| 久久精品国产一区| 91精品国产高清自在线看超| 97热在线精品视频在线观看| 亚洲第一精品福利| 在线精品高清中文字幕| 国产精品美女免费| 久久人人97超碰精品888| 国产区精品在线观看| 亚洲免费成人av电影| 精品毛片三在线观看| 国产精品户外野外| 成人福利网站在线观看11| 亚洲欧美成人网| 91久久精品一区| 色香阁99久久精品久久久| 日韩高清欧美高清| 久久露脸国产精品| 久久九九亚洲综合| 97视频在线观看免费| 26uuu另类亚洲欧美日本一| 岛国av一区二区在线在线观看| 日韩久久精品电影| 久久久久久一区二区三区| 91在线观看免费网站| 在线视频一区二区| 日韩电影中文 亚洲精品乱码| 俺也去精品视频在线观看| 国产成人福利网站| 91亚洲精品一区| 亚洲黄色有码视频| 亚洲国产精品99| 久久99久久99精品免观看粉嫩| 亚洲精品福利资源站| 亚洲国产女人aaa毛片在线| 亚洲天堂av网| 精品国产1区2区| 黑人巨大精品欧美一区二区| 欧美日韩不卡合集视频| 国产精品十八以下禁看| 久久久久久久一区二区三区| 欧美综合在线第二页| 亚洲综合自拍一区| 欧美xxxx14xxxxx性爽| 色yeye香蕉凹凸一区二区av| 国产精品高潮粉嫩av| 成人有码在线视频| 亚洲国产精品成人一区二区| 亚洲图片制服诱惑| 日韩禁在线播放| 久久久精品一区二区三区| 日韩精品视频在线免费观看| 欧洲亚洲妇女av| 国产一区私人高清影院| 欧美多人乱p欧美4p久久| 91精品国产91久久久久久吃药| 国产69久久精品成人看| 国产精品自产拍在线观看| 亚洲国产成人精品久久久国产成人一区| 欧美性猛交xxxxx免费看| 亚洲精品视频二区| 日韩av手机在线看| 国产精品精品一区二区三区午夜版| 亚洲精品黄网在线观看| 在线电影中文日韩| 欧美在线一区二区三区四| 在线日韩日本国产亚洲| 久久精品国产免费观看| 日韩专区在线播放| 91免费人成网站在线观看18| 国产精品69久久| 播播国产欧美激情| 色七七影院综合| 91精品在线观| 激情懂色av一区av二区av| 日韩中文字幕在线观看| 亚洲欧美色婷婷| 欧美性xxxx在线播放| 精品美女永久免费视频| 色视频www在线播放国产成人| 久久亚洲私人国产精品va| 国产日韩欧美自拍| 爽爽爽爽爽爽爽成人免费观看| 国产精品国产福利国产秒拍| 亚洲影院高清在线| 亚洲国产欧美精品| 亚洲人成电影网站色xx| 日本精品久久久久久久| 欧美激情精品久久久久久黑人| 中文字幕日韩欧美精品在线观看| 一区二区三区国产在线观看| 韩国国内大量揄拍精品视频| 久青草国产97香蕉在线视频| 中文日韩电影网站| 国产做受69高潮| 欧美一级黑人aaaaaaa做受| 久久色免费在线视频| 欧美国产高跟鞋裸体秀xxxhd| 国产精品视频1区| 亚洲欧美三级伦理| 欧美在线影院在线视频| 97涩涩爰在线观看亚洲| 九色精品美女在线| 57pao国产成人免费| 久热99视频在线观看| 日韩精品视频免费专区在线播放| 久久亚洲精品毛片| 欧美日韩在线观看视频| 成人欧美一区二区三区在线湿哒哒|