国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁(yè) > 系統(tǒng) > Android > 正文

Android自定義View的實(shí)現(xiàn)方法,帶你一步步深入了解View(四)

2019-11-09 18:04:54
字體:
供稿:網(wǎng)友

不知不覺中,帶你一步步深入了解View系列的文章已經(jīng)寫到第四篇了,回顧一下,我們一共學(xué)習(xí)了LayoutInflater的原理分析、視圖的繪制流程、視圖的狀態(tài)及重繪等知識(shí),算是把View中很多重要的知識(shí)點(diǎn)都涉及到了。如果你還沒有看過我前面的幾篇文章,建議先去閱讀一下,多了解一些原理方面的東西。

之前我有承諾過,會(huì)在View這個(gè)話題上多寫幾篇博客,講一講View的工作原理,以及自定義View的方法。現(xiàn)在前半部分的承諾已經(jīng)如約兌現(xiàn)了,那么今天我就要來兌現(xiàn)后面部分的承諾,講一講自定義View的實(shí)現(xiàn)方法,同時(shí)這也是帶你一步步深入了解View系列的完結(jié)篇。

一些接觸Android不久的朋友對(duì)自定義View都有一絲畏懼感,總感覺這是一個(gè)比較高級(jí)的技術(shù),但其實(shí)自定義View并不復(fù)雜,有時(shí)候只需要簡(jiǎn)單幾行代碼就可以完成了。

如果說要按類型來劃分的話,自定義View的實(shí)現(xiàn)方式大概可以分為三種,自繪控件、組合控件、以及繼承控件。那么下面我們就來依次學(xué)習(xí)一下,每種方式分別是如何自定義View的。

一、自繪控件

自繪控件的意思就是,這個(gè)View上所展現(xiàn)的內(nèi)容全部都是我們自己繪制出來的。繪制的代碼是寫在onDraw()方法中的,而這部分內(nèi)容我們已經(jīng)在 Android視圖繪制流程完全解析,帶你一步步深入了解View(二)  中學(xué)習(xí)過了。

下面我們準(zhǔn)備來自定義一個(gè)計(jì)數(shù)器View,這個(gè)View可以響應(yīng)用戶的點(diǎn)擊事件,并自動(dòng)記錄一共點(diǎn)擊了多少次。新建一個(gè)CounterView繼承自View,代碼如下所示:

public class CounterView extends View implements OnClickListener {	PRivate Paint mPaint;		private Rect mBounds;	private int mCount;		public CounterView(Context context, AttributeSet attrs) {		super(context, attrs);		mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);		mBounds = new Rect();		setOnClickListener(this);	}	@Override	protected void onDraw(Canvas canvas) {		super.onDraw(canvas);		mPaint.setColor(Color.BLUE);		canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint);		mPaint.setColor(Color.YELLOW);		mPaint.setTextSize(30);		String text = String.valueOf(mCount);		mPaint.getTextBounds(text, 0, text.length(), mBounds);		float textWidth = mBounds.width();		float textHeight = mBounds.height();		canvas.drawText(text, getWidth() / 2 - textWidth / 2, getHeight() / 2				+ textHeight / 2, mPaint);	}	@Override	public void onClick(View v) {		mCount++;		invalidate();	}}可以看到,首先我們?cè)贑ounterView的構(gòu)造函數(shù)中初始化了一些數(shù)據(jù),并給這個(gè)View的本身注冊(cè)了點(diǎn)擊事件,這樣當(dāng)CounterView被點(diǎn)擊的時(shí)候,onClick()方法就會(huì)得到調(diào)用。而onClick()方法中的邏輯就更加簡(jiǎn)單了,只是對(duì)mCount這個(gè)計(jì)數(shù)器加1,然后調(diào)用invalidate()方法。通過 Android視圖狀態(tài)及重繪流程分析,帶你一步步深入了解View(三)  這篇文章的學(xué)習(xí)我們都已經(jīng)知道,調(diào)用invalidate()方法會(huì)導(dǎo)致視圖進(jìn)行重繪,因此onDraw()方法在稍后就將會(huì)得到調(diào)用。

