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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

ColorStateList 使用详解

發(fā)布時間:2025/3/17 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ColorStateList 使用详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. 是什么?

ColorStateList(顏色狀態(tài)列表)是一個可以定義在 XML 布局文件中,并最終根據(jù) ColorStateList 應(yīng)用的 View 的狀態(tài)顯示不同顏色的對象。

A ColorStateList is an object you can define in XML that you can apply as a color, but will actually change colors, depending on the state of the View object to which it is applied.

最終效果如下:

界面中兩按鈕文字的顏色隨著按鈕的狀態(tài)而改變。

2. 怎么用?

從 ColorStateList 的定義可以知道,創(chuàng)建 ColorStateList 的方式應(yīng)該不止有一種。接下來,我們就嘗試從兩方面創(chuàng)建 ColorStateList:

  • XML
  • Java 代碼
  • 2.1 如何在 XML 中定義 ColorStateList

    2.1.1 文件位置
    res/color/filename.xml 復(fù)制代碼
    2.1.2 編譯之后的數(shù)據(jù)類型
    ColorStateList 復(fù)制代碼
    2.1.3 應(yīng)用方式
  • In Java: R.color.filename
  • In XML: @[package:]color/filename
  • 2.1.4 語法
    <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" ><itemandroid:color="hex_color"android:state_pressed=["true" | "false"]android:state_focused=["true" | "false"]android:state_selected=["true" | "false"]android:state_checkable=["true" | "false"]android:state_checked=["true" | "false"]android:state_enabled=["true" | "false"]android:state_window_focused=["true" | "false"] /> </selector> 復(fù)制代碼
    2.1.5 屬性解析
    屬性定義取值范圍
    color不同狀態(tài)的顏色值十六進制的顏色值。
    可以是如下格式:
    #RGB
    #ARGB
    #RRGGBB
    #AARRGGBB
    state_pressedView 按下的狀態(tài)true,false。
    true,按下;
    false,默認狀態(tài),即沒有按下之前的狀態(tài)。
    state_selectedView 選中的狀態(tài)true,false。
    true,選中;
    false,未選中。

    其他的屬性類似,在此就不做贅述了。想要了解更多關(guān)于 state_xxx 的內(nèi)容,請查看Color state list resource。

    2.1.6 示例
    //1. text_color_state_list.xml <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:color="@color/green_700" android:state_pressed="true" /><item android:color="@color/grey_700" android:state_pressed="false" /><!--默認項--><item android:color="@color/grey_700" /> </selector> 復(fù)制代碼//2. 在 XML 布局文件中應(yīng)用 text_color_state_list <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"tools:context=".MainActivity"><Buttonandroid:id="@+id/alphabet_a"android:layout_width="@dimen/avatar_size"android:layout_height="@dimen/padding_seventy_two"android:text="@string/alphabet_a"android:textColor="@color/text_color_state_list"android:textSize="@dimen/font_thirty_two" /></LinearLayout> 復(fù)制代碼

    最終效果如下:

    //3. 在 Java 代碼中使用 text_color_state_list public class MainActivity extends AppCompatActivity {private Button mAlphaB;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private void initView(){mAlphaB = findViewById(R.id.alphabet_b);Resources resources = getResources();ColorStateList colorStateList = resources.getColorStateList(R.color.text_color_state_list);mAlphaB.setTextColor(colorStateList);}} 復(fù)制代碼

    在 Java 中使用在 XML 中定義的 ColorStateList 的效果與在 XML 中使用在 XML 中定義的 ColorStateList 的效果一樣,所以就不贅述了。

    2.1.7 注意事項
    2.1.7.1 ColorStateList 中定義的默認 Item 一定要放在最下面

    ColorStateList 中定義的默認 Item 一定要放在最下面,否則后面的 Item 將被忽略,Android Framework 在此處選擇資源的時候,并不是按照“最優(yōu)選項”選擇的,而是按照從上到下選擇第一個匹配的。

    Remember that the first item in the state list that matches the current state of the object will be applied. So if the first item in the list contains none of the state attributes above, then it will be applied every time, which is why your default value should always be last, as demonstrated in the following example.

    舉個例子:

  • 默認 Item 放在最下面:
  • <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:color="@color/green_700" android:state_pressed="true" /><item android:color="@color/grey_700" android:state_pressed="false" /><!--默認項--><item android:color="@color/grey_700" /> </selector> 復(fù)制代碼

    最終效果如下:

  • 默認 Item 放在最上面:
  • <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"><!--默認項--><item android:color="@color/grey_700" /><item android:color="@color/green_700" android:state_pressed="true" /><item android:color="@color/grey_700" android:state_pressed="false" /> </selector> 復(fù)制代碼

    最終效果如下:

    由上面的運行效果可知:當(dāng)默認的 Item 在最上面的時候,Button 的文字顏色并不會隨著 Button 狀態(tài)的改變而改變。因此在后面定義 ColorStateList 的時候,如果想要應(yīng)用 ColorStateList 的 View 內(nèi)容(字體或者其他)的顏色隨著 View 的狀態(tài)而改變,就需要把 ColorStateList 中默認的 Item 定義在最下面。

    2.1.7.2 ColorStateList 是不能用于 View 的 Background
    //1. View 部分源碼 public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource {...public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {this(context);final TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.View, defStyleAttr, defStyleRes);...for (int i = 0; i < N; i++) {int attr = a.getIndex(i);switch (attr) {case com.android.internal.R.styleable.View_background:background = a.getDrawable(attr);break;...}...}...}...} 復(fù)制代碼

    由 View 源碼可知:View 的 Background 最終是通過 TypedArray 的 GetDrawable 方法獲取的。

    //2. TypedArray 部分源碼 public class TypedArray {.../*** Retrieve the Drawable for the attribute at <var>index</var>.* <p>* This method will throw an exception if the attribute is defined but is* not a color or drawable resource.** @param index Index of attribute to retrieve.** @return Drawable for the attribute, or {@code null} if not defined.* @throws RuntimeException if the TypedArray has already been recycled.* @throws UnsupportedOperationException if the attribute is defined but is* not a color or drawable resource.*/@Nullablepublic Drawable getDrawable(@StyleableRes int index) {return getDrawableForDensity(index, 0);}...} 復(fù)制代碼

    由 TypedArray 源碼可知,在 TypedArray 的 GetDrawable 中只能接收純 Color 或者 Drawable Resource,而 ColorStateList 并未在此范圍內(nèi),因此 ColorStateList 是不能用于 View 的 Background(如果在 View 的 Background 中引用 ColorStateList,應(yīng)用程序?qū)?Crash)。

    throws UnsupportedOperationException if the attribute is defined but is not a color or drawable resource.

    2.1.7.2 StateListDrawable 是不能用于 TextView 系的 TextColor
    //1. TextView 部分源碼 public class TextView extends View implements ViewTreeObserver.OnPreDrawListener {...public TextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {...readTextAppearance(context, a, attributes, true /* styleArray */);...}... } 復(fù)制代碼//2. readTextAppearance 方法 private void readTextAppearance(Context context, TypedArray appearance, TextAppearanceAttributes attributes, boolean styleArray) {...for (int i = 0; i < n; i++) {...switch (index) {case com.android.internal.R.styleable.TextAppearance_textColorHighlight:attributes.mTextColorHighlight = appearance.getColor(attr, attributes.mTextColorHighlight);break;...}...}...} 復(fù)制代碼

    通過 TextView 源碼可知,TextView 的 TextColor 最終是通過 TypedArray 的 GetColor 方法獲取的。

    //3. TypedArray 部分源碼 public class TypedArray {.../*** Retrieve the color value for the attribute at <var>index</var>. If* the attribute references a color resource holding a complex* {@link android.content.res.ColorStateList}, then the default color from* the set is returned.* <p>* This method will throw an exception if the attribute is defined but is* not an integer color or color state list.** @param index Index of attribute to retrieve.* @param defValue Value to return if the attribute is not defined or* not a resource.** @return Attribute color value, or defValue if not defined.* @throws RuntimeException if the TypedArray has already been recycled.* @throws UnsupportedOperationException if the attribute is defined but is* not an integer color or color state list.*/@ColorIntpublic int getColor(@StyleableRes int index, @ColorInt int defValue) {if (mRecycled) {throw new RuntimeException("Cannot make calls to a recycled instance!");}final int attrIndex = index;index *= STYLE_NUM_ENTRIES;final int[] data = mData;final int type = data[index + STYLE_TYPE];if (type == TypedValue.TYPE_NULL) {return defValue;} else if (type >= TypedValue.TYPE_FIRST_INT&& type <= TypedValue.TYPE_LAST_INT) {return data[index + STYLE_DATA];} else if (type == TypedValue.TYPE_STRING) {final TypedValue value = mValue;if (getValueAt(index, value)) {final ColorStateList csl = mResources.loadColorStateList(value, value.resourceId, mTheme);return csl.getDefaultColor();}return defValue;} else if (type == TypedValue.TYPE_ATTRIBUTE) {final TypedValue value = mValue;getValueAt(index, value);throw new UnsupportedOperationException("Failed to resolve attribute at index " + attrIndex + ": " + value);}throw new UnsupportedOperationException("Can't convert value at index " + attrIndex+ " to color: type=0x" + Integer.toHexString(type));}...}復(fù)制代碼

    由 TypedArray 源碼可知,在 TypedArray 的 getColor 中只能接收純 Color 或者 Color State List,而 StateListDrawable 并未在此范圍內(nèi),因此 StateListDrawable 是不能用于 TextView 系的 TextColor(如果在 TextView 的 TextColor 中引用 StateListDrawable 程序?qū)?Bug,但是不會 Crash)。

    throws UnsupportedOperationException if the attribute is defined but is not an integer color or color state list.

    2.2 如何在代碼中定義 ColorStateList

    2.2.1 ColorStateList 源碼解析

    ColorStateList 部分源碼如下:

    public class ColorStateList extends ComplexColor implements Parcelable {.../*** Creates a ColorStateList that returns the specified mapping from* states to colors.*/public ColorStateList(int[][] states, @ColorInt int[] colors) {mStateSpecs = states;mColors = colors;onColorsChanged();}...} 復(fù)制代碼

    由上面的源碼可知,在創(chuàng)建 ColorStateList 的時候,需要傳入兩個數(shù)組,第一個數(shù)組是存儲狀態(tài)值的,第二個數(shù)組是存儲狀態(tài)對應(yīng)顏色值的。
    簡單對比一下 XML 中定義 ColorStateList 的語法,其實很容易就明白為什么在 ColorStateList 構(gòu)造方法中存儲狀態(tài)值的數(shù)組是二維數(shù)組。

    <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" ><itemandroid:color="hex_color"android:state_pressed=["true" | "false"]android:state_focused=["true" | "false"]android:state_selected=["true" | "false"]android:state_checkable=["true" | "false"]android:state_checked=["true" | "false"]android:state_enabled=["true" | "false"]android:state_window_focused=["true" | "false"] /> </selector> 復(fù)制代碼

    因為在每一個 Item 中可以有很多個狀態(tài)(state_xxx),每一個 Item 中的所有這些狀態(tài)只對應(yīng)一個顏色值。也就是說,ColorStateList 構(gòu)造方法中的存儲狀態(tài)的數(shù)組的第一層數(shù)組的 Size 只要和存儲狀態(tài)對應(yīng)顏色值的數(shù)組的 Size 一致就好了。

    舉個例子(偽代碼):

    //狀態(tài)值(states 第一層 size 為 2) int[][] states = new int[2][]; states[0] = new int[] {android.R.attr.state_xxx}; states[1] = new int[] {}; //不同狀態(tài)對應(yīng)的顏色值(colors size 為 2) int[] colors = new int[] { R.color.pressed, R.color.normal}; ColorStateList colorList = new ColorStateList(states, colors); 復(fù)制代碼
    2.2.2 示例
    public class MainActivity extends AppCompatActivity {private Button mAlphaB;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private void initView(){mAlphaB = findViewById(R.id.alphabet_b);ColorStateList colorStateList = createColorStateList(getResources().getColor(R.color.green_700), getResources().getColor(R.color.grey_700));mAlphaB.setTextColor(colorStateList);}private ColorStateList createColorStateList(int pressed, int normal) {//狀態(tài)int[][] states = new int[2][];//按下states[0] = new int[] {android.R.attr.state_pressed};//默認states[1] = new int[] {};//狀態(tài)對應(yīng)顏色值(按下,默認)int[] colors = new int[] { pressed, normal};ColorStateList colorList = new ColorStateList(states, colors);return colorList;}} 復(fù)制代碼

    最終效果如下:

    2.2.3 自定義 ColorStateList

    除了上面的方式之外,還可以繼承 ColorStateList 實現(xiàn)自定義 ColorStateList,但由于 ColorStateList 可更改的屬性太少,所以自定義 ColorStateList 并沒有什么意義。

    簡單示例:

    public class CustomColorStateList extends ColorStateList {public CustomColorStateList(int[][] states, int[] colors) {super(states, colors);}} 復(fù)制代碼

    具體使用方法同《2.2.2 示例》一樣,所以再次不做贅述。

    3. 工作原理

    下面是在代碼中使用在 XML 布局文件中創(chuàng)建的 ColorStateList 的方法:

    //1. text_color_state_list.xml <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:color="@color/green_700" android:state_pressed="true" /><item android:color="@color/grey_700" android:state_pressed="false" /><!--默認項--><item android:color="@color/grey_700" /> </selector> 復(fù)制代碼//2. 在 Java 代碼中使用 text_color_state_list public class MainActivity extends AppCompatActivity {private Button mAlphaB;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private void initView(){mAlphaB = findViewById(R.id.alphabet_b);Resources resources = getResources();ColorStateList colorStateList = resources.getColorStateList(R.color.text_color_state_list);mAlphaB.setTextColor(colorStateList);}} 復(fù)制代碼

    既然是通過 Button 的 SetTextColor 方法將 ColorStateList 應(yīng)用到 Button 的字體顏色上的,那接下來就進到 Button 的 SetTextColor 方法一看究竟。

    //3. 進入 Button 的 setTextColor 方法 public class TextView{...@android.view.RemotableViewMethodpublic void setTextColor(ColorStateList colors) {if (colors == null) {throw new NullPointerException();}mTextColor = colors;updateTextColors();}...} 復(fù)制代碼

    因為 Button 繼承至 TextView,Button 的 SetTextColor 方法繼承至 TextView,且未做任何更改,因此直接進入了 TextView 類中。

    在 TextView 類的 SetTextColor 方法中調(diào)用了 UpdateTextColors 方法。

    //4. 進入 updateTextColors 方法 public class TextView{...private void updateTextColors() {boolean inval = false;final int[] drawableState = getDrawableState();int color = mTextColor.getColorForState(drawableState, 0);if (color != mCurTextColor) {mCurTextColor = color;inval = true;}if (mLinkTextColor != null) {color = mLinkTextColor.getColorForState(drawableState, 0);if (color != mTextPaint.linkColor) {mTextPaint.linkColor = color;inval = true;}}if (mHintTextColor != null) {color = mHintTextColor.getColorForState(drawableState, 0);if (color != mCurHintTextColor) {mCurHintTextColor = color;if (mText.length() == 0) {inval = true;}}}if (inval) {// Text needs to be redrawn with the new colorif (mEditor != null) mEditor.invalidateTextDisplayList();invalidate();}}...} 復(fù)制代碼

    接著看下在 TextView 類中,哪里都調(diào)用了 TextView 的 UpdateTextColors 方法。

    最終找到了 TextView 的 DrawableStateChanged 方法,即在 TextView 的 DrawableStateChanged 方法中調(diào)用了 TextView 的 UpdateTextColors 方法。

    //5. 進入 drawableStateChanged 方法 public class TextView{...@Overrideprotected void drawableStateChanged() {super.drawableStateChanged();if (mTextColor != null && mTextColor.isStateful()|| (mHintTextColor != null && mHintTextColor.isStateful())|| (mLinkTextColor != null && mLinkTextColor.isStateful())) {updateTextColors();}if (mDrawables != null) {final int[] state = getDrawableState();for (Drawable dr : mDrawables.mShowing) {if (dr != null && dr.isStateful() && dr.setState(state)) {invalidateDrawable(dr);}}}}...} 復(fù)制代碼

    在 TextView 類的 DrawableStateChanged 方法中調(diào)用了父類的 DrawableStateChanged 方法,進入 TextView 的父類(View)中看下哪里都調(diào)用了 DrawableStateChanged 方法。

    最終找到了 View 的 RefreshDrawableState 方法,即在 View 的 RefreshDrawableState 方法中調(diào)用了 DrawableStateChanged 方法。

    //6. 進入 refreshDrawableState 方法 public class View{.../*** Call this to force a view to update its drawable state. This will cause* drawableStateChanged to be called on this view. Views that are interested* in the new state should call getDrawableState.** @see #drawableStateChanged* @see #getDrawableState*/public void refreshDrawableState() {mPrivateFlags |= PFLAG_DRAWABLE_STATE_DIRTY;drawableStateChanged();ViewParent parent = mParent;if (parent != null) {parent.childDrawableStateChanged(this);}}... } 復(fù)制代碼

    在 View 類中看下哪里都調(diào)用了 RefreshDrawableState 方法。

    在 View 類中,發(fā)現(xiàn)有多個方法都調(diào)用了 RefreshDrawableState 方法,如:

    • setEnabled(boolean enabled)
    • setPressed(boolean pressed)
    • onWindowFocusChanged(boolean hasWindowFocus)
    • setHovered(boolean hovered)
    • setSelected(boolean selected)
    • setActivated(boolean activated)

    是不是有一種似曾相識的感覺:

    <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" ><itemandroid:color="hex_color"android:state_pressed=["true" | "false"]android:state_focused=["true" | "false"]android:state_selected=["true" | "false"]android:state_checkable=["true" | "false"]android:state_checked=["true" | "false"]android:state_enabled=["true" | "false"]android:state_window_focused=["true" | "false"] /> </selector> 復(fù)制代碼

    接下來,我們隨便挑一個方法來分析——SetPressed 方法。

    //7. 進入 setPressed 方法 public class View{.../*** Sets the pressed state for this view.** @see #isClickable()* @see #setClickable(boolean)** @param pressed Pass true to set the View's internal state to "pressed", or false to reverts* the View's internal state from a previously set "pressed" state.*/public void setPressed(boolean pressed) {final boolean needsRefresh = pressed != ((mPrivateFlags & PFLAG_PRESSED) == PFLAG_PRESSED);if (pressed) {mPrivateFlags |= PFLAG_PRESSED;} else {mPrivateFlags &= ~PFLAG_PRESSED;}if (needsRefresh) {refreshDrawableState();}dispatchSetPressed(pressed);}... } 復(fù)制代碼

    接下來看下,在 View 類中哪里都調(diào)用了 SetPressed 方法。

    在 View 類中,發(fā)現(xiàn)有多個方法都調(diào)用了 SetPressed 方法,如:

    • removeUnsetPressCallback
    • onFocusChanged
    • resetPressedState
    • dispatchGenericMotionEventInternal
    • onKeyDown
    • onKeyUp
    • onTouchEvent

    在上面的這些方法中,有一個方法引起了我們注意——onTouchEvent 處理觸屏事件的方法。

    Implement this method to handle touch screen motion events.

    public class View{...public boolean onTouchEvent(MotionEvent event) {...if (clickable || (viewFlags & TOOLTIP) == TOOLTIP) {switch (action) {case MotionEvent.ACTION_UP:...break;case MotionEvent.ACTION_DOWN:...if (isInScrollingContainer) {...} else {// Not inside a scrolling container, so show the feedback right away///// //// 只看這里就好啦 //// /////setPressed(true, x, y);checkForLongClick(0, x, y);}break;case MotionEvent.ACTION_CANCEL:...break;case MotionEvent.ACTION_MOVE:...break;}return true;}return false;}...} 復(fù)制代碼

    到這里,我們不難發(fā)現(xiàn)最終 ColorStateList 是如何起作用的:

    在 View 的 OnTouchEvent 中根據(jù)用戶操作確定當(dāng)前 View 的狀態(tài),選擇與該狀態(tài)對應(yīng)的顏色值并將其設(shè)置到 View 的 Paint上,進而在刷新界面的時候應(yīng)用新的顏色。在 TextView 系控件中表現(xiàn)為:根據(jù) TextView 系控件的狀態(tài)將與該狀態(tài)對應(yīng)的顏色值設(shè)置到當(dāng)前控件的 TextPaint 上,進而在刷新界面的時候應(yīng)用新的顏色。

    4. ColorStateList 與 StateListDrawable 之間的關(guān)系

    ColorStateList 與 StateListDrawable 其實并沒有什么關(guān)系。

    ColorStateList 繼承至 Object,而 StateListDrawable 間接繼承至 Drawable。

    如果非要從它們兩個中間找到共同點,那就是它們都能根據(jù)當(dāng)前 View 的狀態(tài)改變自己的顯示內(nèi)容(ColorStateList 根據(jù) View 狀態(tài)顯示不同的 Color,StateListDrawable 根據(jù) View 狀態(tài)顯示不同的 Drawable)。

    5. 參考文獻

  • Color State List Resource
  • ColorStateList
  • 轉(zhuǎn)載于:https://juejin.im/post/5cbc5baf6fb9a0687015d3a1

    總結(jié)

    以上是生活随笔為你收集整理的ColorStateList 使用详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 亚洲av无码电影在线播放 | 亚洲无码精品国产 | 成人av一区二区三区在线观看 | 国产精品九九 | 亚洲色图1 | 精品欧美久久久 | 精品综合久久久 | 91精品国产乱码久久久久 | 中文字幕一区二区三区免费看 | 欧洲视频一区 | 日本夫妻性生活视频 | 黄色一毛片 | 日本三级视频在线播放 | 男女裸体无遮挡做爰 | 色猫咪av在线 | 国模视频在线 | 国产黄在线免费观看 | 日韩美女视频在线观看 | 亚洲国产精品国自产拍久久 | 91视频入口 | 一本色道久久88综合日韩精品 | 亚洲免费三级 | 少妇视频一区二区三区 | 国产一区在线免费观看 | 天天干天天爽天天操 | 日韩中文免费 | 18禁一区二区 | 国产l精品国产亚洲区久久 午夜青青草 | 日韩一级不卡 | 精品一区二区三区国产 | 亚洲国产精品视频在线 | 香蕉综合视频 | 自由 日本语 热 亚洲人 | 国内精品福利视频 | 国产女厕一区二区三区在线视 | 亚洲 成人 av | 在线黄色av | 欧日韩在线观看 | 美女爱爱爱| 国产一级久久久久毛片精品 | 精品无码久久久久国产 | 九九久久国产视频 | 欧美日韩一卡 | 亚洲资源在线观看 | 久久视频精品在线 | 欧美日韩一区二区三区在线播放 | 香蕉视频国产在线观看 | 国产一区视频在线播放 | 国产精品高潮呻吟久久aⅴ码 | 啪啪小视频 | 免费网站黄色 | 黄色在线免费看 | 久久久久国产精品视频 | 制服丝袜影音先锋 | 欧美一区在线观看视频 | 久久精品国产av一区二区三区 | 日日骚一区二区 | 99国产精品久久久久99打野战 | 超碰在线网站 | 打屁股av | 国产高清免费在线观看 | 啪啪一级片 | 91看毛片 | 91n视频| 久艹在线视频 | 欧美一级片在线看 | 人妻丰满熟妇av无码区 | 亚洲第一在线视频 | av黄色免费在线观看 | 在线你懂 | 高清在线一区 | 美女扒开尿口来摸 | 久久免费精品 | 亚洲bb| 四虎网址在线 | 免费在线日韩av | 性爱动漫 | 欧美视频色 | 谁有免费黄色网址 | 欧美一级激情 | 国产寡妇色xxⅹ交肉视频 | 久草网视频在线观看 | 黄站在线观看 | 亚洲AV无码一区二区三区蜜桃 | 永久av免费在线观看 | 人妖和人妖互交性xxxx视频 | 亚洲免费视频一区二区 | www.av网址 | 黄色小说在线观看视频 | 99热在线免费 | 九一网站在线观看 | 91中出 | 伊人中文字幕在线 | 国产激情综合 | 两性视频久久 | 亚洲中午字幕 | 丰满少妇一区二区三区专区 | 日韩在线1| 成人免费三级 |