日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

横向ListView(四) —— 添加滚动条

發布時間:2025/3/20 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 横向ListView(四) —— 添加滚动条 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

????在前面的文章已經介紹了橫向ListView的基礎實現及頭尾視圖的添加等的實現,這篇文章將介紹為橫向ListView添加滾動條;這一功能的添加和前面章節有些不同,前面章節添加功能都是在原來的控件上追加的,而滾動條的實現是以一個獨立的控件存在的,以組合的形式添加到橫向ListView中。

?

滾動條的實現思路:

????1.計算橫向ListView可見區域的寬度

????2.計算整個橫向ListView中所有數據都顯示時的視圖寬度(即理論上整個列表應該有的寬度)

????3.計算出左邊不可見的部分理論上應該有的寬度

????4.根據比例計算出當前滾動條的顯示寬度及顯示位置(即width和left的值)

????5.將滾動條控件組合到橫向ListView中,同時設置顯示開關

?

先上完整源碼:

1.滾動條控件源碼:

package com.hss.os.horizontallistview; import android.content.Context; import android.graphics.Color; import android.os.Build; import android.os.Handler; import android.os.Message; import android.support.annotation.RequiresApi; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; /** * Created by Administrator on 2017/8/9. */ public class ScrollBar extends View {private AlphaAnimation animation; private int defaultVal=5;//滾動條的默認寬高值 private ShowType type=ShowType.horizontal; private enum ShowType{horizontal, vertical }public ScrollBar(Context context) {super(context); init(context); }public ScrollBar(Context context, AttributeSet attrs) {super(context, attrs); init(context); }public ScrollBar(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr); init(context); }@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)public ScrollBar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes); init(context); }private void init(Context context){setBackgroundColor(Color.parseColor("#3c3f41"));//設置默認背景顏色 //創建AlphaAnimation(透明度動畫) animation=new AlphaAnimation(1.0f, 0.1f); //設置動畫時間 animation.setDuration(1500); //設置動畫重復次數 animation.setRepeatCount(0); animation.setAnimationListener(animationListener); }Handler handler=new Handler(new Handler.Callback() {@Override public boolean handleMessage(Message msg) {startAnimation(animation); return false; }}); private Animation.AnimationListener animationListener=new Animation.AnimationListener() {@Override public void onAnimationStart(Animation animation) {}@Override public void onAnimationEnd(Animation animation) {setVisibility(INVISIBLE);//使用INVISIBLE而不是使用GONE,是因為GONE會觸發requestLayout()執行,導致界面刷新 }@Override public void onAnimationRepeat(Animation animation) {}}; /** * 將滾動條從父布局中移除 * 必須調用這個方法執行移除操作,否則動畫執行會有問題 * @param parent */ public void remove(ViewGroup parent){handler.removeMessages(0); //必須在從父布局中移除之前調用clearAnimation(),否則之后的動畫執行會有問題 clearAnimation(); parent.removeViewInLayout(this); }/** * 控件沒有使用頭尾視圖設定時使用 * @param parent 父容器視圖 * @param firstItemIndex 在可見區域內第一個item的下標(不包含頭視圖) * @param lastItemIndex 在可見區域內最后一個item的下標(不包含尾視圖) * @param itemCount 所有的item總個數(不包含頭尾視圖) */ public void showVertical(ViewGroup parent,int firstItemIndex,int lastItemIndex,int itemCount){showVertical(parent,firstItemIndex,lastItemIndex,itemCount,0,0); }/** * 控件有使用頭尾視圖時使用 * @param parent 父容器視圖 * @param firstItemIndex 在可見區域內第一個item的下標(不包含頭視圖) * @param lastItemIndex 在可見區域內最后一個item的下標(不包含尾視圖) * @param itemCount 所有的item總個數(不包含頭尾視圖) * @param headVal 顯示的頭視圖高度 * @param footVal 顯示的尾視圖高度 */ public void showVertical(ViewGroup parent,int firstItemIndex,int lastItemIndex,int itemCount,int headVal,int footVal){type=ShowType.vertical; show(parent,firstItemIndex,lastItemIndex,itemCount,headVal,footVal); }/** * 控件沒有使用頭尾視圖設定時使用 * @param parent 父容器視圖 * @param firstItemIndex 在可見區域內第一個item的下標(不包含頭視圖) * @param lastItemIndex 在可見區域內最后一個item的下標(不包含尾視圖) * @param itemCount 所有的item總個數(不包含頭尾視圖) */ public void showHorizontal(ViewGroup parent,int firstItemIndex,int lastItemIndex,int itemCount){showHorizontal(parent,firstItemIndex,lastItemIndex,itemCount,0,0); }/** * 控件有使用頭尾視圖時使用 * @param parent 父容器視圖 * @param firstItemIndex 在可見區域內第一個item的下標(不包含頭視圖) * @param lastItemIndex 在可見區域內最后一個item的下標(不包含尾視圖) * @param itemCount 所有的item總個數(不包含頭尾視圖) * @param headVal 顯示的頭視圖寬度 * @param footVal 顯示的尾視圖寬度 */ public void showHorizontal(ViewGroup parent,int firstItemIndex,int lastItemIndex,int itemCount,int headVal,int footVal){type=ShowType.horizontal; show(parent,firstItemIndex,lastItemIndex,itemCount,headVal,footVal); }private int estimateVal=0;//預估的整個視圖所有子項都顯示出來時的高/寬(包含頭尾視圖) private int averageVal=0;//預估的每一個子視圖的高/寬(item的平均高度) private int showCount=0;//當前顯示的子項個數(不包含頭、尾視圖) /** * * @param parent 父容器視圖 * @param firstItemIndex 在可見區域內第一個item的下標(不包含頭視圖) * @param lastItemIndex 在可見區域內最后一個item的下標(不包含尾視圖) * @param itemCount 所有的item總個數(不包含頭尾視圖) * @param headVal 顯示的頭視圖高度 * @param footVal 顯示的尾視圖高度 */ private void show(ViewGroup parent,int firstItemIndex,int lastItemIndex,int itemCount,int headVal,int footVal){setVisibility(INVISIBLE);//使用INVISIBLE而不是使用GONE,是因為GONE會觸發requestLayout()執行,導致界面刷新 if(parent.getChildCount()==0) return;//沒有子視圖則不顯示滾動條 //以下五行對數據的調整,是為了確保數據在邏輯上的正確性,確保之下的計算不會出現邏輯以外的情況 firstItemIndex=firstItemIndex<0?0:firstItemIndex; lastItemIndex=lastItemIndex<0?0:lastItemIndex; lastItemIndex=lastItemIndex<firstItemIndex?firstItemIndex:lastItemIndex; itemCount=itemCount<=0?1:itemCount; itemCount=itemCount<=lastItemIndex? lastItemIndex+1:itemCount; if(lastItemIndex==0&&headVal==0&&footVal==0) return;//如果沒有顯示內容,則不顯示滾動條 showCount=lastItemIndex-firstItemIndex+1; ViewGroup.LayoutParams params=getLayoutParams(); int left=0,top=0,right=0,bottom=0; switch (type){case vertical://顯示豎向滾動條 int childHeight=getAllChildHeight(parent); int visibleHeight=getParentVisibleHeight(parent); if (childHeight<visibleHeight) return;//如果顯示的內容沒有超過可見區域,則不顯示滾動條 if (childHeight==visibleHeight&&showCount==itemCount) return;//臨界值 //計算left、right值 params.width = defaultVal; left=parent.getWidth()-parent.getPaddingRight()-params.width; right=left+params.width; // 計算top、bottom值 // 計算top的時候需要做如下考慮: // 如果所有的子項都已經顯示了,則需要采用精準顯示方式 // 如果不是所有的子項都已經顯示了,則采用模糊估量的顯示方式 int topH=0; if(showCount==itemCount){//精準計算滾動條 estimateVal=childHeight; topH=getChildOverHeightOfTop(parent); }else{averageVal=(childHeight-headVal-footVal)/showCount;//預估每個item的高度(不包括頭、尾視圖) estimateVal=averageVal*itemCount+headVal+footVal;//這里需要加上頭、尾視圖的值 topH = getChildOverHeightOfTop2(parent,headVal)+firstItemIndex*averageVal; }double hScale = visibleHeight/(estimateVal*1.0); double tScale = topH/(estimateVal*1.0); params.height = (int) (visibleHeight*hScale); top = (int) (parent.getPaddingTop()+visibleHeight*tScale); bottom=top+params.height; break; case horizontal://顯示橫向滾動條 default:int childWidth=getAllChildWidth(parent); int visibleWidth=getParentVisibleWidth(parent); if (childWidth<visibleWidth) return;//如果顯示的內容沒有超過可見區域,則不顯示滾動條 if (childWidth==visibleWidth&&showCount==itemCount) return;//臨界值 // 計算top、bottom值 params.height = defaultVal; top=parent.getHeight()-parent.getPaddingBottom()-params.height; bottom=top+params.height; //計算left、right值 // 計算left的時候需要做如下考慮: // 如果所有的子項都已經顯示了,則需要采用精準顯示方式 // 如果不是所有的子項都已經顯示了,則采用模糊估量的顯示方式 int topW=0; if(showCount==itemCount){//精準計算滾動條 estimateVal=childWidth; topW=getChildOverWidthOfLeft(parent); }else{averageVal=(childWidth-headVal-footVal)/showCount;//預估每個item的寬度(不包括頭、尾視圖) estimateVal=averageVal*itemCount+headVal+footVal;//這里需要加上頭、尾視圖的值 topW = getChildOverWidthOfLeft2(parent,headVal)+firstItemIndex*averageVal; }double wScale = visibleWidth/(estimateVal*1.0); double lScale = topW/(estimateVal*1.0); params.width = (int) (visibleWidth*wScale); left = (int) (parent.getPaddingLeft()+visibleWidth*lScale); right = left+params.width; }layout(left,top,right,bottom); setVisibility(VISIBLE); handler.sendEmptyMessageDelayed(0,1000); }/** * 獲得所有孩子視圖的總體高度 * @param parent * @return */ private int getAllChildHeight(ViewGroup parent){int val=0; for(int i=0;i<parent.getChildCount();i++){if(parent.getChildAt(i)!=this)val+=parent.getChildAt(i).getHeight(); }return val; }/** * 獲得父視圖的可見區域高度 * @param parent * @return */ private int getParentVisibleHeight(ViewGroup parent){return parent.getHeight()-parent.getPaddingTop()-parent.getPaddingBottom(); }/** * 獲得視圖頂端超出可見區域的孩子視圖總高度 * @param parent * @return */ private int getChildOverHeightOfTop(ViewGroup parent){int val=0; int i=0; while(parent.getChildAt(i).getBottom()<parent.getPaddingTop()){val+=parent.getChildAt(i).getHeight();//如果整個item都在可見區域外,則疊加其高度 i++; }if(parent.getChildAt(i).getTop()<parent.getPaddingTop()){//如果該item只有部分在可見區域外,則疊加其超出部分 val+=parent.getPaddingTop()-parent.getChildAt(i).getTop(); }return val; }private int getChildOverHeightOfTop2(ViewGroup parent,int headVal){int val=0; int i=0; if(headVal>0) i=1;//剔除列表頭 while(parent.getChildAt(i).getBottom()<parent.getPaddingTop()){i++; }if(parent.getChildAt(i).getTop()<parent.getPaddingTop()){//如果該item只有部分在可見區域外,則疊加其超出部分 val+=parent.getPaddingTop()-parent.getChildAt(i).getTop(); }if(headVal>0){//添加表頭的值 if(parent.getChildAt(0).getBottom()<parent.getPaddingTop()){val+=parent.getChildAt(i).getHeight();//如果整個item都在可見區域外,則疊加其高度 } else if(parent.getChildAt(0).getTop()<parent.getPaddingTop()){//如果該item只有部分在可見區域外,則疊加其超出部分 val+=parent.getPaddingTop()-parent.getChildAt(0).getTop(); }}return val; }/** * 獲得所有孩子視圖的總體寬度 * @param parent * @return */ private int getAllChildWidth(ViewGroup parent){int val=0; for(int i=0;i<parent.getChildCount();i++){if(parent.getChildAt(i)!=this)val+=parent.getChildAt(i).getWidth(); }return val; }/** * 獲得父視圖的可見區域寬度 * @param parent * @return */ private int getParentVisibleWidth(ViewGroup parent){return parent.getWidth()-parent.getPaddingLeft()-parent.getPaddingRight(); }/** * 獲得視圖左邊超出可見區域的孩子視圖總寬度 * @param parent * @return */ private int getChildOverWidthOfLeft(ViewGroup parent){int val=0; int i=0; while(parent.getChildAt(i).getRight()<parent.getPaddingLeft()){val+=parent.getChildAt(i).getWidth();//如果整個item都在可見區域外,則疊加其寬度 i++; }if(parent.getChildAt(i).getLeft()<parent.getPaddingLeft()){//如果該item只有部分在可見區域外,則疊加其超出部分 val+=parent.getPaddingLeft()-parent.getChildAt(i).getLeft(); }return val; }private int getChildOverWidthOfLeft2(ViewGroup parent,int headVal){int val=0; int i=0; if(headVal>0) i=1;//剔除列表頭 while(parent.getChildAt(i).getRight()<parent.getPaddingLeft()){i++; }if(parent.getChildAt(i).getLeft()<parent.getPaddingLeft()){//如果該item只有部分在可見區域外,則疊加其超出部分 val+=parent.getPaddingLeft()-parent.getChildAt(i).getLeft(); }if(headVal>0){//添加表頭的值 if(parent.getChildAt(0).getRight()<parent.getPaddingLeft()){val+=parent.getChildAt(0).getWidth();//如果整個item都在可見區域外,則疊加其寬度 } else if(parent.getChildAt(0).getLeft()<parent.getPaddingLeft()){//如果該item只有部分在可見區域外,則疊加其超出部分 val+=parent.getPaddingLeft()-parent.getChildAt(0).getLeft(); }}return val; } }

2.橫向ListView源碼:

package com.hss.os.horizontallistview.history_version; import android.content.Context; import android.database.DataSetObserver; import android.graphics.Rect; import android.os.Build; import android.support.annotation.RequiresApi; import android.util.AttributeSet; import android.util.Log; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.widget.AdapterView; import android.widget.ListAdapter; import android.widget.Scroller; import com.hss.os.horizontallistview.ScrollBar; import java.util.LinkedList; import java.util.Queue; /** * Created by sxyx on 2017/7/6. */ public class HorizontalListView4 extends AdapterView<ListAdapter> {private Queue<View> cacheView = new LinkedList<>();//列表項緩存視圖 private ListAdapter adapter = null; private GestureDetector mGesture; private int firstItemIndex = 0;//顯示的第一個子項的下標 private int lastItemIndex = -1;//顯示的最后的一個子項的下標 private int scrollValue=0;//列表已經發生有效滾動的位移值 private int hasToScrollValue=0;//接下來列表發生滾動所要達到的位移值 private int maxScrollValue=Integer.MAX_VALUE;//列表發生滾動所能達到的最大位移值(這個由最后顯示的列表項決定) private int displayOffset=0;//列表顯示的偏移值(用于矯正列表顯示的所有子項的顯示位置) private Scroller mScroller; private int firstItemLeftEdge=0;//第一個子項的左邊界 private int lastItemRightEdge=0;//最后一個子項的右邊界 private View headView; private View footView; private boolean hasHeadView=false; private boolean hasFootView=false; private boolean canShowInMid=false; private ScrollBar mScrollBar; private int headViewWidth=0;//第一個子項的左邊界 private int footViewWidth=0;//最后一個子項的右邊界 private boolean canShowScrollBar=true;//是否需要顯示滾動條 public HorizontalListView4(Context context) {super(context); init(context); }public HorizontalListView4(Context context, AttributeSet attrs) {super(context, attrs); init(context); }public HorizontalListView4(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr); init(context); }@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)public HorizontalListView4(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes); init(context); }private void init(Context context){mGesture = new GestureDetector(getContext(), mOnGesture); mScroller=new Scroller(context); mScrollBar=new ScrollBar(context); }private void initParams(){mScroller.forceFinished(true);//避免在滑動過程中變換視圖內容時,出現列表無法滾動的情況 removeAllViewsInLayout(); if(adapter!=null&&lastItemIndex<adapter.getCount())hasToScrollValue=scrollValue;//保持顯示位置不變 else hasToScrollValue=0;//滾動到列表頭 scrollValue=0;//列表已經發生有效滾動的位移值 firstItemIndex = 0;//顯示的第一個子項的下標 lastItemIndex = -1;//顯示的最后的一個子項的下標 maxScrollValue=Integer.MAX_VALUE;//列表發生滾動所能達到的最大位移值(這個由最后顯示的列表項決定) displayOffset=0;//列表顯示的偏移值(用于矯正列表顯示的所有子項的顯示位置) firstItemLeftEdge=0;//第一個子項的左邊界 lastItemRightEdge=0;//最后一個子項的右邊界 if(hasHeadView||hasFootView) {if (hasHeadView) {scrollValue = headView.getMeasuredWidth(); headView.layout(0, 0, 0, 0); setHeadView(headView); }if (hasFootView) {footView.layout(0, 0, 0, 0); setFootView(footView); }}else requestLayout(); }private DataSetObserver mDataObserver = new DataSetObserver() {@Override public void onChanged() {//執行Adapter數據改變時的邏輯 initParams(); }@Override public void onInvalidated() {//執行Adapter數據失效時的邏輯 initParams(); }}; @Override public ListAdapter getAdapter() {return adapter; }@Override public void setAdapter(ListAdapter adapter) {if(adapter!=null){adapter.registerDataSetObserver(mDataObserver); }if(this.adapter!=null){this.adapter.unregisterDataSetObserver(mDataObserver); }this.adapter=adapter; requestLayout(); }@Override public View getSelectedView() {return null; }@Override public void setSelection(int i) {}private void addAndMeasureChild(View child, int viewIndex) {LayoutParams params = child.getLayoutParams(); params = params==null ? new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT):params; addViewInLayout(child, viewIndex, params, true); child.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.UNSPECIFIED)); }@Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) {super.onLayout(changed, left, top, right, bottom); //在執行布局之前需要先移除滾動條,以免影響其它視圖的顯示運算 mScrollBar.remove(this); Log.e("","============>>>>>left:"+left+" top:"+top+" right:"+right+" bottom:"+bottom); //需要先布局列表項再根據余下的空間布局列表頭尾 //布局列表項 /* 1.計算這一次整體滾動偏移量 2.根據偏移量提取需要緩存視圖 3.根據偏移量顯示新的列表項 4.根據整體偏移值整頓所有列表項位置 5.計算最大滾動位移值,記錄已經發生有效滾動的位移值 6.根據顯示的最終效果,判斷是否要居中顯示 */ int dx=calculateScrollValue(); removeNonVisibleItems(dx); showListItem(dx); adjustItems(); //布局列表頭、尾 adjustHeadAndFootView(dx); calculateMaxScrollValue(); adjustShow(); if(canShowScrollBar) {//布局完所有的視圖之后添加上滾動條的顯示 addAndMeasureChild(mScrollBar, getChildCount()); if (adapter != null) {mScrollBar.showHorizontal(this, firstItemIndex, lastItemIndex, adapter.getCount(), headViewWidth, footViewWidth); } else {mScrollBar.showHorizontal(this, 0, 0, 0, headViewWidth, footViewWidth); }}//繼續滾動 if(!mScroller.isFinished()){post(new Runnable(){@Override public void run() {requestLayout(); }}); }}/** * 計算這一次整體滾動偏移量 * @return */ private int calculateScrollValue(){int dx=0; if(mScroller.computeScrollOffset()){hasToScrollValue = mScroller.getCurrX(); }if(hasToScrollValue<=0){hasToScrollValue=0; mScroller.forceFinished(true); }if(hasToScrollValue >= maxScrollValue) {hasToScrollValue = maxScrollValue; mScroller.forceFinished(true); }dx=hasToScrollValue-scrollValue; scrollValue=hasToScrollValue; return -dx; }/** * 計算最大滾動值 */ private void calculateMaxScrollValue(){if(getListItemCount()>0) {if(lastItemIndex==adapter.getCount()-1) {//已經顯示了最后一項 if(getChildAt(getChildCount() - 1).getRight()>=getShowEndEdge()) {maxScrollValue = scrollValue + getChildAt(getChildCount() - 1).getRight() - getShowEndEdge(); }else{maxScrollValue=0; }}}else{if(adapter!=null&&adapter.getCount()>0){}else {if (getChildCount() > 0 && getChildAt(getChildCount() - 1).getRight() >= getShowEndEdge()) {maxScrollValue = scrollValue + getChildAt(getChildCount() - 1).getRight() - getShowEndEdge(); } else {maxScrollValue = 0; }}}}/** * 根據偏移量提取需要緩存視圖 * @param dx */ private void removeNonVisibleItems(int dx) {if(getListItemCount()>0) {//移除列表頭 View child = getChildAt(getStartItemIndex()); while (getListItemCount()>0&&child != null && child.getRight() + dx <= getShowStartEdge()) {displayOffset += child.getMeasuredWidth(); cacheView.offer(child); removeViewInLayout(child); firstItemIndex++; child = getChildAt(getStartItemIndex()); }//移除列表尾 child = getChildAt(getEndItemIndex()); while (getListItemCount()>0&&child != null && child.getLeft() + dx >= getShowEndEdge()) {cacheView.offer(child); removeViewInLayout(child); lastItemIndex--; child = getChildAt(getEndItemIndex()); }}}/** * 根據偏移量顯示新的列表項 * @param dx */ private void showListItem(int dx) {if(adapter==null)return; int firstItemEdge = getFirstItemLeftEdge()+dx; int lastItemEdge = getLastItemRightEdge()+dx; displayOffset+=dx;//計算偏移量 //顯示列表頭視圖 while(firstItemEdge > getShowStartEdge() && firstItemIndex-1 >= 0) {firstItemIndex--;//往前顯示一個列表項 View child = adapter.getView(firstItemIndex, cacheView.poll(), this); addAndMeasureChild(child, getStartItemIndex()); firstItemEdge -= child.getMeasuredWidth(); displayOffset -= child.getMeasuredWidth(); }//顯示列表未視圖 while(lastItemEdge < getShowEndEdge() && lastItemIndex+1 < adapter.getCount()) {lastItemIndex++;//往后顯示一個列表項 View child = adapter.getView(lastItemIndex, cacheView.poll(), this); addAndMeasureChild(child, getEndItemIndex()+1); lastItemEdge += child.getMeasuredWidth(); }}/** * 調整各個item的位置 */ private void adjustItems() {if(getListItemCount() > 0){int left = displayOffset+getShowStartEdge(); int top = getPaddingTop(); int endIndex = getEndItemIndex(); int startIndex = getStartItemIndex(); int childWidth,childHeight; for(int i=startIndex;i<=endIndex;i++){View child = getChildAt(i); childWidth = child.getMeasuredWidth(); childHeight = child.getMeasuredHeight(); child.layout(left, top, left + childWidth, top + childHeight); left += childWidth; }firstItemLeftEdge=getChildAt(getStartItemIndex()).getLeft(); lastItemRightEdge=getChildAt(getEndItemIndex()).getRight(); }}/** * 調整列表頭、尾 */ private void adjustHeadAndFootView(int dx){headViewWidth=footViewWidth=0; if(hasHeadView){int left,right; if(getListItemCount()>0){right=firstItemLeftEdge; }else{if(headView.getRight()>0)right=headView.getRight()+dx; else right=getShowStartEdge()+headView.getMeasuredWidth(); }left=right-headView.getMeasuredWidth(); headView.layout(left, getPaddingTop(), right, headView.getMeasuredHeight()+getPaddingTop()); headViewWidth=headView.getMeasuredWidth(); }if(hasFootView){int left,right; if(getListItemCount()>0){left=getChildAt(getEndItemIndex()).getRight(); }else{if(hasHeadView)left=headView.getRight(); else {if(footView.getLeft()==0&&dx==0){//第一次賦值 left=getShowStartEdge(); }else{left=footView.getLeft()+dx; }}}right=left+footView.getMeasuredWidth(); footView.layout(left, getPaddingTop(), right, footView.getMeasuredHeight()+getPaddingTop()); footViewWidth=footView.getMeasuredWidth(); }}private void adjustShow(){if(isCanShowInMid()){//可以居中顯示 int endEdge=getShowEndEdge(); boolean canAdjust=false; if(hasFootView){if(footView.getRight()<endEdge) canAdjust=true; }else if(getListItemCount()>0){if(getChildAt(getEndItemIndex()).getRight()<endEdge) canAdjust=true; }else if(hasHeadView){if(headView.getRight()<endEdge) canAdjust=true; }if(canAdjust){//居中顯示 int itemsWidth=getChildAt(getChildCount()-1).getRight()-getShowStartEdge(); int left=(getShowWidth()-itemsWidth)/2+getShowStartEdge(); int right; View child; for(int i=0;i<getChildCount();i++){child= getChildAt(i); right=left+child.getMeasuredWidth(); child.layout(left,child.getTop(),right,child.getBottom()); left=right; }}}}//以下八個方法為概念性封裝方法,有助于往后的擴展和維護 /** * 獲得列表視圖中item View的總數 * @return */ private int getListItemCount(){int itemCount=getChildCount(); if(hasHeadView)itemCount-=1; if(hasFootView)itemCount-=1; return itemCount; }/** * 獲得列表視圖中第一個item View下標 * @return */ private int getStartItemIndex(){if(hasHeadView) return 1; return 0; }/** * 獲得列表視圖中最后一個item View下標 * @return */ private int getEndItemIndex(){if(hasFootView) return getChildCount()-2; return getChildCount()-1; }/** * 獲得列表視圖中第一個item View左邊界值 * @return */ private int getFirstItemLeftEdge(){if(getListItemCount()>0) {return firstItemLeftEdge; }else{if(hasHeadView) return headView.getRight(); else return 0; }}/** * 獲得列表視圖中最后一個item View右邊界值 * @return */ private int getLastItemRightEdge(){if(getListItemCount()>0) {return lastItemRightEdge; }else{if(hasFootView) return footView.getLeft(); else return 0; }}/** * 取得視圖可見區域的左邊界 * @return */ private int getShowStartEdge(){return getPaddingLeft(); }/** * 取得視圖可見區域的右邊界 * @return */ private int getShowEndEdge(){return getWidth()-getPaddingRight(); }/** * 取得視圖可見區域的寬度 * @return */ private int getShowWidth(){return getWidth()-getPaddingLeft()-getPaddingRight(); }public void setHeadView(View view){if(view!=null) {int headRight=-1; int width=0; if (hasHeadView&&headView!=null) {headRight=headView.getRight(); width=headView.getWidth(); removeViewInLayout(headView); }hasHeadView = true; headView=view; addAndMeasureChild(headView, 0); if(getListItemCount()>0) {//有列表內容 if (headRight == -1) {//新增列表頭 if (firstItemIndex == 0) {//第一個顯示的是第一個列表項 //滾動整個列表,讓其顯示完整列表頭(讓列表往回滾) scrollValue = headView.getMeasuredWidth()+ getShowStartEdge() - firstItemLeftEdge; hasToScrollValue=0; } else {//不是顯示第一個列表項 //不滾動列表項,增加歷史滾動值 hasToScrollValue += headView.getMeasuredWidth(); scrollValue = hasToScrollValue; }} else {//替換列表頭 hasToScrollValue += headView.getMeasuredWidth()-width; }}maxScrollValue=Integer.MAX_VALUE; requestLayout(); }}public void removeHeadView(){if(hasHeadView&&headView!=null){hasHeadView=false; int left=headView.getLeft(); int width=headView.getMeasuredWidth(); removeViewInLayout(headView); if(headView.getRight()>=getShowStartEdge()) {//列表頭有顯示 scrollValue = -(width+left-getShowStartEdge()); hasToScrollValue=0; }else{scrollValue-=width; hasToScrollValue-=width; }requestLayout(); }else{hasHeadView=false; }}public void setFootView(View view){if(view!=null) {if (hasFootView&&footView!=null) {removeViewInLayout(footView); }hasFootView=true; footView=view; addAndMeasureChild(footView, -1); requestLayout(); }}public void removeFootView(){if(hasFootView&&footView!=null){hasFootView=false; int left=footView.getLeft(); removeViewInLayout(footView); if(left<getWidth()) {hasToScrollValue -= getWidth()-left-getShowStartEdge(); }requestLayout(); }else{hasFootView=false; }}/** * 在onTouchEvent處理事件,讓子視圖優先消費事件 * @param event * @return */ @Override public boolean onTouchEvent(MotionEvent event) {return mGesture.onTouchEvent(event); }private GestureDetector.OnGestureListener mOnGesture = new GestureDetector.SimpleOnGestureListener() {@Override public boolean onDown(MotionEvent e) {mScroller.forceFinished(true);//點擊時停止滾動 return true; }@Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {mScroller.fling(hasToScrollValue, 0, (int)-velocityX, 0, 0, maxScrollValue, 0, 0); requestLayout(); return true; }@Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {synchronized(HorizontalListView4.this){hasToScrollValue += (int)distanceX; }requestLayout(); return true; }@Override public boolean onSingleTapConfirmed(MotionEvent e) {for(int i=0;i<getChildCount();i++){View child = getChildAt(i); if (isEventWithinView(e, child)) {if(hasHeadView&&i==0){//點擊列表頭 }else if(hasFootView&&i==getChildCount()-1){//點擊列表尾 }else {int position=firstItemIndex + i; if(hasHeadView) position--; if (getOnItemClickListener() != null) {getOnItemClickListener().onItemClick(HorizontalListView4.this, child, position, adapter.getItemId(position)); }if (getOnItemSelectedListener() != null) {getOnItemSelectedListener().onItemSelected(HorizontalListView4.this, child, position, adapter.getItemId(position)); }}break; }}return true; }@Override public void onLongPress(MotionEvent e) {int childCount = getChildCount(); for (int i = 0; i < childCount; i++) {View child = getChildAt(i); if (isEventWithinView(e, child)) {if(hasHeadView&&i==0){//點擊列表頭 }else if(hasFootView&&i==getChildCount()-1){//點擊列表尾 }else {int position=firstItemIndex + i; if(hasHeadView) position--; if (getOnItemLongClickListener() != null) {getOnItemLongClickListener().onItemLongClick(HorizontalListView4.this, child, position, adapter.getItemId(position)); }}break; }}}private boolean isEventWithinView(MotionEvent e, View child) {Rect viewRect = new Rect(); int[] childPosition = new int[2]; child.getLocationOnScreen(childPosition); int left = childPosition[0]; int right = left + child.getWidth(); int top = childPosition[1]; int bottom = top + child.getHeight(); viewRect.set(left, top, right, bottom); return viewRect.contains((int) e.getRawX(), (int) e.getRawY()); }}; public synchronized void scrollTo(int x) {mScroller.startScroll(hasToScrollValue, 0, x - hasToScrollValue, 0); requestLayout(); }public boolean isCanShowInMid() {return canShowInMid; }public void setCanShowInMid(boolean canShowInMid) {this.canShowInMid = canShowInMid; }public boolean isCanShowScrollBar() {return canShowScrollBar; }public void setCanShowScrollBar(boolean canShowScrollBar) {this.canShowScrollBar = canShowScrollBar; } }

?

滾動條的實現思路:

????1.計算橫向ListView可見區域的寬度

????2.計算整個橫向ListView中所有數據都顯示時的視圖寬度(即理論上整個列表應該有的寬度)

????????在計算這個值時,我分為兩個方向考慮;一個是已經顯示完所有的數據時的整個列表的寬度,這時是采用實際的顯示值計算的;另一個正好相反,這時采用的是模糊算法,即通過已經顯示的視圖的值估量顯示完所有的item時應該具備的值(理論值)。

????3.計算出左邊不可見的部分理論上應該有的寬度

????????這個值計算也是同步驟2,具體實現請看源碼,源碼中已經有相當的注解了

????4.根據比例計算出當前滾動條的顯示寬度及顯示位置(即width和left的值)

????5.將滾動條控件組合到橫向ListView中,同時設置顯示開關

????????這一步值得注意一點:為了不影響橫向ListView之前版本的源碼邏輯,在每次布局時都需要先去除滾動條,等所有控件布局完畢再重新加入滾動條;還有一點,在去除滾動條之前先停止滾動條中的動畫操作,如果沒有停止,則后續的動畫執行就會有問題,涉及代碼如下:

/** * 將滾動條從父布局中移除 * 必須調用這個方法執行移除操作,否則動畫執行會有問題 * @param parent */ public void remove(ViewGroup parent){handler.removeMessages(0); //必須在從父布局中移除之前調用clearAnimation(),否則之后的動畫執行會有問題 clearAnimation(); parent.removeViewInLayout(this); }

?

?

?

?

轉載于:https://my.oschina.net/u/3614895/blog/1505495

總結

以上是生活随笔為你收集整理的横向ListView(四) —— 添加滚动条的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

国产免费观看av | 亚洲在线免费视频 | 天天天色综合a | 免费看一级特黄a大片 | 亚洲精品视频免费在线观看 | 91成人在线观看喷潮 | 午夜电影中文字幕 | 狠狠色丁香久久婷婷综合五月 | 在线精品亚洲 | 久久99亚洲精品久久 | 成人av网站在线播放 | 久久久久久久18 | 久久9999久久免费精品国产 | 亚洲精品美女在线观看 | 色婷在线 | 亚洲精品视频在线播放 | 免费观看91视频 | 久久高清免费视频 | 亚洲狠狠 | 91九色视频在线观看 | 精品在线观看一区二区三区 | 波多野结衣小视频 | 丁香六月网 | 在线看小早川怜子av | 麻豆国产精品视频 | av色影院 | 在线看黄色的网站 | 久久伊人国产精品 | 99在线观看视频 | 我要色综合天天 | 美女黄频| 国产精品久久久久一区二区国产 | 狠狠躁日日躁狂躁夜夜躁 | 国产精品久久一区二区三区不卡 | 丁香花在线视频观看免费 | 亚洲国产精品500在线观看 | 狠狠狠狠狠狠干 | 黄色免费视频在线观看 | 免费能看的av | 蜜臀精品久久久久久蜜臀 | 干亚洲少妇 | 日日干天天 | 少妇bbw搡bbbb搡bbbb | 日韩国产精品久久久久久亚洲 | 久久免费国产视频 | 国产v在线 | 六月丁香在线观看 | 永久免费视频国产 | 高清不卡毛片 | 国产麻豆成人传媒免费观看 | 国产一区二区三区网站 | 成年人免费在线观看网站 | 欧美一区二区三区四区夜夜大片 | 国产欧美日韩一区 | 亚洲人人网 | 亚洲综合婷婷 | 亚洲美女久久 | 黄色小说网站在线 | 一区二区三区手机在线观看 | 国产亚洲精品无 | 日本中文字幕系列 | 一本一道久久a久久综合蜜桃 | 天天爽网站 | 国产97av| 久久手机视频 | 久草综合在线观看 | 91高清免费在线观看 | 综合黄色网| 精品一区二区免费视频 | 国产一级二级视频 | 国产成人精品久 | 午夜视频导航 | 亚洲在线不卡 | 亚洲欧洲精品一区二区 | 精品久久久久久久久久 | 亚洲精品综合一区二区 | 99婷婷狠狠成为人免费视频 | 91福利免费 | 黄色a一级片 | 国色天香第二季 | 久久在线视频精品 | japanesexxxxfreehd乱熟 | 91pony九色丨交换 | 久久精品a | a久久久久 | av成人免费在线 | 男女精品久久 | 韩国精品在线 | 激情视频一区二区 | v片在线播放 | 久久精品国产第一区二区三区 | 久久国产精品免费一区 | 日韩字幕 | aa级黄色大片 | 又色又爽又黄高潮的免费视频 | 亚洲a色 | 91看片在线 | 97国产情侣爱久久免费观看 | 青青久视频 | 午夜骚影 | 九九热精品视频在线观看 | 国产精品久久久久久久久久久久午夜 | 久久优| 日韩精品免费在线视频 | 18久久久 | 国产一级在线看 | 成人网中文字幕 | 探花视频免费观看高清视频 | 亚洲日本va午夜在线影院 | 波多野结衣在线播放一区 | av黄网站| 五月天久久久久 | 99热国内精品 | 中文字幕在线观看不卡 | 亚洲午夜久久久久久久久久久 | 日韩在线观看中文 | 丁香五月亚洲综合在线 | 成人免费视频网站在线观看 | 国产黄色免费在线观看 | 亚洲三级在线免费观看 | 欧美另类高清 | 狠狠狠狠狠操 | 成人av免费在线播放 | 亚洲精品久 | 999久久久免费视频 午夜国产在线观看 | 免费成人在线观看视频 | 色偷偷88888欧美精品久久 | 天天插天天爱 | 久久精品直播 | 日韩精品第1页 | 精品国产免费一区二区三区五区 | 久久国产精品系列 | 欧美色图亚洲图片 | 青草视频在线免费 | 亚洲精品综合在线观看 | 国产精品毛片一区二区在线 | 日本久久精 | 中文字幕黄网 | 黄色小网站在线 | 国产精品美女久久久久久2018 | 高清视频一区二区三区 | 草莓视频在线观看免费观看 | 欧美性猛片| 麻豆一区在线观看 | 五月天婷婷丁香花 | 精品亚洲视频在线观看 | 亚洲欧美在线综合 | 中文字幕一区二区三区乱码在线 | 果冻av在线 | 中文字幕在线资源 | 国产精品久久久久aaaa九色 | 最近高清中文字幕在线国语5 | 性色av免费观看 | 日韩精品一区二区三区免费观看 | 欧美乱码精品一区二区 | 在线观看中文字幕2021 | 久久综合久久88 | 99热这里只有精品久久 | 18久久久 | 91麻豆精品国产91久久久无限制版 | 亚洲欧洲国产精品 | 欧美性生交大片免网 | 天天干天天想 | 天天干天天干天天干 | 亚洲三级视频 | 中文字幕 91 | 一区二区三区国产精品 | 日韩特黄av | 午夜电影av | 天无日天天操天天干 | 国产精品99久久久久久久久 | 狠狠干网 | av成人免费网站 | 97精品国产 | 午夜精品三区 | 国产韩国日本高清视频 | 午夜久久网站 | 国产精品a成v人在线播放 | 99精品在线视频播放 | 色夜影院 | 国产一区免费视频 | 亚洲最大av | 91最新中文字幕 | 91亚·色 | 日韩av一区二区在线播放 | 欧美日韩精品在线 | 91精品爽啪蜜夜国产在线播放 | 国产色女人 | 五月香视频在线观看 | 日韩免费在线看 | 高清av在线免费观看 | 日韩黄色大片在线观看 | 亚洲激情一区二区三区 | 色com| 亚洲精品av中文字幕在线在线 | 日韩在线精品一区 | 中文字幕在线播放视频 | 久一在线 | 欧美成人tv | 69视频在线播放 | 国产精品第54页 | 黄色大全免费网站 | 国产精品 日本 | 免费人做人爱www的视 | 夜夜操天天 | 日本在线视频网址 | 亚洲一区二区精品3399 | 国产在线色 | av 一区二区三区四区 | 美女黄濒 | 国产最新精品视频 | 国产黄色理论片 | 久久人人爽人人爽人人片av免费 | 中文在线a∨在线 | 人人爽人人澡人人添人人人人 | a级成人毛片| 91av电影在线观看 | 99精品久久只有精品 | 国产日女人 | 99热超碰 | 91九色精品 | 亚洲理论在线观看电影 | 天天射天天艹 | 国产高清在线a视频大全 | 97成人资源 | 五月天欧美精品 | 成人动漫视频在线 | 97麻豆视频| 色噜噜在线观看视频 | 视频一区二区视频 | 久久国产露脸精品国产 | 久久综合影院 | 中文字幕免费一区二区 | 精品国产一区二区三区日日嗨 | 免费大片黄在线 | 激情综合狠狠 | 日韩高清在线一区 | 国产精品久久在线观看 | 久久经典视频 | 麻豆国产精品一区二区三区 | 99激情网 | 视频三区| 天堂在线一区 | 天天操天天射天天添 | 日韩精品一区二 | 天天干天天弄 | 国产91在 | av在线官网| 久久精品久久久精品美女 | 综合色影院 | 一本一本久久a久久 | 午夜在线观看 | japanese黑人亚洲人4k | 精品主播网红福利资源观看 | 国产99在线播放 | 欧美性生活大片 | 成人午夜在线观看 | 99久久久国产精品美女 | 久久高清av | 久久国产精品99久久久久久进口 | 久热国产视频 | 日韩一区二区三区免费电影 | 2021国产视频 | av福利网址导航 | 91精品免费 | 97超视频| 操操操人人 | 亚洲动漫在线观看 | 人人爽久久涩噜噜噜网站 | 欧美十八| 欧美激情综合五月 | 欧美最新大片在线看 | 夜色资源站wwwcom | 欧美一区二区精品在线 | 国产精品美女免费视频 | 亚洲国产一二三 | 国产精品手机看片 | 人人爽人人爽人人爽学生一级 | 国产在线观看你懂得 | 亚洲精品www久久久 www国产精品com | 五月天久久综合网 | 色婷婷天天干 | 激情视频网页 | 国产一区二区在线免费 | av视屏在线播放 | 亚洲高清av在线 | 国产免费三级在线观看 | 九色精品免费永久在线 | 九九精品视频在线观看 | 91在线资源 | 国产成人一区二区在线观看 | www国产亚洲 | 精品久久网站 | 免费高清在线视频一区· | 国产成人精品一区二三区 | 黄网站app在线观看免费视频 | 免费人成在线观看网站 | 亚洲黄网站 | 99热手机在线| 日韩欧美一区二区三区在线观看 | 黄色av一级片 | 好看的国产精品视频 | 国产超碰在线观看 | 欧美亚洲成人xxx | 亚洲伊人成综合网 | 激情综合五月天 | 国产直播av| 91精选在线观看 | 九月婷婷人人澡人人添人人爽 | 四虎国产精 | 国产精品免费大片视频 | 97免费中文视频在线观看 | 久久久久久久国产精品影院 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 天天天干天天射天天天操 | 国产综合精品一区二区三区 | 蜜桃视频日本 | 成人av直播 | 91大神精品视频在线观看 | 亚洲黄色一级大片 | 不卡的av中文字幕 | 国产精品一区二区免费在线观看 | 日日夜夜精品视频天天综合网 | 成人免费观看av | 天天干天天射天天插 | 欧美日韩不卡在线视频 | 黄在线 | 97成人精品 | 777xxx欧美 | 久久国产精品第一页 | 欧洲亚洲精品 | 国产精品不卡在线播放 | 国产a级片免费观看 | 91九色国产蝌蚪 | 国产精品免费不卡 | 免费网址你懂的 | 公与妇乱理三级xxx 在线观看视频在线观看 | 久久国产成人午夜av影院潦草 | 天天看天天干天天操 | 一区二区理论片 | 日本动漫做毛片一区二区 | 日韩网站一区二区 | 久久亚洲免费视频 | 久久精品aaa | 欧美国产精品久久久久久免费 | 欧美激情精品久久久久久变态 | 中文字幕在线第一页 | 日韩天天干 | 中文字幕av在线播放 | 97超碰在线久草超碰在线观看 | 亚洲精品国产麻豆 | 91亚洲欧美激情 | 久久亚洲福利视频 | 色婷婷综合视频在线观看 | 色的网站在线观看 | 欧美人操人 | 伊人五月天av | av色综合| 深爱激情av | 日韩av女优视频 | 久久免费试看 | 亚色视频在线观看 | 国产精品久久久久久久久大全 | 欧美色黄 | 欧美色888 | 91试看 | 婷婷色网| 亚洲欧美在线观看视频 | 精品免费在线视频 | 成年人免费电影在线观看 | 日本少妇久久久 | 中文在线字幕免费观 | 一区二区免费不卡在线 | 特级西西444www大精品视频免费看 | 五月天免费网站 | 中文字幕在线字幕中文 | 色视频在线看 | 色综合久久悠悠 | 欧美日韩网站 | 亚洲国产三级在线观看 | 91成熟丰满女人少妇 | 成人毛片在线视频 | 一级成人免费 | 亚洲妇女av | 中文字幕a∨在线乱码免费看 | 中文字幕亚洲在线观看 | 日本公妇色中文字幕 | 91完整版观看 | 成 人 黄 色 视频 免费观看 | 午夜久久网站 | 在线观看爱爱视频 | 成年人电影免费看 | 成年人免费看片 | 日韩中文字幕亚洲一区二区va在线 | a国产精品 | 国产精品毛片一区二区三区 | 日韩高清毛片 | 亚洲成人av在线电影 | 成人a级网站 | 91字幕 | 久久久久www | 亚洲欧美日韩精品久久奇米一区 | а天堂中文最新一区二区三区 | 日韩欧美在线综合网 | 久久久久欠精品国产毛片国产毛生 | 亚洲欧美色婷婷 | 久久精品99久久 | 日精品在线观看 | 精品视频在线播放 | 天天爽天天搞 | 97福利| 日韩av线观看 | 99国产精品视频免费观看一公开 | 国产精品一区二区久久久 | 国产精品亚洲片夜色在线 | 中文字幕在线观看完整版电影 | 久久精品婷婷 | av不卡免费在线观看 | 亚洲综合狠狠干 | 射久久 | 丁香五香天综合情 | 久久精品久久精品久久39 | 欧美日韩高清一区二区三区 | 一区二区三区在线观看免费 | 亚洲精品乱码久久久久久蜜桃欧美 | 九九热免费在线视频 | 国产精品免费av | 三级黄色理论片 | 99久久久久久久 | 久久成人亚洲欧美电影 | av 在线观看| 在线观看a视频 | 国产精品久久久久久久久大全 | 国内精品久久久久久久 | 狠狠干中文字幕 | 91视频啊啊啊 | 五月天综合色激情 | 亚洲精品在线看 | 久久精品国产精品亚洲 | 天天天天色射综合 | av成人动漫 | 999男人的天堂 | 久久精品最新 | 亚洲欧美日韩在线一区二区 | 国产男女无遮挡猛进猛出在线观看 | 午夜精品久久久久久久久久久久 | 久久成人国产精品一区二区 | 99久久精品无码一区二区毛片 | 超碰成人av | 亚洲黄色小说网 | 亚洲乱码中文字幕综合 | 国产又粗又猛又黄又爽视频 | 国产精品永久久久久久久www | 在线观看精品视频 | 日韩欧美在线观看一区 | 人人精品| 91超级碰 | 视频在线观看91 | 中文字幕av最新更新 | 在线亚洲成人 | 又黄又爽又湿又无遮挡的在线视频 | 久久国产美女 | 91福利社区在线观看 | 亚洲美女在线国产 | 免费99精品国产自在在线 | 久久久免费播放 | 亚洲国产美女精品久久久久∴ | 中文字幕人成人 | 三上悠亚一区二区在线观看 | 色综合人人 | 亚洲欧美视屏 | 国产精品一区二区三区视频免费 | 国产精品99久久久 | 亚洲精品观看 | 色婷婷综合视频在线观看 | 久久精品79国产精品 | 亚洲欧美国产精品va在线观看 | 亚洲精品乱码久久久久久 | 91在线看片 | 特级毛片网站 | 国产 欧美 在线 | 国产资源网| 亚洲网站在线看 | 久久伊人91 | 亚洲欧美国产精品 | 亚洲精品乱码久久久久久高潮 | 欧美在线一级片 | 伊人色播 | 亚洲视频,欧洲视频 | 久久av免费 | 久久精品国产一区 | 黄色国产成人 | 免费亚洲精品 | 天天操夜夜叫 | 欧美精品免费在线观看 | 国产精品亚洲片夜色在线 | 天无日天天操天天干 | 色欧美综合 | 成人av电影免费在线观看 | 1024久久| 久久国产精品一国产精品 | 天天干夜夜爱 | 狠狠色丁香婷婷综合最新地址 | 五月宗合网 | 色婷婷激情五月 | 91精品久久久久久综合五月天 | 国产人成看黄久久久久久久久 | 又污又黄网站 | 91爱看片 | 日韩精品第1页 | 亚洲国产字幕 | 欧美日韩亚洲国产一区 | 一个色综合网站 | 中文字幕字幕中文 | 亚洲综合成人专区片 | 日本性xxxxx| 免费a一级 | 久久影视精品 | 久久精品精品电影网 | 久久兔费看a级 | 国产一级二级三级在线观看 | 国产日韩欧美在线观看视频 | 激情网五月 | 中文字幕在线免费看线人 | 亚洲视频2 | 五月婷婷丁香综合 | 狠狠狠色丁香婷婷综合激情 | 人人网人人爽 | 国产日韩欧美在线一区 | 中文字幕在线播放av | 久久99久久99精品 | 国产18精品乱码免费看 | 午夜精品久久久久久久久久久 | 成人免费一区二区三区在线观看 | 麻豆精品91| 亚洲国产日韩精品 | 在线国产99 | 在线免费观看不卡av | 国产丝袜高跟 | 国产精品一区二区三区电影 | 亚洲精品在线一区二区三区 | 日p视频 | 中文字幕久久网 | 色综合天天做天天爱 | 午夜色性片 | 日本中文字幕在线一区 | 国产中文字幕一区二区三区 | 国内成人精品视频 | 在线国产精品视频 | 国产精品久久久久久久毛片 | 久久精品精品电影网 | 狠狠干婷婷 | 日韩在线观看中文 | 久久草av | 一级黄色片在线 | 色综合久久久久久中文网 | 激情视频国产 | 992tv在线成人免费观看 | 99精品久久久久 | 色九九在线 | 日韩免费视频在线观看 | 国产视频在线播放 | 中文字幕在线观看不卡 | 国产精品 日韩 欧美 | 五月天综合激情网 | 97成人啪啪网 | 国产精品久久久久久久久久99 | 国产日韩欧美综合在线 | 欧美激情精品久久久久久 | 亚洲伊人av | 99色国产 | 福利视频区 | 午夜精品福利影院 | 国产 视频 高清 免费 | 色婷婷综合久久久中文字幕 | 日日综合网 | 亚洲激情中文 | 在线你懂| 天天综合入口 | av福利网址导航 | 亚洲天堂自拍视频 | 波多野结衣综合网 | 国产精品小视频网站 | 国产视频一区二区在线观看 | 午夜婷婷在线播放 | 国产黄色免费看 | 在线视频日韩一区 | 久久精品韩国 | 精品一区 在线 | 在线日本看片免费人成视久网 | 欧美 高跟鞋交 xxxxhd | 国产精品久久毛片 | 97人人模人人爽人人少妇 | 国产精品日韩久久久久 | 人人爽人人av | 66av99精品福利视频在线 | 91丨九色丨国产在线观看 | 久久国产精品久久精品国产演员表 | 精品伊人久久久 | 久久免费视频1 | 国产视频在线观看免费 | 在线看欧美 | 国产精品99精品久久免费 | 亚洲人在线 | 国内精品久久久久久久久久 | 韩国精品一区二区三区六区色诱 | 日韩伦理片一区二区三区 | 成人黄色小说网 | 日韩精品视频免费专区在线播放 | 免费成人在线视频网站 | 五月婷婷开心 | 激情丁香月 | 99久久精品免费 | 国产视频每日更新 | 免费视频xnxx com | 国产精品24小时在线观看 | 久久这里只有精品视频首页 | 天天干夜夜夜操天 | 五月婷婷伊人网 | 国产一级特黄毛片在线毛片 | 91麻豆国产 | 免费久久久久久久 | 国产麻豆精品一区二区 | 国产一级免费在线观看 | 综合婷婷| 日本一区二区高清不卡 | 丰满少妇一级片 | 成人aaa毛片 | 麻豆一区在线观看 | 特级西西www44高清大胆图片 | 日韩av网站在线播放 | 五月天婷婷狠狠 | 特级毛片在线免费观看 | av播放在线 | 国产成人精品999 | 亚洲精品国精品久久99热 | 激情五月***国产精品 | 国产精品亚州 | 99久久精品国产观看 | 国产精品女人久久久 | 一区二区三区久久 | 国产毛片久久久 | 99热在线精品观看 | 伊人国产女 | 中文字幕日韩高清 | 丰满少妇久久久 | 麻花天美星空视频 | 在线观看av免费观看 | 最近中文字幕视频完整版 | 国产亚洲视频在线观看 | 免费在线观看av网站 | 91在线免费播放视频 | 99精品成人| 综合色站导航 | 911久久香蕉国产线看观看 | 亚洲国内精品在线 | 美女黄色网在线播放 | 欧美成人精品欧美一级乱 | 国产精品久久久久永久免费观看 | 亚洲精品中文字幕视频 | 日韩欧美在线播放 | 黄色成人在线网站 | 色播五月婷婷 | 99精品免费网 | 国产福利免费在线观看 | 色成人亚洲网 | 一二三精品视频 | 久久新 | 国产精品久久人 | 三级在线视频观看 | 美女视频国产 | av手机版| 97av色| 九九热中文字幕 | 91精品办公室少妇高潮对白 | 狠狠干夜夜| 久久精品99久久 | 亚洲精品资源 | 天天干天天干天天色 | 久久国产福利 | 久久综合九色欧美综合狠狠 | 日韩试看 | 99九九免费视频 | 国产精品一区免费看8c0m | 激情欧美一区二区免费视频 | 日韩在线观看影院 | 国产精品久久婷婷六月丁香 | 在线看小早川怜子av | 国产精品黄 | 91黄色免费看 | 天天艹天天操 | 免费三级骚 | 欧美精品久久久久性色 | 久久这里| 丁香六月婷婷综合 | 热久久最新地址 | av免费在线观看1 | 日韩精品电影在线播放 | 久久国产精品一国产精品 | 91亚洲国产成人久久精品网站 | 黄色在线看网站 | 中文字幕在线看视频 | 国产黄色在线 | 成人午夜免费剧场 | 久久电影国产免费久久电影 | 欧美激情精品 | 在线色亚洲 | 欧美日韩一二三四区 | 美女视频久久久 | 人人草人 | 色综合天天干 | 久久久精品久久 | 91丨九色丨国产在线 | 四虎国产精品免费 | 久久你懂的 | 夜夜夜影院 | 日韩欧美在线观看一区 | www.亚洲视频 | 色视频成人在线观看免 | 亚洲国产成人精品电影在线观看 | 少妇性色午夜淫片aaaze | 久久久久久久久久网 | 日韩欧美有码在线 | 99久久婷婷国产精品综合 | av三级在线看| 日韩大陆欧美高清视频区 | 久久综合丁香 | 91久久精| 久久久www免费电影网 | 天天操天天射天天插 | 97夜夜澡人人双人人人喊 | 伊人激情网| 久久久久久久国产精品视频 | 久久综合激情 | 久久精品视频在线 | 欧美一区影院 | 成人啊 v | www好男人| 欧美激情精品久久久久久 | a精品视频 | av高清在线观看 | 精品久久久影院 | 91精品免费在线 | 国产成人精品一区二区三区在线 | www.99av| 国产视频导航 | 亚洲日韩欧美视频 | 亚洲资源片 | av色影院 | 婷婷在线资源 | 青青草国产成人99久久 | 免费看黄在线网站 | 在线看国产一区 | 欧美极品一区二区三区 | 中文伊人 | 国产高清中文字幕 | 狠狠干综合 | 久操免费视频 | 久久免费视频一区 | 色五丁香| 久久ww| 国产精品美女在线观看 | 日本黄色免费播放 | 91在线视频免费 | 亚洲国产精品小视频 | www久久国产 | 99在线视频精品 | 久久精品婷婷 | 天天操天天摸天天干 | 国产成人a亚洲精品 | 欧美一二三区在线播放 | 奇米影视在线99精品 | 成年人免费在线观看网站 | 久久久久国产精品视频 | 久久少妇免费视频 | 中文字幕日韩国产 | www黄| 91完整版在线观看 | 精品福利视频在线观看 | 国产九九九九九 | 久久视频这里有精品 | 国产精品剧情 | 三级性生活视频 | 97在线免费视频观看 | 视频国产区 | 婷婷五天天在线视频 | 亚洲成人av在线 | 黄av免费 | 91亚洲视频在线观看 | 中文字幕在线观看三区 | 黄色三级免费网址 | 国产精品一区二区久久精品爱微奶 | 久久午夜电影院 | 成人免费xxx在线观看 | 欧美精品久久久久久 | 日韩欧美视频一区二区 | 免费看污在线观看 | av线上免费观看 | 亚洲精品网址在线观看 | 三级性生活视频 | 国产手机视频在线 | 国产123区在线观看 国产精品麻豆91 | 密桃av在线| 久久在线免费观看视频 | 日韩动态视频 | 中文字幕一区二区三区久久 | 国产精品一区二区你懂的 | 亚洲影院色 | 成年人黄色免费网站 | 99se视频在线观看 | 91久久丝袜国产露脸动漫 | 麻豆成人网 | 国产精品资源 | 天天干夜夜夜操天 | 精品一区电影国产 | 99久久久国产免费 | 久av电影 | 日日日视频 | 国产成人精品区 | 欧美日本不卡高清 | 日本三级中文字幕在线观看 | 久久久久久在线观看 | 日韩欧美91 | 国产香蕉97碰碰久久人人 | 日韩欧美在线免费 | 婷婷五天天在线视频 | 国产资源站 | 99精品视频网站 | 狠狠色狠狠色合久久伊人 | 久久99偷拍视频 | 国产福利91精品一区二区三区 | 久久精品com | 欧美性大战久久久久 | 中文av字幕在线观看 | 久青草视频 | 欧美在线a视频 | 米奇狠狠狠888 | 区一区二区三在线观看 | 久久久久国产精品免费免费搜索 | 91热视频 | 欧美激情综合色综合啪啪五月 | 国产精品免费一区二区三区 | 国产精品亚洲片夜色在线 | 久久国产精品久久久 | 久久国产精品区 | 99精品国产在热久久下载 | 麻豆视频免费网站 | 久久人人爽人人爽人人片av免费 | 欧美精品一区二区免费 | 丁香在线观看完整电影视频 | 久久成人高清视频 | 亚洲区另类春色综合小说 | 国产成人黄色av | 国产黄色一级片在线 | 久久精品免费 | av免费观看在线 | 久久中文精品视频 | 97超碰成人在线 | 亚洲五月花| 国产护士hd高朝护士1 | 一级免费av| 97国产大学生情侣酒店的特点 | 手机在线看永久av片免费 | 九九综合九九综合 | 国产精品毛片一区二区三区 | 国模视频一区二区三区 | 在线免费av电影 | 日韩在线观看一区 | 国产黄色精品在线 | 国产精品久久久久一区 | 国产黄色精品在线 | 99久久日韩精品视频免费在线观看 | 444av| 99国产一区二区三精品乱码 | 极品美女被弄高潮视频网站 | 91在线操 | 欧美一级黄色网 | 99久久日韩精品视频免费在线观看 | 免费视频91 | 亚洲人天堂 | 久久网站免费 | 超级碰碰碰免费视频 | 黄色三级在线看 | 亚洲精品视频二区 | 色综合天天 | 日韩区欠美精品av视频 | 九色在线视频 | 久久av网 | 久久国产精品小视频 | 操天天操 | 精品少妇一区二区三区在线 | 亚洲人成综合 | 精品成人免费 | 国产一区二区三区免费观看视频 | 蜜臀久久99静品久久久久久 | 欧美成人按摩 | 天天操狠狠操网站 | 99免费看片| 在线播放第一页 | 亚洲精品国偷自产在线91正片 | 免费黄色av电影 | 日韩av影视 | 青青河边草观看完整版高清 | 超碰av在线免费观看 | 亚洲四虎在线 | 婷婷视频| 日本不卡一区二区三区在线观看 | 国产精品99精品 | 久久久婷 | 亚洲视频免费在线看 | 亚州日韩中文字幕 | 一区二区三区在线免费 | 91av综合 | 国产精品99久久久久久大便 | 欧美日韩在线观看一区二区 | 久久视频在线观看免费 | 伊人超碰在线 | 天天干夜夜爽 | 日韩影视在线观看 | 欧美精品久久久久久久久久久 | 97av影院| 国产精品永久久久久久久www | 国产精品短视频 | 国产97视频 | 免费观看一级 | 国产精品自产拍在线观看网站 | 天天爱天天操天天射 | 日韩电影中文,亚洲精品乱码 | 成人一级片视频 | 久久99精品国产99久久 | 黄色一级免费电影 | www.色午夜 | 国产黄大片在线观看 | 亚洲手机av | 亚洲成人999| 黄色的网站免费看 | 在线色资源 | 激情 婷婷 | 国产精品专区h在线观看 | 天堂网一区 | 四虎在线视频免费观看 | 亚洲国产高清在线 | 成人动漫一区二区三区 | www婷婷| 色五月成人| 在线天堂日本 | 国产亚洲精品久久久久久网站 | 午夜视频在线观看网站 | 又黄又刺激又爽的视频 | 国产成人黄色网址 | 91精品视频网站 | 久久精品影片 | 97偷拍视频 | 网站在线观看日韩 | 欧美精品在线观看免费 | 久久都是精品 | 中文字幕免费观看 | 久久久五月天 | 欧美日韩视频在线观看一区二区 | 超碰97在线资源 | 又黄又爽又刺激 | 中文字幕免费成人 | 久久福利小视频 | 国产亚洲精品bv在线观看 | 人人澡人人爱 | 精品视频 | 在线免费观看不卡av | av一区二区三区在线 | 精品在线观看视频 | 高清免费在线视频 | 亚洲 中文字幕av | 99热精品视 | 五月香视频在线观看 | 一区在线电影 | 91精品一区二区三区蜜桃 | 日韩欧美高清不卡 | 五月天av在线| 欧美在线观看视频 | 亚洲激情小视频 | 日韩理论在线 | 在线观看成人国产 | 中文视频在线 | 伊人天天干 | 香蕉免费在线 | 99久久精品国产一区 | 激情欧美xxxx | 久久艹久久 | 国产不卡网站 | 人人爽影院 | 日韩大陆欧美高清视频区 | av爱干| 国产午夜三级一区二区三桃花影视 | 中文字幕日韩av | 久久 精品一区 | av中文字幕免费在线观看 | 中文字幕成人一区 | 久久免费视频在线观看30 | 国产麻豆精品久久 |