既然CounterView是一個(gè)自繪視圖,那么最主要的邏輯當(dāng)然就是寫在onDraw()方法里的了,下面我們就來仔細(xì)看一下。這里首先是將Paint畫筆設(shè)置為藍(lán)色,然后調(diào)用Canvas的drawRect()方法繪制了一個(gè)矩形,這個(gè)矩形也就可以當(dāng)作是CounterView的背景圖吧。接著將畫筆設(shè)置為黃色,準(zhǔn)備在背景上面繪制當(dāng)前的計(jì)數(shù),注意這里先是調(diào)用了getTextBounds()方法來獲取到文字的寬度和高度,然后調(diào)用了drawText()方法去進(jìn)行繪制就可以了。

這樣,一個(gè)自定義的View就已經(jīng)完成了,并且目前這個(gè)CounterView是具備自動(dòng)計(jì)數(shù)功能的。那么剩下的問題就是如何讓這個(gè)View在界面上顯示出來了,其實(shí)這也非常簡(jiǎn)單,我們只需要像使用普通的控件一樣來使用CounterView就可以了。比如在布局文件中加入如下代碼:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent" >    <com.example.customview.CounterView        android:layout_width="100dp"        android:layout_height="100dp"        android:layout_centerInParent="true" /></RelativeLayout>可以看到,這里我們將CounterView放入了一個(gè)RelativeLayout中,然后可以像使用普通控件來給CounterView指定各種屬性,比如通過layout_width和layout_height來指定CounterView的寬高,通過android:layout_centerInParent來指定它在布局里居中顯示。只不過需要注意,自定義的View在使用的時(shí)候一定要寫出完整的包名,不然系統(tǒng)將無(wú)法找到這個(gè)View。

好了,就是這么簡(jiǎn)單,接下來我們可以運(yùn)行一下程序,并不停地點(diǎn)擊CounterView,效果如下圖所示。

怎么樣?是不是感覺自定義View也并不是什么高級(jí)的技術(shù),簡(jiǎn)單幾行代碼就可以實(shí)現(xiàn)了。當(dāng)然了,這個(gè)CounterView功能非常簡(jiǎn)陋,只有一個(gè)計(jì)數(shù)功能,因此只需幾行代碼就足夠了,當(dāng)你需要繪制比較復(fù)雜的View時(shí),還是需要很多技巧的。

二、組合控件

組合控件的意思就是,我們并不需要自己去繪制視圖上顯示的內(nèi)容,而只是用系統(tǒng)原生的控件就好了,但我們可以將幾個(gè)系統(tǒng)原生的控件組合到一起,這樣創(chuàng)建出的控件就被稱為組合控件。

舉個(gè)例子來說,標(biāo)題欄就是個(gè)很常見的組合控件,很多界面的頭部都會(huì)放置一個(gè)標(biāo)題欄,標(biāo)題欄上會(huì)有個(gè)返回按鈕和標(biāo)題,點(diǎn)擊按鈕后就可以返回到上一個(gè)界面。那么下面我們就來嘗試去實(shí)現(xiàn)這樣一個(gè)標(biāo)題欄控件。

新建一個(gè)title.xml布局文件,代碼如下所示:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="50dp"    android:background="#ffcb05" >    <Button        android:id="@+id/button_left"        android:layout_width="60dp"        android:layout_height="40dp"        android:layout_centerVertical="true"        android:layout_marginLeft="5dp"        android:background="@drawable/back_button"        android:text="Back"        android:textColor="#fff" />    <TextView        android:id="@+id/title_text"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerInParent="true"        android:text="This is Title"        android:textColor="#fff"        android:textSize="20sp" /></RelativeLayout>

在這個(gè)布局文件中,我們首先定義了一個(gè)RelativeLayout作為背景布局,然后在這個(gè)布局里定義了一個(gè)Button和一個(gè)TextView,Button就是標(biāo)題欄中的返回按鈕,TextView就是標(biāo)題欄中的顯示的文字。

接下來創(chuàng)建一個(gè)TitleView繼承自FrameLayout,代碼如下所示:

public class TitleView extends FrameLayout {	private Button leftButton;	private TextView titleText;	public TitleView(Context context, AttributeSet attrs) {		super(context, attrs);		LayoutInflater.from(context).inflate(R.layout.title, this);		titleText = (TextView) findViewById(R.id.title_text);		leftButton = (Button) findViewById(R.id.button_left);		leftButton.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View v) {				((Activity) getContext()).finish();			}		});	}	public void setTitleText(String text) {		titleText.setText(text);	}	public void setLeftButtonText(String text) {		leftButton.setText(text);	}	public void setLeftButtonListener(OnClickListener l) {		leftButton.setOnClickListener(l);	}}TitleView中的代碼非常簡(jiǎn)單,在TitleView的構(gòu)建方法中,我們調(diào)用了LayoutInflater的inflate()方法來加載剛剛定義的title.xml布局,這部分內(nèi)容我們已經(jīng)在 Android LayoutInflater原理分析,帶你一步步深入了解View(一)  這篇文章中學(xué)習(xí)過了。

