日韩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电影 | 91av在线播放视频 | 久草在| 国产精品精品 | 亚洲五月婷婷 | 国产小视频免费观看 | 韩日在线一区 | av在线播放亚洲 | 国产精品久久久久久久久久妇女 | 视频精品一区二区三区 | 欧美日比视频 | 色综合久久久久 | 一区二区三区韩国免费中文网站 | 黄色毛片在线看 | 国产在线视频不卡 | 天天色官网 | 欧美另类交在线观看 | 亚洲成年人免费网站 | 国产经典av | 久久久久久久久久久久久久电影 | 午夜成人免费影院 | 久久免费视频在线观看6 | 国产大片免费久久 | 五月天九九 | 中文字幕免费久久 | 亚洲黄色av | 国产高清中文字幕 | 欧美亚洲国产一卡 | 在线观看国产福利片 | 国产中文字幕网 | 欧美精品v国产精品v日韩精品 | 国产精品一区一区三区 | 久久人人爽人人爽人人片av免费 | 亚洲高清av在线 | 亚洲激情av | 欧美午夜精品久久久久 | 成人av观看 | 91亚洲国产成人久久精品网站 | 国产精品一区二区久久精品爱微奶 | 成年人免费观看国产 | 国产精品18久久久久久久网站 | 久久综合综合久久综合 | 黄色av网站在线观看免费 | 亚洲精品视频免费 | 可以免费看av | 国产精品热视频 | 久久久网 | 丁香六月国产 | 在线v片 | 99色免费视频 | a级片在线播放 | 亚洲三级视频 | 日韩欧美69 | 国产h在线播放 | 日韩电影一区二区在线观看 | a级片久久| 国产91aaa| 国产超碰在线观看 | 98福利在线| 欧美热久久| 成人香蕉视频 | 中文字幕九九 | av日韩精品 | 日日干日日操 | 国产高清99 | 在线观看黄色大片 | 天天摸天天干天天操天天射 | 91视频88av| 国产传媒一区在线 | 精品日本视频 | 午夜电影久久 | 五月天亚洲精品 | 国产一二三区av | 激情综合狠狠 | 一区二区久久 | 久久久亚洲麻豆日韩精品一区三区 | 99久久精品免费看 | 国产一区二区久久精品 | 久久www免费人成看片高清 | 国产一区二区手机在线观看 | 激情综合中文娱乐网 | 五月开心激情网 | 99精品欧美一区二区三区黑人哦 | 午夜av一区 | 免费看三级黄色片 | 成人av一区二区在线观看 | 久久综合在线 | 99在线观看 | 国产伦精品一区二区三区在线 | 欧美日韩久久不卡 | 欧美成人xxxx | 国产一级h | 91av原创 | 激情网五月天 | 日本精品午夜 | 九九九热精品免费视频观看 | 国产一区二区在线免费播放 | 99精品视频在线观看视频 | 久久综合久久综合这里只有精品 | 在线性视频日韩欧美 | 欧美人体xx | 狠狠狠干狠狠 | 欧美综合色在线图区 | 国产一区视频在线播放 | 成人蜜桃 | 国产视频欧美视频 | 国产精品久久久久久久久久了 | 91精品国| 成人在线你懂得 | 99久久99久国产黄毛片 | 欧美国产日韩在线观看 | 精品亚洲男同gayvideo网站 | 操天天操 | 很黄很色很污的网站 | 日日夜夜天天久久 | 97超级碰| 一区二区三区在线播放 | 亚洲区色 | 中文区中文字幕免费看 | 91麻豆福利 | 福利精品在线 | 久久黄色网址 | 在线视频a| 国产亚洲观看 | 欧美污在线观看 | 成人毛片在线视频 | 欧美最爽乱淫视频播放 | 国产成人精品一区二区在线观看 | 波多野结衣在线视频免费观看 | 国产精品成人久久 | 视频成人永久免费视频 | 亚洲欧美综合精品久久成人 | 国产精品久久久久久久久久久免费 | 日韩有码网站 | 国产h片在线观看 | av免费电影在线观看 | 国产在线a| 在线观看国产中文字幕 | 欧美一区二区三区四区夜夜大片 | 欧美日韩另类在线 | 精品国精品自拍自在线 | 国产精品视频免费看 | 成人a级网站 | av久久久 | 亚洲免费在线观看视频 | 最新av网址在线观看 | 国产精品九九九 | 国产精品21区 | 久久激情电影 | 日韩黄色免费看 | 亚洲精品白浆高清久久久久久 | 久久视讯 | 超碰官网| 在线观看视频你懂得 | 婷婷九九 | 免费看片成年人 | 国产经典 欧美精品 | 免费色网站 | 日日夜夜人人精品 | 久精品视频免费观看2 | 亚洲精品456在线播放乱码 | 91精品视频免费观看 | 久久国产精品一区二区三区四区 | 久久精品国产亚洲精品2020 | 韩国精品一区二区三区六区色诱 | 久久视屏网 | 一区二区三区韩国免费中文网站 | 国产涩涩在线观看 | 很黄很污的视频网站 | 欧美国产日韩一区二区 | 精品国产乱码久久久久久1区2匹 | 日韩精品久久久久久中文字幕8 | 免费观看www7722午夜电影 | 国产精品免费一区二区三区在线观看 | 狠狠干激情 | 99在线视频播放 | 日韩免费在线网站 | 久久国产剧场电影 | 中文字幕在线观看你懂的 | 国产精品婷婷 | 97国产在线播放 | 91精品999| 国产亚洲情侣一区二区无 | 一区二区三区四区在线 | 国产资源精品在线观看 | av在线小说 | 区一区二区三在线观看 | 最近中文字幕大全中文字幕免费 | 中文字幕 欧美性 | 成人欧美一区二区三区黑人麻豆 | 欧美人人 | 麻豆av电影 | www.黄色片网站 | 亚洲三级网站 | 国产精品久久久久一区二区国产 | 在线观看av不卡 | 免费三级影片 | 国产91电影在线观看 | 91视频链接| 九九久久免费 | 欧洲亚洲国产视频 | 色婷婷激情五月 | 在线免费观看视频一区二区三区 | 亚洲午夜精品在线观看 | 天天干天天插伊人网 | 亚洲精品免费在线播放 | 伊人伊成久久人综合网小说 | 高清av影院 | 一区二区日韩av | 在线观看黄色av | 天堂在线免费视频 | 91天堂影院 | 欧美日韩视频在线一区 | 久久精品二区 | 亚洲妇女av | 99视频99 | 91观看视频 | 亚洲国产一区二区精品专区 | 成人超碰在线 | 成年人电影免费看 | 在线视频麻豆 | www.亚洲视频| 中文在线字幕观看电影 | 亚洲精品黄色在线观看 | 日韩电影中文 | 国产又粗又长又硬免费视频 | 在线国产视频一区 | 国产午夜在线观看视频 | 2018亚洲男人天堂 | japanese黑人亚洲人4k | 成人av日韩 | 在线观看激情av | 欧美日韩一区二区三区视频 | 国产二区精品 | 99热999| 中文字幕一区二区三区四区久久 | 国产字幕av | 97超碰人人模人人人爽人人爱 | 欧美国产91| 亚洲人成免费网站 | 亚洲视频2 | 在线观看久久久久久 | 伊人资源视频在线 | 国产精品嫩草影院123 | 日韩在线高清视频 | 国产无套一区二区三区久久 | 色综合久久久久综合99 | 国产 一区二区三区 在线 | 日韩最新av| 国产精品女同一区二区三区久久夜 | 一区二区三区在线免费观看视频 | 成人中文字幕+乱码+中文字幕 | 久久精品久久精品久久精品 | 美女网站在线免费观看 | 日韩在线观看视频一区二区三区 | 99久久精品电影 | 久久手机免费视频 | 午夜色性片 | 欧美日韩裸体免费视频 | 亚洲麻豆精品 | 激情综合网在线观看 | 久久精品久久久精品美女 | 色激情五月 | 久久夜色精品国产欧美乱极品 | 国产亚洲欧美在线视频 | 91精选在线 | 亚洲永久精品国产 | 免费h漫在线观看 | 伊人影院在线观看 | 天天综合色网 | 天天做天天爱天天爽综合网 | 亚洲成人欧美 | 国精产品满18岁在线 | 亚洲伊人天堂 | av成人免费在线 | 国产精品二区在线 | 久久兔费看a级 | 最近高清中文在线字幕在线观看 | 成人久久久久久久久久 | 久久再线视频 | 婷婷av色综合 | 色搞搞| 欧美极度另类性三渗透 | 色婷婷中文 | 成人久久久电影 | 一区二区三区四区精品视频 | 欧美一级视频免费看 | a天堂一码二码专区 | 深夜福利视频在线观看 | 最近最新mv字幕免费观看 | 深夜免费福利网站 | 欧美福利久久 | 国产一级二级在线 | 国产一区二区视频在线 | 国产视频日韩视频欧美视频 | 亚洲国产中文在线观看 | 国产精品欧美久久久久天天影视 | 日韩在线视频在线观看 | 国产一区视频导航 | 久久九九久久精品 | 中文字幕av全部资源www中文字幕在线观看 | 操操操影院 | 国产精品女人久久久久久 | 五月开心婷婷 | 国产精国产精品 | 免费精品在线视频 | 亚洲第一av在线播放 | 色综合 久久精品 | 欧美一级在线观看视频 | 色午夜| 超碰在线94 | 美女国内精品自产拍在线播放 | 天天爽夜夜爽人人爽一区二区 | 日韩精品免费在线 | 久久伊人国产精品 | 97视频免费在线 | 91精品一区在线观看 | 99性视频 | 免费电影一区二区三区 | a在线一区 | 中文字幕日韩一区二区三区不卡 | 国产精品自产拍在线观看桃花 | 久热国产视频 | 国产成人av福利 | 夜夜躁狠狠躁日日躁视频黑人 | 日日爽视频 | 久久男人视频 | 9999激情 | 国产精品日韩欧美一区二区 | 手机在线黄色网址 | 中文字幕4 | 依人成人综合网 | 亚洲视频一区二区三区在线观看 | 国产黄色免费在线观看 | 亚洲一级电影视频 | 中文字幕久久精品亚洲乱码 | 一级免费观看 | 国产一区二区手机在线观看 | 五月天综合激情网 | 五月天婷婷综合 | 国产黄色在线网站 | 在线看一级片 | 婷婷综合av | 亚洲激情精品 | 麻豆一级视频 | 视频高清 | 久久久天堂 | 免费黄色在线网址 | 久久久久久高潮国产精品视 | 丁香激情视频 | 五月天堂网 | 999在线视频| 在线综合色 | 91视频黄色 | 不卡视频一区二区三区 | 国产精品永久久久久久久www | 99精品一区二区 | 97香蕉久久超级碰碰高清版 | 92国产精品久久久久首页 | 久久99九九99精品 | 日韩精品极品视频 | 日韩理论在线视频 | 国产成人一二片 | 亚洲一区二区三区在线看 | 毛片网站观看 | 国产999在线观看 | 亚洲成人欧美 | 人人狠狠综合久久亚洲婷 | 日韩欧美高清在线观看 | 91日韩在线专区 | 久久视频 | 视频精品一区二区三区 | 亚洲成人精品久久 | 精品国产乱码久久久久久1区二区 | 在线免费观看视频a | 日韩啪啪小视频 | 国产精品成久久久久三级 | 国产精品手机在线播放 | 亚洲影院一区 | 成人午夜电影在线观看 | 久久久久国产精品免费免费搜索 | 射久久久| 午夜精品久久久久久久99无限制 | 欧美一级特黄高清视频 | 开心色插 | 韩日av一区二区 | 国产小视频91 | 日韩免费视频观看 | 日韩系列在线观看 | 在线播放一区二区三区 | 免费观看一区二区 | 国产 中文 日韩 欧美 | 91免费在线播放 | 久久精品99 | 亚洲国产视频网站 | 中文字幕在线免费97 | 五月天国产精品 | 玖玖综合网 | 在线免费观看视频a | 欧美一级黄色片 | 免费午夜网站 | av电影不卡| 天天射天天舔天天干 | 免费裸体视频网 | 久久优 | 奇米网8888| 久久99国产精品视频 | 日韩在线观看不卡 | 成人久久18免费网站麻豆 | 91色九色| 亚洲激情p| 欧美福利在线播放 | av电影在线观看完整版一区二区 | 日韩av播放在线 | 色婷婷综合在线 | 国产成人精品一区二区在线观看 | 国产精品久久久久久久久免费看 | 免费一级片在线 | 日韩乱码在线 | av色一区 | 久草视频在线观 | 天天色播 | 91亚洲精品乱码久久久久久蜜桃 | 久草在线视频在线观看 | 日韩欧美国产精品 | 精品久久久久久久久久久久久久久久久久 | 国产麻豆剧传媒免费观看 | 九九激情视频 | 亚洲激情婷婷 | 亚洲精品午夜视频 | 狠狠色婷婷丁香六月 | 国产日韩在线播放 | 欧美激情精品久久 | 国产一区视频在线 | 在线成人免费电影 | 国产亚洲精品久久久久久 | 精品久久久国产 | 色 免费观看 | 久草99| 亚洲激情p| 在线观看亚洲国产 | 久久久在线免费观看 | 亚洲一区二区三区四区在线视频 | 色视频网页 | 久久久久久久久网站 | 国产综合久久 | 久久99国产精品二区护士 | 久久一区二区三区日韩 | 国产一区在线免费观看视频 | 97综合在线 | 日韩在线中文字幕视频 | 97精品视频在线播放 | 久操97| 婷婷国产在线 | 成人久久精品视频 | 在线观看日韩国产 | 五月婷婷综合激情 | 涩涩伊人 | 在线va网站 | 国产欧美在线一区 | 国产视频精品久久 | 久久99最新地址 | 在线影院中文字幕 | 亚洲精品视频网站在线观看 | 成年人免费看片 | 国产精品免费视频一区二区 | 国产一区二区三区高清播放 | 久久超碰网 | 啪啪凸凸 | 激情电影影院 | 中文字幕在线视频国产 | 国产中文字幕在线 | 国精产品999国精产品岳 | 婷婷丁香狠狠爱 | 久久综合久久伊人 | 在线免费国产视频 | 亚洲电影影音先锋 | 瑞典xxxx性hd极品 | 久久精品伊人 | 婷婷精品国产欧美精品亚洲人人爽 | 国产成人精品久久亚洲高清不卡 | 亚洲综合激情五月 | 91日韩在线专区 | 国产 av 日韩 | 久久久网页 | 亚洲一级在线观看 | 久久影视网 | 免费视频久久 | 成人久久亚洲 | 日韩av区| 国产精品美女久久久久aⅴ 干干夜夜 | 精品婷婷 | 国产精久久久久久妇女av | 国产在线第三页 | 免费av网站观看 | 国产丝袜一区二区三区 | 欧美少妇18p | 久草在线资源视频 | 深爱五月激情五月 | 五月丁婷婷 | 日操操 | 免费亚洲精品视频 | 国产在线高清视频 | 天天操天天摸天天射 | 成人黄色片免费看 | 99精彩视频在线观看免费 | av不卡中文 | 在线观看91精品国产网站 | 国色综合 | 国产一区视频导航 | 又黄又色又爽 | 五月天中文字幕 | 亚洲国产三级在线 | 成人精品福利 | 人人爱在线视频 | 欧美激情视频在线免费观看 | 亚洲视频axxx | 久久精品精品电影网 | 免费观看日韩av | 久草在线免费在线观看 | 综合久久久| 五月婷婷综合久久 | 精品在线观看视频 | 九七视频在线观看 | 麻豆91在线看 | 久草免费在线视频观看 | 日日摸日日添夜夜爽97 | 久草网站| 激情视频国产 | 中文字幕日韩电影 | www.69xx | 91精品专区 | 日韩在线视频不卡 | 国产一级片毛片 | 久久天天躁狠狠躁亚洲综合公司 | 欧美福利网站 | 精品久久久久久综合日本 | 国产精品观看在线亚洲人成网 | 久草在线 | 91一区啪爱嗯打偷拍欧美 | 亚洲国产av精品毛片鲁大师 | 国产视频久久 | 激情网五月 | 国产 在线 日韩 | 久久久福利视频 | 国产色综合 | 国产超碰在线观看 | av3级在线| 97超在线视频 | 亚洲九九精品 | 人人看看人人 | 国产一区二区不卡视频 | 夜夜天天干 | 色婷婷亚洲精品 | 激情 亚洲| 精品久久久成人 | 国产精品夜夜夜一区二区三区尤 | 天天天天色射综合 | 国产乱码精品一区二区三区介绍 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 久草精品资源 | 亚洲黄色免费网站 | 尤物97国产精品久久精品国产 | 在线国产小视频 | 亚洲妇女av | 97精品国产97久久久久久粉红 | 不卡视频国产 | 国产精品久久久久久久久久尿 | 青草视频在线免费 | 少妇bbb搡bbbb搡bbbb | 婷婷草 | 国产视频一区在线播放 | 99婷婷狠狠成为人免费视频 | 国产精品亚洲a | 欧美日韩中文另类 | 久久99亚洲精品久久久久 | 国产 字幕 制服 中文 在线 | 97在线视 | 最新中文字幕在线播放 | 91网页版在线观看 | 不卡的av在线 | 国产中文字幕视频在线观看 | 嫩草伊人久久精品少妇av | 99久久久久久国产精品 | 欧美日韩精品网站 | 新av在线 | 亚洲高清在线观看视频 | 久久综合久久综合久久 | 香蕉视频一级 | 丁香六月五月婷婷 | 婷婷丁香激情综合 | 美女在线观看av | 日韩av美女 | 99久久免费看 | 免费看的黄色网 | 欧美日本一区 | 色午夜 | 亚洲天天在线 | 久久久99精品免费观看乱色 | 九九九免费视频 | 亚洲亚洲精品在线观看 | 久久婷婷精品视频 | 毛片永久新网址首页 | .国产精品成人自产拍在线观看6 | 天天爱综合 | 国产精品福利无圣光在线一区 | 亚洲专区欧美专区 | 99产精品成人啪免费网站 | 日韩av电影一区 | 在线视频久久 | 国产亚洲精品久久19p | 国产精品成人免费一区久久羞羞 | 亚洲成人一二三 | 美女视频是黄的免费观看 | 日韩网站在线免费观看 | 亚洲高清色综合 | 808电影免费观看三年 | 午夜美女wwww | 五月天高清欧美mv | 99r在线精品| 岛国一区在线 | 就操操久久 | 亚洲国产精品激情在线观看 | 波多野结衣电影久久 | 久久精品久久久精品美女 | 一区二区三区韩国免费中文网站 | 欧美另类重口 | www.午夜视频 | 天天射日 | 色福利网| 精品欧美一区二区精品久久 | 日韩免费一区二区三区 | 精品国产精品久久 | 日本久久免费电影 | 欧美激情一区不卡 | 日韩有码在线观看视频 | 亚洲国产综合在线 | 六月丁香社区 | 久久人人爽人人爽 | 国产一区二区高清不卡 | 又长又大又黑又粗欧美 | 国产免费嫩草影院 | 人人澡人人爽欧一区 | av在线小说 | 国产美女精品在线 | 亚洲精品久久久久久中文传媒 | 欧美视频日韩视频 | 丰满少妇在线观看 | 天堂av高清 | 黄色片软件网站 | 五月天精品视频 | 人人澡人人爽 | 国产粉嫩在线观看 | 美女视频a美女大全免费下载蜜臀 | 99爱视频在线观看 | 黄色av免费看 | 亚洲成人第一区 | 久久久久久久久久福利 | av天天草| 国产你懂的在线 | 午夜精品一区二区三区免费 | 久久视频在线 | 在线看成人 | 欧美一二在线 | 成年人在线免费看片 | 中文字幕在线观看亚洲 | 亚洲午夜精品一区二区三区电影院 | 天堂网中文在线 | 97精品国产97久久久久久久久久久久 | 久久免费福利视频 | 97精品国自产拍在线观看 | 久久久国产电影 | 69夜色精品国产69乱 | 精品国产一区在线观看 | 中文在线免费观看 | 97视频人人免费看 | av7777777 | 在线网站黄 | 热久久精品在线 | 毛片1000部免费看 | 日韩有码中文字幕在线 | 亚洲成人精品影院 | 精品国产综合区久久久久久 | 久久亚洲私人国产精品va | 久久草草热国产精品直播 | 日本韩国精品一区二区在线观看 | 久久综合中文字幕 | 成人av电影免费 | 国产成人三级在线观看 | 日本精品二区 | 国产亲近乱来精品 | 97精品久久人人爽人人爽 | 波多野结衣在线观看视频 | 久草视频在线播放 | 高清av在线| 一区二区三区高清在线观看 | av夜夜操 | 精品视频久久 | 亚洲成人黄色在线观看 | 久久免视频 | 日韩精品免费在线播放 | 色婷婷免费 | 三三级黄色片之日韩 | 欧美日韩国产高清视频 | 成人av网站在线观看 | 亚洲国产成人久久综合 | 国产高清中文字幕 | 色婷婷狠狠干 | av资源中文字幕 | 国产99久久久精品 | 色婷婷国产在线 | 国产人免费人成免费视频 | 91热精品 | 亚洲视频免费视频 | 久久综合久久综合久久综合 | 国产不卡在线看 | 婷婷久久国产 | 久久精品欧美一区二区三区麻豆 | 久免费视频| 欧美一区日韩精品 | 在线观看成人毛片 | 国产精品国产三级国产aⅴ无密码 | 色偷偷男人的天堂av | 精品国产一区二区三区日日嗨 | 91在线中字 | 婷婷午夜天 | www91在线观看 | 国产精品高潮呻吟久久久久 | 国产原创91| 亚洲精品美女久久久 | 五月开心激情网 | 国产精品毛片久久久久久 | 国产成人精品一区二区三区福利 | a久久久久 | 国产小视频国产精品 | 黄视频网站大全 | 在线看片中文字幕 | 欧美做受高潮 | 免费中文字幕视频 | 欧美另类xxxx | 一区二区三区久久精品 | 在线成人一区二区 | 日韩一区二区免费在线观看 | 日韩精品一区电影 | 欧美一级片免费在线观看 | 欧美黄色软件 | 国产一级片视频 | 精品一区二区在线免费观看 | 麻豆高清免费国产一区 | 国产91学生粉嫩喷水 | 国产精彩视频一区二区 | 中文字幕免费高清在线 | 久草在线视频首页 | 粉嫩一区二区三区粉嫩91 | 天天翘av | 日韩欧美网站 | 粉嫩av一区二区三区入口 | 欧美与欧洲交xxxx免费观看 | 人人盈棋牌 | 黄色一级网 | 久草综合在线观看 | 亚洲精品免费看 | 国产亚州av | 亚洲爱视频 | 日韩中文字幕视频在线 | 黄色电影小说 | 51久久成人国产精品麻豆 | 99这里精品 | 欧美高清成人 | 国产a国产 | 伊人天天操 | 在线观看国产高清视频 | 91爱爱网址 | 日本字幕网| av成人黄色 | 成人av手机在线 | 欧美精品久久久久久久久久白贞 | 99久久这里只有精品 | 天天摸天天舔 | 在线最新av | 欧美日韩视频在线播放 | 又色又爽又激情的59视频 | 国产在线视频一区二区 | 天天撸夜夜操 | 一本之道乱码区 | 日韩网站视频 | 久久免费看片 | 一级片黄色片网站 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 精品国产亚洲在线 | 51久久夜色精品国产麻豆 | 亚洲久草网 | 99久久www免费 | 国产成人精品综合久久久 | 99热国产精品 | 亚洲精品在线观看视频 | 国产91精品看黄网站 | 97超级碰碰| 五月激情六月丁香 | 欧美精品成人在线 | 99精品视频中文字幕 | 日批在线观看 | 极品久久久久 | 97国产| 国产xxxx做受性欧美88 | 激情一区二区三区欧美 | 天天爱天天爽 | 99精品小视频 | 玖草影院 | 国产真实在线 | 日日摸日日 | 精品久久久久久久久久国产 | 国产精品久久一卡二卡 | 亚洲精品在线电影 | 91久久国产自产拍夜夜嗨 | 国产精品mm| 很黄很黄的网站免费的 | 五月综合婷 | 久久99国产综合精品 | 丁香五月网久久综合 | 亚洲精品视频二区 | 免费看污网站 | 欧美精品亚洲二区 | 热久久免费国产视频 | 亚洲高清在线视频 | 亚洲综合日韩在线 | 免费看国产视频 | 婷婷综合久久 | 成人网大片 | 一区二区影视 | 免费www视频 | 欧美怡红院视频 | 99爱这里只有精品 | 在线观看亚洲a | 国产一区二区三区高清播放 | 黄色特级一级片 | 成 人 黄 色 免费播放 | 激情久久久久久久久久久久久久久久 | 久久经典国产视频 | 免费 在线 中文 日本 | 97精品国自产拍在线观看 | 国色天香在线观看 | 中文字幕亚洲欧美日韩2019 | 久久久久亚洲天堂 | 激情久久婷婷 | av五月婷婷| 又黄又爽又色无遮挡免费 | 久久精品视频4 | 97天天干| 久热免费 | 久久天堂精品视频 | 国产成人在线综合 | 国产精品久久久久久久久久ktv | www.婷婷色 | 精品国产_亚洲人成在线 | 成年人在线观看 | 亚洲精品视频二区 | 99久久一区 | 爱射综合 | 激情久久一区二区三区 | 亚洲午夜小视频 | 在线免费观看视频 | 国产高清成人 | 高清不卡毛片 | 欧美成人999 | 国内精品免费久久影院 | 日韩在线不卡视频 | 岛国av在线免费 | 国产精品黄色 | 久久一区国产 | 国产日韩精品一区二区三区在线 | 狠狠网站 | 91高清在线看 | 日韩精品一区不卡 | 97国产视频 | 久久激情日本aⅴ | 超碰免费久久 | 亚洲免费a | 香蕉久久久久久av成人 | 国产一级黄色av | 中文字幕色在线 | 人人射人人爱 | 久久精品欧美一区 | 中文字幕色在线视频 | 啪啪凸凸 | 成人av免费在线播放 | 综合久久婷婷 | 亚洲欧洲一级 | 在线三级播放 | 国产福利资源 | 怡红院成人在线 | 亚洲精品视频在 | 欧美日韩不卡一区二区 | 亚洲国产999| 97人人爽人人 | 亚洲国产999| 久久综合亚洲鲁鲁五月久久 | 亚洲观看黄色网 | 国产精品视频永久免费播放 | 成年人免费看 | 天天狠狠| 黄色大全视频 | 爱爱一区 | 国产中文在线观看 | 射射射综合网 | 午夜av影院 | 亚洲色图 校园春色 | 日韩精品欧美精品 | 少妇搡bbbb搡bbb搡69 | 精品视频国产一区 | 国产91丝袜在线播放动漫 | 久草视频2| 亚洲第一av在线播放 | 久久久久久久久久电影 | 9999在线视频 | 久草在线网址 | 人人爽人人做 | 亚洲精品国产日韩 | 日韩精品一区在线观看 | 亚洲国产成人在线 | 日本中文字幕高清 | 日韩视频免费观看高清完整版在线 | 欧美性色综合网 | 在线亚洲免费视频 | 国产美女无遮挡永久免费 | 亚洲国产成人在线观看 | 一区二区三区电影在线播 | 亚洲久久视频 | 久久艹影院 | japanesexxxxfreehd乱熟 | 人人玩人人添人人澡97 | 综合网伊人 | 国产在线999| 色吊丝在线永久观看最新版本 | 色国产在线 | 狠狠狠狠狠狠狠狠干 | 久久综合九色欧美综合狠狠 | 成人精品亚洲 | 天天综合视频在线观看 | 丰满少妇对白在线偷拍 | 五月天婷婷综合 | 午夜视频在线观看一区二区三区 | 日韩大陆欧美高清视频区 | 精品999国产| 亚洲国产精品女人久久久 | 综合色综合色 | 成人免费看黄 | 精品极品在线 | 国产一级片网站 | 国产女教师精品久久av | 99亚洲国产| 久久精品视频在线 | 五月亚洲婷婷 | 99视频国产精品 | 波多野结衣在线播放视频 | 少妇精品久久久一区二区免费 | 国产综合香蕉五月婷在线 | 91资源在线播放 | 国产精品久久久免费看 | 国产手机精品视频 | 六月丁香色婷婷 | 激情综合网五月 | 在线观看日韩av | 天天操天天爱天天干 | 在线观看国产一区二区 | 天天干天天天天 | 天天综合网天天综合色 | 精品一区二区免费在线观看 | 国产中文字幕三区 | 天堂av在线网站 | 三级黄色a | 999成人 | 亚洲高清免费在线 | 久久99精品热在线观看 | 国产精品a级 | 日韩视频中文 | 免费成人短视频 | 精品国产一区二区三区在线观看 | 日韩视频专区 | 色全色在线资源网 | 人人看97 | 久久久久久在线观看 | 天天干,天天操 | 久久激情视频 | 综合黄色网 | 一区二区三区日韩精品 | 亚洲理论在线观看 | 国产日韩精品一区二区 | www.天天干 | 综合色在线| 在线国产日本 | 99精品视频免费观看视频 | 国产精品入口a级 | 色午夜影院| 欧美精品久久人人躁人人爽 | 五月av在线 | 久久在线免费视频 |