1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Android 仿朋友圈全文、收起功能,支持話題、網(wǎng)址...

        共 13921字,需瀏覽 28分鐘

         ·

        2023-05-09 05:30

            
              ?安卓進(jìn)階漲薪訓(xùn)練營
              ,讓一部分人先進(jìn)大廠
              


        大家好,我是皇叔,最近開了一個(gè)安卓進(jìn)階漲薪訓(xùn)練營,可以幫助大家突破技術(shù)&職場瓶頸,從而度過難關(guān),進(jìn)入心儀的公司。


        詳情見文章:沒錯(cuò)!皇叔開了個(gè)訓(xùn)練營


        作者:newki
        https://juejin.cn/post/7154271756214075428

        前言

        之前的文章我們都講到了WX盆友圈動(dòng)態(tài)列表的效果,九宮格控件的實(shí)現(xiàn) 【傳送門】 。并且講到了發(fā)布動(dòng)態(tài)中話題的處理 【傳送門】 。那么在動(dòng)態(tài)列表中我們?nèi)绾物@示我們發(fā)布的話題數(shù)據(jù)和一些圈子數(shù)據(jù)呢?

        https://juejin.cn/post/7153192823880155143

        https://juejin.cn/post/7153932700066250760


        大致實(shí)現(xiàn)效果如下:(本地測試環(huán)境,無其他含義)

        ff244afe93050212c262f20a95acce4f.webp

        1.TextView的特殊文本處理

        我們在把服務(wù)器返回的文本設(shè)置給自定義折疊的TextView之前,我們先對文本進(jìn)行Span的預(yù)處理。


              ?/**
        ?????*?暴露方法-替換原文本中的話題數(shù)據(jù),變色處理
        ?????*
        ?????*?@param?topics??服務(wù)器返回的話題數(shù)據(jù)
        ?????*?@param?content?服務(wù)器返回的原始文本數(shù)據(jù)
        ?????*/

        ????public?CharSequence?replaceTopicSpan(List<RemoteTopicBean>?topics,?String?content,?OnTopicClickListener?listener)?{

        ????????if?(!CheckUtil.isEmpty(topics)?&&?!CheckUtil.isEmpty(content))?{

        ????????????CharSequence?topicCharSequece?=?content;

        ????????????int?startPosition?=?0;
        ????????????int?endPosition?=?0;
        ????????????for?(RemoteTopicBean?bean?:?topics)?{
        ????????????????startPosition?=?content.indexOf(bean.topic_name,?startPosition);
        ????????????????endPosition?=?startPosition?+?bean.topic_name.length();
        ????????????????if?(startPosition?==?-1)
        ????????????????????break;

        ????????????????topicCharSequece?=?SpanUtils.getInstance()
        ????????????????????????.toClickSpan(topicCharSequece,?startPosition,?endPosition,?CommUtils.getColor(R.color.app_blue),?false,?charSequence?->?{
        ????????????????????????????//話題的點(diǎn)擊(路由直接跳轉(zhuǎn)搜索結(jié)果展示)
        ????????????????????????????listener.onTopicClick(charSequence.toString());

        ????????????????????????});

        ????????????????startPosition?=?endPosition;
        ????????????}

        ????????????return?topicCharSequece;
        ????????}

        ????????return?"";
        ????}

        其實(shí)就是對多個(gè)話題進(jìn)行遍歷,找到start和end,然后使用Span的工具類,把普通的文本轉(zhuǎn)為可點(diǎn)擊和變色的Span。并回調(diào)出去外界使用。關(guān)鍵是要返回處理之后的文本 CharSequece 返回外部去設(shè)置。


        具體富文本的轉(zhuǎn)換方法如下:
            
                /**
        ?*?可點(diǎn)擊-帶下劃線
        ?*/

        public?CharSequence?toClickSpan(CharSequence?charSequence,?int?start,?int?end,?int?color,?boolean?needUnderLine,?OnSpanClickListener?listener)?{

        ????SpannableString?spannableString?=?new?SpannableString(charSequence);

        ????ClickableSpan?clickableSpan?=?new?ClickableSpan()?{
        ????????@Override
        ????????public?void?onClick(@NonNull?View?widget)?{
        ????????????if?(listener?!=?null)?{
        ????????????????//防止重復(fù)點(diǎn)擊
        ????????????????if?(System.currentTimeMillis()?-?mLastClickTime?>=?TIME_INTERVAL)?{
        ????????????????????//to?do
        ????????????????????listener.onClick(charSequence.subSequence(start,?end));

        ????????????????????mLastClickTime?=?System.currentTimeMillis();
        ????????????????}

        ????????????}
        ????????}

        ????????@Override
        ????????public?void?updateDrawState(@NonNull?TextPaint?ds)?{
        ????????????ds.setColor(color);
        ????????????ds.setUnderlineText(needUnderLine);
        ????????}
        ????};

        ????spannableString.setSpan(
        ????????????clickableSpan,
        ????????????start,
        ????????????end,
        ????????????Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

        ????return?spannableString;
        }


        使用的時(shí)候:
            
                //展開文本設(shè)置
        ExpandTextView?tvContent?=?helper.getView(R.id.tv_feed_news_content);
        String?content?=?item.contentDesc;

        CharSequence?topicCharSequece??=??tvContent.replaceTopicSpan(item.topics,?content,?new?ExpandTextView.OnTopicClickListener()?{
        ????@Override
        ????public?void?onTopicClick(String?topic)?{
        ????????YYRouterService.newsFeedComponentService.startSearchResultActivity(mActivity,?topic,?true);
        ????}
        });

        tvContent.setVisibility(View.VISIBLE);
        tvContent.initWidth(mTvWidth);
        tvContent.setMaxLines(3);
        tvContent.setTypeface(TypefaceUtil.getSFLight(mContext));
        tvContent.setCloseText(topicCharSequece);


        如果自己想顯示的控件文本需要顯示一些自定義字體,那么我們需要在設(shè)置文本之前就設(shè)置字體。

        setCloseText 方法就是具體的實(shí)現(xiàn)展開收起入口方法,我們看看它是怎么實(shí)現(xiàn)的。

        2.TextView的展開收起功能

        關(guān)于TextView的展開收起,都離不開 StaticLayout 這個(gè)神器。

        我們主要需要用到它的兩個(gè)方法 :
        • 通過 StaticLayout getLineCount() 方法知道文本是否會(huì)超出我們設(shè)置的maxLines,
        • 通過 getLineEnd(int line) 方法可以找到最后一行的最后一個(gè)字符在文本中的位置。
        由于我們的需求是[展開]與[收起]的標(biāo)簽是緊接著文章后面而不是換行展示,所以我們需要循環(huán)遍歷才能找到最佳的位置。 setCloseText 的方法如下:
              private?String?TEXT_EXPAND?=?"??[More]";
        private?String?TEXT_CLOSE?=?"??[Show?Less]";

        /**
        ?*?暴露的方法-默認(rèn)設(shè)置文本方法(如果需要折疊就會(huì)默認(rèn)折疊)
        ?*?如果有特殊的Span如話題之類的,需要處理完畢之后再調(diào)用此方法。
        ?*/

        public?void?setCloseText(CharSequence?text)?{

        ????if?(SPAN_CLOSE?==?null)?{
        ????????initCloseEnd();
        ????}
        ????boolean?appendShowAll?=?false;?//?需要展開收起功能,先使用flag攔截,等測量完畢之后再setText顯示真正的文本
        ????originText?=?text;

        ????int?maxLines?=?getMaxLines();

        ????CharSequence?workingText?=?originText;
        ????if?(maxLines?>=?0)?{

        ????????//創(chuàng)建出一個(gè)StaticLayout主要是為了計(jì)算行數(shù)
        ????????Layout?layout?=?createStaticLayout(workingText);
        ????????//計(jì)算全部展開的文本高度
        ????????mOpenHeight?=?layout.getHeight()?+?getPaddingTop()?+?getPaddingBottom();
        ????????if?(layout.getLineCount()?>?maxLines)?{
        ????????????//獲取一行顯示字符個(gè)數(shù),然后截取字符串?dāng)?shù),?收起狀態(tài)原始文本截取展示的部分
        ????????????workingText?=?originText.subSequence(0,?layout.getLineEnd(maxLines?-?1));
        ????????????//再對加上[收起]標(biāo)簽的文本進(jìn)行測量
        ????????????String?showText?=?originText.subSequence(0,?layout.getLineEnd(maxLines?-?1))?+?"..."?+?SPAN_CLOSE;
        ????????????Layout?layout2?=?createStaticLayout(showText);

        ????????????//?對workingText進(jìn)行-1截取,直到展示行數(shù)==最大行數(shù),并且添加?SPAN_CLOSE?后剛好占滿最后一行
        ????????????while?(layout2.getLineCount()?>?maxLines)?{
        ????????????????int?lastSpace?=?workingText.length()?-?1;
        ????????????????if?(lastSpace?==?-1)?{
        ????????????????????break;
        ????????????????}
        ????????????????workingText?=?workingText.subSequence(0,?lastSpace);
        ????????????????layout2?=?createStaticLayout(workingText?+?"..."?+?SPAN_CLOSE);
        ????????????}

        ????????????//計(jì)算收起的文本高度
        ????????????mCLoseHeight?=?layout2.getHeight()?+?getPaddingTop()?+?getPaddingBottom();
        ????????????appendShowAll?=?true;

        ????????}
        ????}

        ????setText(workingText);

        ????if?(appendShowAll)?{
        ????????//?必須使用append,不能在上面使用+連接,否則會(huì)失效
        ????????append("...");
        ????????append(SPAN_CLOSE);
        ????}

        ????setMovementMethod(LinkMovementMethod.getInstance());

        ????replaceUrlSpan();
        }

        /**
        ?*?收起的文案(顏色處理)初始化
        ?*/

        private?void?initCloseEnd()?{
        ????//設(shè)置展開的文本
        ????SPAN_CLOSE?=?new?SpannableString(TEXT_EXPAND);

        ????ButtonSpan?span?=?new?ButtonSpan(getContext(),?new?View.OnClickListener()?{
        ????????@Override
        ????????public?void?onClick(View?v)?{
        ????????????ExpandTextView.super.setMaxLines(Integer.MAX_VALUE);
        ????????????setExpandText(originText);
        ????????????if?(mCallback?!=?null)?mCallback.isExpand(1);
        ????????}
        ????},?R.color.color_expand_span);

        ????SPAN_CLOSE.setSpan(span,?0,?TEXT_EXPAND.length(),?Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        ????SPAN_CLOSE.setSpan(new?MyTypefaceSpan(TypefaceUtil.getSFRegular(getContext())),?0,?TEXT_EXPAND.length(),?Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
        }


        其實(shí)只需要這兩個(gè)方法就可以展示一個(gè)折疊起來的文本了。那么如何切換展開與收起的狀態(tài)呢?

        3.多種方式的實(shí)現(xiàn)展開

        第一種方法是直接修改 setMaxLine 的方式,設(shè)置最大允許展示行的方式。

            
                /**
        ?*?展開的文案(顏色處理)初始化
        ?*/

        private?void?initExpandEnd()?{
        ????//設(shè)置關(guān)閉的文本
        ????SPAN_EXPAND?=?new?SpannableString(TEXT_CLOSE);
        ????ButtonSpan?span?=?new?ButtonSpan(getContext(),?new?View.OnClickListener()?{
        ????????@Override
        ????????public?void?onClick(View?v)?
        {
        ????????????ExpandTextView.super.setMaxLines(mMaxLines);
        ????????????setCloseText(originText);
        ????????????if?(mCallback?!=?null)?mCallback.isExpand(0);
        ????????}
        ????},?R.color.color_expand_span);

        ????SPAN_EXPAND.setSpan(span,?0,?TEXT_CLOSE.length(),?Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        ????SPAN_EXPAND.setSpan(new?MyTypefaceSpan(TypefaceUtil.getSFRegular(getContext())),?0,?TEXT_CLOSE.length(),?Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
        }

        ?/**
        ?*?設(shè)置展開的文本展示-后面加上[收起]的文本標(biāo)簽
        ?*/

        private?void?setExpandText(CharSequence?text)?{
        ????if?(SPAN_EXPAND?==?null)?{
        ????????initExpandEnd();
        ????}
        ????//創(chuàng)建出一個(gè)StaticLayout主要是為了計(jì)算行數(shù)
        ????Layout?layout1?=?createStaticLayout(text);
        ????Layout?layout2?=?createStaticLayout(text?+?TEXT_CLOSE);
        ????//判斷-?當(dāng)展示全部原始內(nèi)容時(shí)?如果?TEXT_CLOSE?需要換行才能顯示完整,則直接將TEXT_CLOSE展示在下一行
        ????if?(layout2.getLineCount()?>?layout1.getLineCount())?{
        ????????setText(originText?+?"\n");
        ????}?else?{
        ????????setText(originText);
        ????}
        ????//加上[收起]的標(biāo)簽
        ????append(SPAN_EXPAND);

        ????setMovementMethod(LinkMovementMethod.getInstance());

        ????replaceUrlSpan();
        }


        我們在[展開]和[收起]的標(biāo)簽中先設(shè)置他們?yōu)榭牲c(diǎn)擊的標(biāo)簽,然后再回調(diào)的Click方法中我們是設(shè)置切換 ExpandTextView.super.setMaxLines(mMaxLines); ?的方式來實(shí)現(xiàn)的。 當(dāng)然如果覺得這樣的切換比較生硬,想用動(dòng)畫來實(shí)現(xiàn)也是可以的。 另一種方法是記錄展開與收起的高度,然后做屬性動(dòng)畫直接改變 layoutParams 的height,從而改變高度,實(shí)現(xiàn)對應(yīng)展開收起的狀態(tài)切換。 之前在 setCloseText 方法中,我們預(yù)測量文本布局的時(shí)候已經(jīng)記錄了展開與收起的高度記錄。
            
                private?int?mOpenHeight;???//展開的文本高度
        private?int?mCLoseHeight;??//收起的文本高度


        那么我就能用動(dòng)畫來封裝一下實(shí)現(xiàn)。
            
                class?ExpandCollapseAnimation?extends?Animation?{
        ????private?final?View?mTargetView;//動(dòng)畫執(zhí)行view
        ????private?final?int?mStartHeight;//動(dòng)畫執(zhí)行的開始高度
        ????private?final?int?mEndHeight;//動(dòng)畫結(jié)束后的高度

        ????ExpandCollapseAnimation(View?target,?int?startHeight,?int?endHeight)?{
        ????????mTargetView?=?target;
        ????????mStartHeight?=?startHeight;
        ????????mEndHeight?=?endHeight;
        ????????setDuration(400);
        ????}

        ????@Override
        ????protected?void?applyTransformation(float?interpolatedTime,?Transformation?t)?{
        ????????//計(jì)算出每次應(yīng)該顯示的高度,改變執(zhí)行view的高度,實(shí)現(xiàn)動(dòng)畫
        ????????mTargetView.getLayoutParams().height?=?(int)?((mEndHeight?-?mStartHeight)?*?interpolatedTime?+?mStartHeight);
        ????????mTargetView.requestLayout();
        ????}
        }


        大致的實(shí)現(xiàn)如下:
            
                private?void?executeOpenAnim()?{

        ????if?(mOpenAnim?==?null)?{
        ????????mOpenAnim?=?new?ExpandCollapseAnimation(this,?mCLoseHeight,?mOpenHeight);
        ????????mOpenAnim.setFillAfter(true);
        ????????mOpenAnim.setAnimationListener(new?Animation.AnimationListener()?{
        ????????????@Override
        ????????????public?void?onAnimationStart(Animation?animation)?{
        ????????????????ExpandableTextView.super.setMaxLines(Integer.MAX_VALUE);
        ????????????????setText(mOpenSpannableStr);
        ????????????}

        ????????????@Override
        ????????????public?void?onAnimationEnd(Animation?animation)?{

        ????????????????getLayoutParams().height?=?mOpenHeight;
        ????????????????requestLayout();
        ????????????????animating?=?false;
        ????????????}

        ????????????@Override
        ????????????public?void?onAnimationRepeat(Animation?animation)?{

        ????????????}
        ????????});
        ????}

        ????if?(animating)?{
        ????????return;
        ????}
        ????animating?=?true;
        ????clearAnimation();

        ????startAnimation(mOpenAnim);
        }


        private?void?executeCloseAnim()?{

        ????if?(mCloseAnim?==?null)?{
        ????????mCloseAnim?=?new?ExpandCollapseAnimation(this,?mOpenHeight,?mCLoseHeight);
        ????????mCloseAnim.setFillAfter(true);
        ????????mCloseAnim.setAnimationListener(new?Animation.AnimationListener()?{
        ????????????@Override
        ????????????public?void?onAnimationStart(Animation?animation)?{

        ????????????}

        ????????????@Override
        ????????????public?void?onAnimationEnd(Animation?animation)?{
        ????????????????animating?=?false;
        ????????????????ExpandableTextView.super.setMaxLines(mMaxLines);
        ????????????????setText(mCloseSpannableStr);
        ????????????????getLayoutParams().height?=?mCLoseHeight;
        ????????????????requestLayout();
        ????????????}

        ????????????@Override
        ????????????public?void?onAnimationRepeat(Animation?animation)?{

        ????????????}
        ????????});
        ????}

        ????if?(animating)?{
        ????????return;
        ????}
        ????animating?=?true;
        ????clearAnimation();

        ????startAnimation(mCloseAnim);
        }


        兩種方法都是可以的,我這里的做法是第一種做法,直接設(shè)置 maxLine 的方法,沒有整那么多動(dòng)畫。

        4.內(nèi)部Link鏈接的自定義處理

        這里的Demo,做了兩種演示,其實(shí)我么可以直接通過工具類轉(zhuǎn)換到我們自定義的ClickSpan,也可以通過new 一個(gè) ButtonSpan 來替換實(shí)現(xiàn)。

        例如使用 ButtonSpan ,我們可以設(shè)置點(diǎn)擊,設(shè)置自定義字體等等。
            
                SPAN_CLOSE?=?new?SpannableString(TEXT_EXPAND);

        ButtonSpan?span?=?new?ButtonSpan(getContext(),?new?View.OnClickListener()?{
        ????@Override
        ????public?void?onClick(View?v)?{
        ????????ExpandTextView.super.setMaxLines(Integer.MAX_VALUE);
        ????????setExpandText(originText);
        ????????if?(mCallback?!=?null)?mCallback.isExpand(1);
        ????}
        },?R.color.color_expand_span);

        SPAN_CLOSE.setSpan(span,?0,?TEXT_EXPAND.length(),?Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        SPAN_CLOSE.setSpan(new?MyTypefaceSpan(TypefaceUtil.getSFRegular(getContext())),?0,?TEXT_EXPAND.length(),?Spannable.SPAN_INCLUSIVE_EXCLUSIVE);


        而內(nèi)部的網(wǎng)址點(diǎn)擊,由于默認(rèn)是跳轉(zhuǎn)到瀏覽器,我們想App自己處理,那么我們就需要找到文本中的 URLSpan 對象,然后對他進(jìn)行替換,換成我們自己的 InterceptUrlSpan 對象,跳轉(zhuǎn)到我們自己的WebView。
              /**
        ?*?填充文本之后嘗試替換URLSpan
        ?*/

        private?void?replaceUrlSpan()?{
        ????CharSequence?text?=?getText();
        ????if?(text?instanceof?Spannable)?{
        ????????int?end?=?text.length();
        ????????Spannable?sp?=?(Spannable)?text;

        ????????URLSpan[]?urls?=?sp.getSpans(0,?end,?URLSpan.class);
        ????????SpannableStringBuilder?spannableStringBuilder?=?new?SpannableStringBuilder(text);

        ????????if?(urls.length?>?0)?{
        ????????????for?(URLSpan?urlSpan?:?urls)?{
        ????????????????//攔截點(diǎn)擊,替換Span
        ????????????????InterceptUrlSpan?interceptUrlSpan?=?new?InterceptUrlSpan(urlSpan.getURL());
        ????????????????spannableStringBuilder.setSpan(interceptUrlSpan,?sp.getSpanStart(urlSpan),?sp.getSpanEnd(urlSpan),?Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
        ????????????}

        ????????????//替換之后重新設(shè)置進(jìn)去
        ????????????setText(spannableStringBuilder);
        ????????}

        ????}
        }

        一般是在我們設(shè)置玩文本顯示之后再調(diào)用,如 setCloseText setExpandText 方法。


        效果: e7e03140b933ffb40af0b51e0c875603.webp

        5.結(jié)語

        涉及到的一些知識(shí),文本Span的轉(zhuǎn)換, StaticLayout 的使用,URLSpan的查找與替換等。

        主要是和我們的需求相互對應(yīng),如果是要展開標(biāo)簽要在文本后面顯示就簡單一點(diǎn),如果換行展示就簡單一點(diǎn),總的來說其實(shí)也不是很難,明確需求之后分解為一步一步的小需求,然后一步一步的實(shí)現(xiàn)小需求,串聯(lián)起來就是我們最終的效果。 由于一些隱私問題就沒有很方便的直接在我的Demo中完整貼出。如果大家對代碼有需求的話,全部的代碼其實(shí)都已經(jīng)在文中貼出了,大家細(xì)心整合一下就是完整的代碼了。 當(dāng)然了,我這種方案可能也只是閉門造車,還需要大家提提意見,如果你有更好的方案,或者優(yōu)化的空間都也可以一起交流一下。如有錯(cuò)漏的地方還請指出,如果有疑問也可以在評論區(qū)大家一起討論哦。 如果感覺本文對你有一點(diǎn)點(diǎn)的啟發(fā),還望你能?點(diǎn)贊?支持一下,你的支持是我最大的動(dòng)力。 Ok,這一期就此完結(jié)。

        7483b9badf32113fd06dd0cf6b2b74c5.webp

        35c0a1a25659dd9b1761e971db99f039.webp
        8a93e21eff652997a07d46ab62d80aa2.webp

        為了防止失聯(lián),歡迎關(guān)注我防備的小號(hào)

            
                
                  ?
                
              
            

        ? ? ? ? ? ? ???微信改了推送機(jī)制,真愛請星標(biāo)本公號(hào)??

        瀏覽 80
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            中文字幕亚洲区| 欧美99在线| 中文字幕av在线播放| 久久无码一区| 日韩AV免费在线| 日韩AV中文| 校园春色亚洲无码| 国产传媒一区| 88AV在线观看| 色婷婷五月激情| 久久精品禁一区二区三区四区五区 | 手机在线观看av| 老熟妇搡BBBB搡BBBB| japanese在线观看| 九九久久久久| 亚洲AV永久无码精品国产精| 日韩精品无码av| 一级毛AA片| 9I看片成人免费视频| 国产乱子伦真实精品| 久久91视频| 一区二区视频在线观看| 国产91探花秘入口| 波多野结衣无码一区二区| 中文字幕日韩成人| 亚洲一级二级三级片| 黄片视频在线免费看| 国产精品美女久久久久久久久| 先锋资源男人站| 婷婷五月天激情丁香| 欧美五月在线网址| 99热9| 黄片无码| 色噜噜噜| 在线视频91| 色五月婷婷中文字幕| 国产美女自拍视频| 国产欧美综合一区二区三区| 一级欧美一级日韩片| 日逼中文字幕| 中国免费一级无码成人片| 国产18毛片18水多精品| BBB搡BBB搡BBB搡BBB| 婷久久久| 色黄视频在线观看| 久久国产精品99久久人人澡| 99国产一区| 在线视频内射| 国产最新福利| xxxxx无码| 高清在线无码视频| 国产亚洲欧美日韩高清| 老熟女17页一91| 999久久久精品| 天堂网在线观看| 特级无码| 成人视频91| 99国产一区| 国产中文在线观看| 久久久久亚洲AV无码成人片| 爱爱视频日本| 国产精品久久久久久久久久久久久久久 | 手机成人在线视频| 中文字幕不卡无码| 国产无套免费网站69| 在线观看无码av| 青娱乐偷拍视频| 爱爱视频天天干| jzzijzzij亚洲成熟少妇在线播放| 久久色婷婷| 无码精品成人观看A片| BBB搡BBB搡BBB搡BBB| 美女乱伦视频| 九九韩剧网最新电视剧免费观看| 国产丝袜自拍| 影音先锋成人在线资源| 人人爽人人爽| 99国产精品久久久久久久| 黄色录像毛片| 91精品国久久久久久无码一区二区三区| 免费成人黄片| 免费A视频| 久久水蜜桃| 免费一级a片| 亚洲AV成人无码久久精品麻豆 | 日本三级网站| 欧美三级在线| 99精品六月婷婷综合在线| 日本伊人在线综合视频| 久久黄色网络| 激情内射| 骚逼视频聊天记录| 在线观看小视频| 亚洲精品999| 中文字幕久久播放| 91九色视频| 免费高潮视频| 亚洲黄片免费| 亚洲国产精品久久久| 日韩爱爱视频| 欧美精品成人| 亚洲高清免费视频| 嫩草人人精品免费| 黄色成人视频在线观看| 91精品成人| 久久成人福利| 尿在小sao货里面好不好| 欧美精品性爱视频| 免费做a爰片77777| 影音先锋成人片| 亚洲AV秘无码苍井空| 亚洲xxxxx| 荫蒂添出高潮A片视频| 黄色片在线免费看| 日韩一区二区视频| 黄色视频在线观看18| 中文字幕福利电影| 亚洲国产成人va| 伊人激情影院| 成人一区二区电影| 午夜操逼逼| 91视频网站免费观看| 老太婆擦BBBB撩BBBB| 成人免费视频国产在线观看| 超碰人人爱国产视| 免费视频一区二区三区四区| 黑人一级| 污视频免费在线观看| 国产精品无码一区二区三区| 男女拍拍拍| 国产熟女一区二区视频网站| 国产精品爽爽久久久| 亚洲在线观看网站| 中文字幕乱码中文乱码图片| 自拍偷拍激情视频| 久久精品黄色| 中文字幕永久在线观看| aaa在线| 色综合久久88色综合天天99 | 有码视频在线观看| 草逼视频免费看| 亚洲天堂精品视频| 亚洲精品成人av无码| 人人插人人干| 91人人澡人人爽人人看| 波多野结衣一区二区| 欧美AAAAAA视频| 亚洲国产精品自| 91无码人妻东京热精品一区| 免费作爱视频| 色色一区二区| 欧美a√| 第一福利视频| 蜜桃AV| 91麻豆福利在线观看| 91人妻一区二区三区无不码超满 | 成人AV一区二区三区| 亚州成人视频| 中文字幕亚洲区| 丁香激情网| 天美果冻麻豆国产一区| 亚洲成人在线视频观看| 国产精品免费一区二区三区四区视频 | 婷婷色在线播放| 婷婷五月天综合网| 午夜操| 国产主播精品在线| 西西337| 免费成人视频在线观看| 亚洲黄色视频网站在线观看| 国产精品18禁| 成人毛片在线观看| 海滩AV黑人| 亚洲国产成人无码| 先锋影音成人资源| 色视频在线播放| 欧美精品成人免码在线| 欧美人与禽乱婬A片| 影音先锋一区| 天天夜夜爽| 国产精品视频色| 久操亚洲| 韩日无码视频| 无码人妻视频| 国产精品9999久久久久仙踪林| 人人看人人摸人人插| 狠狠色噜噜狠狠狠888米奇视频| 亚洲中文字幕观看| 成人日韩欧美| 亚洲免费婷婷| 国产精品日韩欧美| 亚洲高清无码视频在线播放| 亚州免费视频| 丁香五月激情小说| 天天爽天天操| 亚洲无码高清在线观看视频| 国产一二| 蜜臀久久99精品久久久久久婷婷| 免费一级A片在线播放| 久热精品视频在线观看| 天天干天天日天天操| 中文字幕免费中文| 亚洲欧洲精品视频| 亚洲成人色色| 麻豆国产| 一区二区在线不卡| 国产suv精品一区二区6精华液| 亚洲天堂视频在线播放| 欧美在线一级| 欧美日韩国产精品| 国产在线一二三| 日韩精品极品视频在线观看免费| 精品孕妇一区二区三区| 黑人大香蕉| 日韩黄色片| AAA一区二区三区| 九九韩剧网最新电视剧免费观看 | 91首页| 亚洲AV无码成人精品区欧洲| 女生自慰在线观看| 五月天激情啪啪| 怡春院视频| 人妻二区| 国产群交| 国产欧美综合一区| 日韩无码视屏| 五月丁香婷婷在线| 亚洲一区二区无码| 久久综合站| 亚洲网站免费观看| 色呦呦一区二区三区| 国产免费自拍| 白峰美羽人妻AND-499| 六月婷婷五月| 亚洲精品无码视频在线观看| 99视频免费看| 久久久www成人免费毛片| 欧美一级成人| 天天干人妻| 色婷婷亚洲| 中文字幕AV免费观看| 性爱视频小说| 欧美成人A| 日日夜夜爽歪歪| 亚洲成人影音先锋| 日韩熟妇无码中文字慕| 天天操天| 久久黄色视频免费看| 天天日日干| 日韩a视频| 日本一级做a爱片| 九色蝌蚪9l视频蝌蚪9l视频成人熟妇 | 日操夜操| 91精品久久久久久| 国产女人18毛片水18精品软件 | 朝鲜性感AV在线| 高圆圆一区二区三区| 免费观看黄色小视频| 国产综合激情| 日韩AV电影网| 一级二级三级视频| 欧美日韩精品久久久免费观看| 中文字幕高清无码免费视频| 最近中文字幕在线观看| 日韩av免费看| 中文字幕av在线播放| aV无码av天天aV天天爽第一| 91蝌蚪在线观看| 五月丁香六月婷| 国产女人18毛片水18精品软件 | 成人av小说网站| 国产精品小电影| 成人国产精品在线看| 丁香花在线小说免费全文| 91精品午夜少妇| 熟妇综合| 越南小嫩嫩BBWBBw| 91视频综合网| 欧美一区二区精品| 无码国精品一区二区免费蜜桃| 丁香五月激情啪啪啪| 在线观看国产免费视频| 思思热99热| 黑人精品欧美一区二区蜜桃| 免费看黄色视频| 91夜夜夜| 搡老熟女-91Porn| 色婷婷综合久久久中文字幕| 俺也来俺也去WWW色| 色网站在线| 加勒比久久综合| 久久综合伊人7777777| 视频一区18| 日韩视频在线免费观看| 91亚洲精华国产精华精华液| 在线观看日韩AV| 操逼逼视频| 亚洲色图五月天| 久久涩| 男人天堂久久|