接下來調(diào)用findViewById()方法獲取到了返回按鈕的實(shí)例,然后在它的onClick事件中調(diào)用finish()方法來關(guān)閉當(dāng)前的Activity,也就相當(dāng)于實(shí)現(xiàn)返回功能了。

另外,為了讓TitleView有更強(qiáng)地?cái)U(kuò)展性,我們還提供了setTitleText()、setLeftButtonText()、setLeftButtonListener()等方法,分別用于設(shè)置標(biāo)題欄上的文字、返回按鈕上的文字、以及返回按鈕的點(diǎn)擊事件。

到了這里,一個(gè)自定義的標(biāo)題欄就完成了,那么下面又到了如何引用這個(gè)自定義View的部分,其實(shí)方法基本都是相同的,在布局文件中添加如下代碼:

<RelativeLayout 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" >    <com.example.customview.TitleView        android:id="@+id/title_view"        android:layout_width="match_parent"        android:layout_height="wrap_content" >    </com.example.customview.TitleView></RelativeLayout>

這樣就成功將一個(gè)標(biāo)題欄控件引入到布局文件中了,運(yùn)行一下程序,效果如下圖所示:

現(xiàn)在點(diǎn)擊一下Back按鈕,就可以關(guān)閉當(dāng)前的Activity了。如果你想要修改標(biāo)題欄上顯示的內(nèi)容,或者返回按鈕的默認(rèn)事件,只需要在Activity中通過findViewById()方法得到TitleView的實(shí)例,然后調(diào)用setTitleText()、setLeftButtonText()、setLeftButtonListener()等方法進(jìn)行設(shè)置就OK了。

三、繼承控件

繼承控件的意思就是,我們并不需要自己重頭去實(shí)現(xiàn)一個(gè)控件,只需要去繼承一個(gè)現(xiàn)有的控件,然后在這個(gè)控件上增加一些新的功能,就可以形成一個(gè)自定義的控件了。這種自定義控件的特點(diǎn)就是不僅能夠按照我們的需求加入相應(yīng)的功能,還可以保留原生控件的所有功能,比如  Android PowerImageView實(shí)現(xiàn),可以播放動(dòng)畫的強(qiáng)大ImageView  這篇文章中介紹的PowerImageView就是一個(gè)典型的繼承控件。

為了能夠加深大家對(duì)這種自定義View方式的理解,下面我們?cè)賮砭帉懸粋€(gè)新的繼承控件。ListView相信每一個(gè)Android程序員都一定使用過,這次我們準(zhǔn)備對(duì)ListView進(jìn)行擴(kuò)展,加入在ListView上滑動(dòng)就可以顯示出一個(gè)刪除按鈕,點(diǎn)擊按鈕就會(huì)刪除相應(yīng)數(shù)據(jù)的功能。

首先需要準(zhǔn)備一個(gè)刪除按鈕的布局,新建delete_button.xml文件,代碼如下所示:

<?xml version="1.0" encoding="utf-8"?><Button xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/delete_button"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:background="@drawable/delete_button" ></Button>這個(gè)布局文件很簡(jiǎn)單,只有一個(gè)按鈕而已,并且我們給這個(gè)按鈕指定了一張刪除背景圖。

接著創(chuàng)建MyListView繼承自ListView,這就是我們自定義的View了,代碼如下所示:

