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

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

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

2019-11-09 18:04:54
字體:
來源:轉載
供稿:網友

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

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

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

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

一、自繪控件

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

下面我們準備來自定義一個計數(shù)器View,這個View可以響應用戶的點擊事件,并自動記錄一共點擊了多少次。新建一個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();	}}可以看到,首先我們在CounterView的構造函數(shù)中初始化了一些數(shù)據(jù),并給這個View的本身注冊了點擊事件,這樣當CounterView被點擊的時候,onClick()方法就會得到調用。而onClick()方法中的邏輯就更加簡單了,只是對mCount這個計數(shù)器加1,然后調用invalidate()方法。通過 Android視圖狀態(tài)及重繪流程分析,帶你一步步深入了解View(三)  這篇文章的學習我們都已經知道,調用invalidate()方法會導致視圖進行重繪,因此onDraw()方法在稍后就將會得到調用。

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

這樣,一個自定義的View就已經完成了,并且目前這個CounterView是具備自動計數(shù)功能的。那么剩下的問題就是如何讓這個View在界面上顯示出來了,其實這也非常簡單,我們只需要像使用普通的控件一樣來使用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放入了一個RelativeLayout中,然后可以像使用普通控件來給CounterView指定各種屬性,比如通過layout_width和layout_height來指定CounterView的寬高,通過android:layout_centerInParent來指定它在布局里居中顯示。只不過需要注意,自定義的View在使用的時候一定要寫出完整的包名,不然系統(tǒng)將無法找到這個View。

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

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

二、組合控件

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

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

新建一個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>

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

接下來創(chuàng)建一個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中的代碼非常簡單,在TitleView的構建方法中,我們調用了LayoutInflater的inflate()方法來加載剛剛定義的title.xml布局,這部分內容我們已經在 Android LayoutInflater原理分析,帶你一步步深入了解View(一)  這篇文章中學習過了。

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

另外,為了讓TitleView有更強地擴展性,我們還提供了setTitleText()、setLeftButtonText()、setLeftButtonListener()等方法,分別用于設置標題欄上的文字、返回按鈕上的文字、以及返回按鈕的點擊事件。

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

<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>

這樣就成功將一個標題欄控件引入到布局文件中了,運行一下程序,效果如下圖所示:

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

三、繼承控件

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

為了能夠加深大家對這種自定義View方式的理解,下面我們再來編寫一個新的繼承控件。ListView相信每一個Android程序員都一定使用過,這次我們準備對ListView進行擴展,加入在ListView上滑動就可以顯示出一個刪除按鈕,點擊按鈕就會刪除相應數(shù)據(jù)的功能。

首先需要準備一個刪除按鈕的布局,新建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>這個布局文件很簡單,只有一個按鈕而已,并且我們給這個按鈕指定了一張刪除背景圖。

接著創(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);	}}由于代碼邏輯比較簡單,我就沒有加注釋。這里在MyListView的構造方法中創(chuàng)建了一個GestureDetector的實例用于監(jiān)聽手勢,然后給MyListView注冊了touch監(jiān)聽事件。然后在onTouch()方法中進行判斷,如果刪除按鈕已經顯示了,就將它移除掉,如果刪除按鈕沒有顯示,就使用GestureDetector來處理當前手勢。

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