public class MyListView extends ListView implements OnTouchListener,		OnGestureListener {	private GestureDetector gestureDetector;	private OnDeleteListener listener;	private View deleteButton;	private ViewGroup itemLayout;	private int selectedItem;	private boolean isDeleteShown;	public MyListView(Context context, AttributeSet attrs) {		super(context, attrs);		gestureDetector = new GestureDetector(getContext(), this);		setOnTouchListener(this);	}	public void setOnDeleteListener(OnDeleteListener l) {		listener = l;	}	@Override	public boolean onTouch(View v, MotionEvent event) {		if (isDeleteShown) {			itemLayout.removeView(deleteButton);			deleteButton = null;			isDeleteShown = false;			return false;		} else {			return gestureDetector.onTouchEvent(event);		}	}	@Override	public boolean onDown(MotionEvent e) {		if (!isDeleteShown) {			selectedItem = pointToPosition((int) e.getX(), (int) e.getY());		}		return false;	}	@Override	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,			float velocityY) {		if (!isDeleteShown && Math.abs(velocityX) > Math.abs(velocityY)) {			deleteButton = LayoutInflater.from(getContext()).inflate(					R.layout.delete_button, null);			deleteButton.setOnClickListener(new OnClickListener() {				@Override				public void onClick(View v) {					itemLayout.removeView(deleteButton);					deleteButton = null;					isDeleteShown = false;					listener.onDelete(selectedItem);				}			});			itemLayout = (ViewGroup) getChildAt(selectedItem					- getFirstVisiblePosition());			RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(					LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);			params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);			params.addRule(RelativeLayout.CENTER_VERTICAL);			itemLayout.addView(deleteButton, params);			isDeleteShown = true;		}		return false;	}	@Override	public boolean onSingleTapUp(MotionEvent e) {		return false;	}	@Override	public void onShowPress(MotionEvent e) {	}	@Override	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,			float distanceY) {		return false;	}	@Override	public void onLongPress(MotionEvent e) {	}		public interface OnDeleteListener {		void onDelete(int index);	}}由于代碼邏輯比較簡(jiǎn)單,我就沒有加注釋。這里在MyListView的構(gòu)造方法中創(chuàng)建了一個(gè)GestureDetector的實(shí)例用于監(jiān)聽手勢(shì),然后給MyListView注冊(cè)了touch監(jiān)聽事件。然后在onTouch()方法中進(jìn)行判斷,如果刪除按鈕已經(jīng)顯示了,就將它移除掉,如果刪除按鈕沒有顯示,就使用GestureDetector來處理當(dāng)前手勢(shì)。

當(dāng)手指按下時(shí),會(huì)調(diào)用OnGestureListener的onDown()方法,在這里通過pointToPosition()方法來判斷出當(dāng)前選中的是ListView的哪一行。當(dāng)手指快速滑動(dòng)時(shí),會(huì)調(diào)用onFling()方法,在這里會(huì)去加載delete_button.xml這個(gè)布局,然后將刪除按鈕添加到當(dāng)前選中的那一行item上。注意,我們還給刪除按鈕添加了一個(gè)點(diǎn)擊事件,當(dāng)點(diǎn)擊了刪除按鈕時(shí)就會(huì)回調(diào)onDeleteListener的onDelete()方法,在回調(diào)方法中應(yīng)該去處理具體的刪除操作。

好了,自定義View的功能到此就完成了,接下來我們需要看一下如何才能使用這個(gè)自定義View。首先需要?jiǎng)?chuàng)建一個(gè)ListView子項(xiàng)的布局文件,新建my_list_view_item.xml,代碼如下所示:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:descendantFocusability="blocksDescendants"    android:orientation="vertical" >    <TextView        android:id="@+id/text_view"        android:layout_width="wrap_content"        android:layout_height="50dp"        android:layout_centerVertical="true"        android:gravity="left|center_vertical"        android:textColor="#000" /></RelativeLayout>然后創(chuàng)建一個(gè)適配器MyAdapter,在這個(gè)適配器中去加載my_list_view_item布局,代碼如下所示:
public class MyAdapter extends ArrayAdapter<String> {	public MyAdapter(Context context, int textViewResourceId, List<String> objects) {		super(context, textViewResourceId, objects);	}	@Override	public View getView(int position, View convertView, ViewGroup parent) {		View view;		if (convertView == null) {			view = LayoutInflater.from(getContext()).inflate(R.layout.my_list_view_item, null);		} else {			view = convertView;		}		TextView textView = (TextView) view.findViewById(R.id.text_view);		textView.setText(getItem(position));		return view;	}}到這里就基本已經(jīng)完工了,下面在程序的主布局文件里面引入MyListView這個(gè)控件,如下所示:
<RelativeLayout 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" >    <com.example.customview.MyListView        android:id="@+id/my_list_view"        android:layout_width="match_parent"        android:layout_height="wrap_content" >    </com.example.customview.MyListView></RelativeLayout>最后在Activity中初始化MyListView中的數(shù)據(jù),并處理了onDelete()方法的刪除邏輯,代碼如下所示:
public class MainActivity extends Activity {	private MyListView myListView;	private MyAdapter adapter;	private List<String> contentList = new ArrayList<String>();	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		requestWindowFeature(Window.FEATURE_NO_TITLE);		setContentView(R.layout.activity_main);		initList();		myListView = (MyListView) findViewById(R.id.my_list_view);		myListView.setOnDeleteListener(new OnDeleteListener() {			@Override			public void onDelete(int index) {				contentList.remove(index);				adapter.notifyDataSetChanged();			}		});		adapter = new MyAdapter(this, 0, contentList);		myListView.setAdapter(adapter);	}	private void initList() {		contentList.add("Content Item 1");		contentList.add("Content Item 2");		contentList.add("Content Item 3");		contentList.add("Content Item 4");		contentList.add("Content Item 5");		contentList.add("Content Item 6");		contentList.add("Content Item 7");		contentList.add("Content Item 8");		contentList.add("Content Item 9");		contentList.add("Content Item 10");		contentList.add("Content Item 11");		contentList.add("Content Item 12");		contentList.add("Content Item 13");		contentList.add("Content Item 14");		contentList.add("Content Item 15");		contentList.add("Content Item 16");		contentList.add("Content Item 17");		contentList.add("Content Item 18");		contentList.add("Content Item 19");		contentList.add("Content Item 20");	}}這樣就把整個(gè)例子的代碼都完成了,現(xiàn)在運(yùn)行一下程序,會(huì)看到MyListView可以像ListView一樣,正常顯示所有的數(shù)據(jù),但是當(dāng)你用手指在MyListView的某一行上快速滑動(dòng)時(shí),就會(huì)有一個(gè)刪除按鈕顯示出來,如下圖所示: 

點(diǎn)擊一下刪除按鈕就可以將第6行的數(shù)據(jù)刪除了。此時(shí)的MyListView不僅保留了ListView原生的所有功能,還增加了一個(gè)滑動(dòng)進(jìn)行刪除的功能,確實(shí)是一個(gè)不折不扣的繼承控件。