好了,自定義View的功能到此就完成了,接下來我們需要看一下如何才能使用這個自定義View。首先需要創(chuàng)建一個ListView子項的布局文件,新建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)建一個適配器MyAdapter,在這個適配器中去加載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;	}}到這里就基本已經完工了,下面在程序的主布局文件里面引入MyListView這個控件,如下所示:
<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");	}}這樣就把整個例子的代碼都完成了,現(xiàn)在運行一下程序,會看到MyListView可以像ListView一樣,正常顯示所有的數(shù)據(jù),但是當你用手指在MyListView的某一行上快速滑動時,就會有一個刪除按鈕顯示出來,如下圖所示: 

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

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


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
xxx在线视频| 国产一区二区三区在线免费| 国产欧美日韩精品在线| 国产一区二区自拍| 国产精品免费在线免费| 欧美xxx在线| 超碰aⅴ人人做人人爽欧美| 欧美一级欧美三级| a欧美人片人妖| 日韩亚洲天堂| 91久久线看在观草草青青| 激情视频免费网站| 亚洲综合视频1区| 亚洲一区免费视频| 黄色影院在线观看| 在线视频三级| 国产成人精品日本亚洲| 欧美亚日韩国产aⅴ精品中极品| 天天综合网入口| 欧美精品18videos性欧| 超碰影院在线观看| xxxx国产视频| 国产精品每日更新在线播放网址| 亚洲国产精品成人av| 香蕉视频免费在线播放| 亚洲第一精品夜夜躁人人躁| 99久久综合狠狠综合久久| 少妇人妻大乳在线视频| 亚洲永久免费精品| 国产日韩欧美激情| 久久久久久毛片| heyzo在线欧美播放| 免费看h的网站| 妺妺窝人体色www在线观看| 久久免费高清视频| 在线免费视频a| 成人爽a毛片一区二区免费| 久久久久久久激情| 毛片网站在线看| 久久久精品一区| 亚洲AV成人无码网站天堂久久| 日韩欧美在线视频免费观看| 成人动漫视频在线| 野战少妇38p| 色偷偷噜噜噜亚洲男人| 国产99在线免费| 亚洲天堂中文在线| 精品一区二区三区免费站| 亚洲午夜一区| 久久久久亚洲av成人片| 亚洲第一中文字幕在线观看| 成人激情视频网| 日韩欧美亚洲范冰冰与中字| 蜜臀久久99精品久久久画质超高清| 亚洲va男人天堂| 激情另类小说区图片区视频区| 欧美粗暴性video| 免费观看一级特黄欧美大片| 成人免费无遮挡无码黄漫视频| 中文字幕久久精品一区二区| 欧美成人激情视频免费观看| 日韩电影免费在线| 国产一区二区三区18| 毛片视频免费| 免费成人三级| 国产一级特黄a大片99| 中国女人内谢69视频| 很污很黄的网站| 国产成人精品亚洲线观看| 成人免费看片| 日韩三级小视频| 在线观看日韩片| 88xx成人网| 97在线观看免费高清| 欧美s码亚洲码精品m码| 伊人久久综合97精品| 天天干天天操天天爱| 性插视频在线观看| 性xxxx丰满孕妇xxxx另类| 天堂久久av| 无码人妻精品一区二区三区9厂| 亚洲国产美女精品久久久久∴| 久久久在线观看| 国产91精品青草社区| 久久众筹精品私拍模特| av网站免费观看| 欧美日韩久久久久| 欧美午夜影院| 精品欧美日韩精品| 精品国产一区二区精华| 亚洲第一在线| 中文字幕日本乱码精品影院| 欧美无砖专区免费| 丰满少妇一区二区三区| 黄色片大全在线观看| 岛国一区二区三区高清视频| 激情av一区二区| 国产视频在线观看一区二区| 久久久亚洲欧洲日产| 精品久久久无码人妻字幂| 久久狠狠久久综合桃花| 国产精品㊣新片速递bt| 欧美人成免费网站| 亚洲欧美se| 在线看成人av| 欧美国产一区二区在线观看| 午夜精品久久久久久久久久| 亚洲图片中文字幕| 国产亚洲欧美一区二区| 欧美丝袜丝交足nylons图片| 波多野结衣视频播放| 你懂的免费视频| 日韩在线xxx| 美州a亚洲一视本频v色道| 美腿丝袜亚洲一区| 成人av电影在线网| av中文资源在线| 在线看国产精品| 桥本有菜亚洲精品av在线| 干b视频在线观看| 在线播放国产一区二区三区| 特级西西444www大精品视频免费看| 久久精品国产第一区二区三区最新章节| 在线国产一区二区三区| 热久久这里只有| 亚洲3atv精品一区二区三区| 丁香资源影视免费观看| 欧美老妇交乱视频| 午夜精品福利影院| 天天av天天翘天天综合网| 韩日精品中文字幕| 天堂在线观看av| 国产一区二区三区四区大秀| 性欧美激情精品| 亚洲精品一区中文字幕乱码| 欧美videos巨大粗暴| 丰满少妇一区二区| 成全在线观看免费完整动漫| 国产主播在线看| 中文字幕剧情在线观看| 国产1卡2卡三卡四卡网站| 99高清免费国产自产拍| 91综合在线| 成人淫片免费视频95视频| www.污视频| 香蕉久久夜色精品国产使用方法| 亚洲美女性生活视频| 国产精品五区| 国产精品久久99| 亚洲精品久久久久久国| 久久精品亚洲乱码伦伦中文| 国模套图日韩精品一区二区| 一级毛片视频在线| 无码h黄肉3d动漫在线观看| 天堂网免费视频| 欧美精品三级| 首播影院在线观看免费观看电视| 国产探花一区二区三区| 亚洲天堂2024| 日韩精品一页| 91九色国产蝌蚪| 最新在线黄色网址| 最近免费中文字幕大全免费版视频| 在线亚洲自拍| 国产又粗又猛又黄又爽无遮挡| 国产精九九网站漫画| 成人亚洲在线观看| 亚洲欧美在线播放| 88av看到爽| 欧美另类精品xxxx孕妇| 变态另类ts人妖一区二区| 精品国偷自产在线视频| 亚洲av片不卡无码久久| 国产三级第一页| 黄色免费大片| 国产一区网站| 国产一级片播放| 直接看的黄色网址| 天堂va久久久噜噜噜久久va| 99久久精品免费| 中文字幕精品视频| 欧美成人精品一级| 亚洲人成电影网站色…| 暖暖视频在线免费观看| 久久99视频精品| 18被视频免费观看视频| 91黄色在线视频| 操日韩av在线电影| 中文字幕乱码视频| 亚洲免费成人av在线| 久久草视频在线| 国产色无码精品视频国产| 日本高清不卡aⅴ免费网站| 国产福利视频在线播放| 粉嫩av四季av绯色av第一区| 视频在线精品一区| 国产视频精品在线| 中国日韩欧美久久久久久久久| 自由的xxxx在线视频| 欧美三根一起进三p| 99免费在线视频| 亚洲一区二区三区四区在线观看| 国产在线乱码一区二区三区| 黄页网址大全在线播放| 自拍偷拍欧美亚洲| 日韩欧中文字幕| 人妻中文字幕一区二区三区| 找av导航入口| 免费在线观看h片| 青草伊人久久| 日韩高清不卡av| 国产这里有精品| 亚洲黄色在线网站| jizz内谢中国亚洲jizz| 熟女人妻一区二区三区免费看| 影音先锋男人在线| 比比资源-先锋影音资源站| 国产精品午夜在线| 色综合久久久久久久久五月| 在线视频欧美亚洲| 一级毛片在线| 国产白浆在线观看| 青青草av在线播放| 超碰在线观看av| 天堂网中文在线| 伊人网在线免费观看| 免费看污久久久| 猛男欧美办公室激情在线| 西西裸体人体做爰大胆久久久| 中文天堂网在线www| 九色蝌蚪视频在线| 色综合久久中文字幕综合网| 波多野结衣av在线免费观看| 亚洲午夜精品网| 色综合久久天天综合网| 美洲精品一卡2卡三卡4卡四卡| 91国产成人在线| 伊人色**天天综合婷婷| 亚洲高清不卡av| 国产天堂视频在线观看| 97品白浆高清久久久久久| youjizz.com在线观看| 成人网视频在线观看| 成年永久一区二区三区免费视频| 亚洲一级二级在线| 亚洲精品第1页| 欧美一级在线播放| 91porn在线视频| 先锋影音av资源站| 麻豆一区区三区四区产品精品蜜桃| 日韩亚洲一区二区| 电影午夜精品一区二区三区| 欧美激情一区二区三区全黄| 日韩一区二区三区资源| 日韩成人一区二区| 成人看片在线观看| 91国产美女视频| 国产91视频一区| 亚洲va欧美va在线观看| 加勒比海盗1在线观看免费国语版| 超碰人人人人人人人| 国内精品视频免费| 国产日产欧美视频| 在线观看中文字幕| 九九久久久久午夜精选| 国产suv精品一区二区68| 国产精品久久网站| 亚洲不卡的av| 深夜精品寂寞黄网站在线观看| 肥熟一91porny丨九色丨| 国产69视频在线观看| 黄色片网站在线| 在线观看一区二区三区三州| av一区观看| 免费看av的网址| 亚洲欧洲精品一区二区三区不卡| 男女羞羞免费视频| 四虎成人精品在永久免费| 日韩欧美中文字幕一区二区| 337p日本欧洲亚洲大胆鲁鲁| 69成人在线| 三级精品视频久久久久| 在线视频一区二区三区| 欧美性猛交xxxxx免费看| 美女尤物国产一区| 免费日韩一区二区三区| 美女视频一区二区三区在线| 日本黄色网网页| 手机看片福利在线观看| 91精品久久久久久蜜桃| 久久不射热爱视频精品| 欧美日韩一区二区三区视频| 91精品观看| 久久久久久亚洲综合影院红桃| 一本一道久久综合狠狠老| www黄色网址| eeuss影院www天堂免费| 麻豆国产精品一区二区三区| 午夜一区二区三区视频| 手机福利小视频在线播放| 久久sese| 日本免费中文字幕在线| 99国产精品久久久久久久成人| 欧美日一区二区| 日本欧洲一区二区| 香港成人在线视频| 久久无码人妻一区二区三区| 国产精品成人久久久| 天天免费亚洲黑人免费| 亚洲乱码精品| 你懂的亚洲视频| 国产激情久久久久| 色妞欧美日韩在线| 亚洲夜晚福利在线观看| 色噜噜狠狠一区二区三区果冻| 欧美激情啊啊啊| 日韩成人免费观看| 中文字幕国产日韩| 欧美三级黄色大片| 成人淫片免费视频95视频| 亚洲精品www久久久久久广东| free性m.freesex欧美| 欧美一级高清片在线观看| 亚洲福利视频久久| 少妇无套高潮一二三区| 亚洲乱码国产乱码精品精可以看| 日本理论片2828理论片| 一区二区在线视频|