到了這里,我們就把自定義View的幾種實(shí)現(xiàn)方法全部講完了,雖然每個(gè)例子都很簡(jiǎn)單,但是萬(wàn)變不離其宗,復(fù)雜的View也是由這些簡(jiǎn)單的原理堆積出來的。經(jīng)過了四篇文章的學(xué)習(xí),相信每個(gè)人對(duì)View的理解都已經(jīng)較為深入了,那么帶你一步步深入了解View系列的文章就到此結(jié)束,感謝大家有耐心看到最后。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
中文字幕在线观看播放| 九色福利视频| 精品亚洲成a人片在线观看| 国产九九九九| 国产福利图片| 人日人天天爽| 超碰91在线| 四虎一区二区三区| 麻豆视频在线观看免费网站| 国产香蕉尹人视频在线| 精品成人一区二区三区免费视频| eeuss影院网站免费观看| 丝袜理论片在线观看| 高清av中文在线字幕观看1| 中文字幕av中文字幕| 精品美女在线观看视频在线观看| 亚洲www色| 国产嫩草在线视频| 亚洲一道本在线| 国产丝袜自拍| 九九热视频在线观看| 2021天堂中文幕一二区在线观| 91国内精品在线视频| 国产精品xxx电影| 国产美女视频一区二区二三区| 亚洲国产成人综合| 99视频在线观看地址| 99热免费观看| 国产偷激情在线| 黄色av网站在线免费观看| 在线观看av中文| 国产成人精品综合网站| 九九精品视频在线观看九九| av网址在线播放| 国产福利电影在线观看| 最近免费中文字幕大全免费第三页| av首页在线| 国产网站在线播放| 国产一区二区影视| 中文字幕在线观看日本| 99视频资源网| 国产小视频福利在线| 最近免费中文字幕在线第一页| 国内自拍视频在线看免费观看| а√资源新版在线天堂| eeuss影院在线观看第一页| 精品国产丝袜高跟鞋| 精品三级久久久久久久电影聊斋| 国产三级在线观看| 97在线免费| www.蜜桃av| 国产精品一品| 国产美女福利在线观看| 91sp网站在线观看入口| 国产青青视频| 在线观看电影av| 男女午夜视频在线观看| 天堂在线视频| 影音先锋中文字幕在线| www.香蕉视频在线观看| 国产麻豆高清视频在线第一页| 国产一卡二卡3卡4卡四卡在线| 精品推荐蜜桃传媒| 日本免费视频www| 最新中文字幕在线视频| 精品美女在线观看视频在线观看| av在线不卡网站| 狠狠操狠狠色| 在线观看精品视频一区二区三区| 青青草中文字幕| 国产黄大片在线观看画质优化| 樱花草在线观看www| 国产精选在线观看| а√最新版地址在线天堂| 国产激情在线视频| 九九热视频精品在线观看| 97国产在线| 国产在线超碰| 亚洲视频网站在线| 国产区高清在线| 国产中文第一页| 日本在线视频www鲁啊鲁| 午夜伦全在线观看| 久草在线视频网| www.xxx黄| av中文在线| 99色在线观看| 在线中文字幕第一页| 最新av中文字幕| 最新黄网在线观看| 成人超碰在线| 国内精品免费一区二区三区| 欧美啪啪精品| 久久国产情侣| 毛片视频免费观看| 浪潮av一区| 成在在线免费视频| 狠狠操视频网| 国产麻豆麻豆| 国产三区在线观看| 国产精品久久一区二区三区不卡| 国产美女视频一区二区二三区| 国产在线视精品麻豆| 国产美女在线观看| 国产小视频在线观看| 国产日本韩国在线播放| 国产对白国语对白| 亚洲欧美精品日韩欧美| 超碰97国产精品人人cao| 狂野欧美性猛交xxxx乱大交| 免费看黄视频网站| 国产在线视频网站| 激情丁香在线| 国产欧美日本亚洲精品一4区| 国产福利在线| 欧美亚洲天堂| 国产羞羞视频| free性亚洲| 国产日本在线观看| 亚洲成a人v欧美综合天堂麻豆| 碰草在线视频| 国产精品乱码一区二区三区视频| 69久久精品| 九九热精品在线视频| 国产欧美日韩第一页| 99热99re6国产在线播放| 欧美日韩性视频一区二区三区| 九色视频网站| 91九色在线看| 国产麻豆麻豆| 日本国产在线| 精品女厕厕露p撒尿| 国产在线高清理伦片a| 在线播放国产区| 国产黄色免费| 国产精品作爱| 四虎影视成人永久免费观看视频| 国内精品不卡| 亚洲精品影院在线| 国产私人影院| 高清色视频在线观看| 在线黄色.com| 1区2区3区在线| 国产传媒在线播放| 午夜视频在线观看网站午夜视频在线| 精品一区二区三区免费站| 69久久久久| 国产一级片网站| 国产男女无套在线播放| av在线电影观看| 91久久精品国产性色| 国产亚洲精品自在线观看| 免费a级人成a大片在线观看| 亚洲综合在线免费| 在线国产一级| 四虎成人精品在永久在线观看| 91美女在线| 国产黄大片在线观看画质优化| 最好2018中文免费视频| 国产免费av网站| 天天爱天天做色综合| 国产美女福利在线| 中文字幕中文字幕在线中高清免费版| 免费a在线观看| 国产中文字幕av| 国产美女福利在线| 中文字幕视频在线观看| 国产精品一二三区视频| 日本中文字幕高清视频| 尤物视频在线免费观看| 大香伊人中文字幕精品| 中文字幕国产视频| 成人精品一区二区三区免费| 黄网在线免费| 国产区视频在线播放| 国产三级自拍| 在线黄色av| 欧美人成在线观看网站高清| 免费看的毛片| 国产一卡2卡3卡四卡网站| 国产成人综合亚洲欧美在| 国产传媒在线播放| jizz性欧美| 国产免费视频| 国产www在线观看| 欧美精品一区二区三区免费| 青青草视频在线免费观看| 91青青在线视频| 免费看成年人视频在线观看| 免费国产阿v视频在线观看| 午夜av在线免费观看| 精品女厕厕露p撒尿| 欧美日韩久久中文字幕| 国产精品爱久久久久久久小说 | 最新超碰在线| 伊人中文字幕在线| 国产亚洲精品午夜高清影院| 天天插天天射| 黄色电影网站在线观看| 在线午夜视频|