From e29ffa3d1341a86e66b23d4ece119729d0d8ff1e Mon Sep 17 00:00:00 2001 From: "kehaoyuan@ghzhushou.com" Date: Fri, 28 Feb 2020 17:56:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=89=E7=8E=AF=E5=8A=A9=E6=89=8BV4.0.0-?= =?UTF-8?q?=E9=97=AE=E7=AD=94=E7=A4=BE=E5=8C=BA=E4=BC=98=E5=8C=96=E6=B1=87?= =?UTF-8?q?=E6=80=BB(2200226=E6=B5=8B=E8=AF=95)=20https://gitlab.ghzs.com/?= =?UTF-8?q?pm/halo-app-issues/issues/768?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/view/ExpandAndCloseTextView.java | 43 +++++++++++++++++++ .../qa/answer/detail/AnswerDetailFragment.kt | 7 ++- .../detail/QuestionsDetailAdapter.kt | 8 ++-- .../detail/QuestionsDetailItemViewHolder.java | 3 +- .../res/layout/piece_question_content.xml | 2 +- 5 files changed, 56 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/gh/common/view/ExpandAndCloseTextView.java b/app/src/main/java/com/gh/common/view/ExpandAndCloseTextView.java index 066c4d1852..63a1f32b72 100644 --- a/app/src/main/java/com/gh/common/view/ExpandAndCloseTextView.java +++ b/app/src/main/java/com/gh/common/view/ExpandAndCloseTextView.java @@ -1,6 +1,7 @@ package com.gh.common.view; import android.content.Context; +import android.graphics.Paint; import android.os.Build; import android.text.Layout; import android.text.SpannableString; @@ -28,6 +29,8 @@ import androidx.appcompat.widget.AppCompatTextView; /** * 参考: https://github.com/MrTrying/ExpandableText-Example + *

+ * todo 辣鸡代码,有时间移除并在 {@link ExpandTextView} 实现该功能 */ public class ExpandAndCloseTextView extends AppCompatTextView { @@ -112,6 +115,7 @@ public class ExpandAndCloseTextView extends AppCompatTextView { mOpenSpannableStr.append("\n"); } if (mCloseSuffixSpan != null) { + mOpenSpannableStr = new SpannableStringBuilder(autoSplitText(mOpenSpannableStr.toString())); mOpenSpannableStr.append(mCloseSuffixSpan); } //计算原文截取位置 @@ -155,6 +159,8 @@ public class ExpandAndCloseTextView extends AppCompatTextView { mCLoseHeight = tempLayout.getHeight() + getPaddingTop() + getPaddingBottom(); mCloseSpannableStr.append(ELLIPSIS_STRING); + + mCloseSpannableStr = new SpannableStringBuilder(autoSplitText(mCloseSpannableStr.toString())); if (mOpenSuffixSpan != null) { mCloseSpannableStr.append(mOpenSuffixSpan); } @@ -497,6 +503,43 @@ public class ExpandAndCloseTextView extends AppCompatTextView { }, 1, mCloseSuffixStr.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } + private String autoSplitText(final String rawText) { + final Paint tvPaint = getPaint(); //paint,包含字体等信息 + final float tvWidth = initWidth - getPaddingLeft() - getPaddingRight(); //控件可用宽度 + + //将原始文本按行拆分 + String[] rawTextLines = rawText.replaceAll("\r", "").split("\n"); + StringBuilder sbNewText = new StringBuilder(); + for (String rawTextLine : rawTextLines) { + if (tvPaint.measureText(rawTextLine) <= tvWidth) { + //如果整行宽度在控件可用宽度之内,就不处理了 + sbNewText.append(rawTextLine); + } else { + //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行 + float lineWidth = 0; + for (int cnt = 0; cnt != rawTextLine.length(); ++cnt) { + char ch = rawTextLine.charAt(cnt); + lineWidth += tvPaint.measureText(String.valueOf(ch)); + if (lineWidth <= tvWidth) { + sbNewText.append(ch); + } else { + sbNewText.append("\n"); + lineWidth = 0; + --cnt; + } + } + } + sbNewText.append("\n"); + } + + //把结尾多余的\n去掉 + if (!rawText.endsWith("\n")) { + sbNewText.deleteCharAt(sbNewText.length() - 1); + } + + return sbNewText.toString(); + } + @Override public void setOnClickListener(View.OnClickListener onClickListener) { mOnClickListener = onClickListener; diff --git a/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailFragment.kt index 639bee1fec..ae18edc53f 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/detail/AnswerDetailFragment.kt @@ -34,6 +34,7 @@ import com.gh.common.constant.Constants.GAME_DETAIL_COME_IN import com.gh.common.history.HistoryHelper import com.gh.common.util.* import com.gh.common.view.DrawableView +import com.gh.common.view.ExpandAndCloseTextView import com.gh.common.view.RichEditor import com.gh.gamecenter.NormalActivity import com.gh.gamecenter.R @@ -83,7 +84,7 @@ class AnswerDetailFragment : NormalFragment() { @BindView(R.id.questionsdetail_item_picll) lateinit var mImgLl: LinearLayout @BindView(R.id.questionsdetail_item_des) - lateinit var mQuestionsDescTv: TextView + lateinit var mQuestionsDescTv: ExpandAndCloseTextView @BindView(R.id.questiondetail_item_pic3_mask) lateinit var mPic3Mask: View @BindView(R.id.questiondetail_item_pic3_desc) @@ -1077,7 +1078,9 @@ class AnswerDetailFragment : NormalFragment() { mQuestionsDescTv.visibility = if (question.description.isNullOrEmpty()) { View.GONE } else { - mQuestionsDescTv.text = question.description + mQuestionsDescTv.initWidth(resources.displayMetrics.widthPixels - 40F.dip2px()) + mQuestionsDescTv.maxLines = 3 + mQuestionsDescTv.setOriginalText(question.description) View.VISIBLE } diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/detail/QuestionsDetailAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/detail/QuestionsDetailAdapter.kt index 681b707a6b..3887a442f4 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/detail/QuestionsDetailAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/detail/QuestionsDetailAdapter.kt @@ -176,7 +176,7 @@ class QuestionsDetailAdapter( if (index != -1 && holder is CommunityAnswerItemViewHolder) { val answer = mEntityList[index].answer ?: return val intent = AnswerDetailActivity.getIntent(mContext, answer.id, mEntrance, "问题详情-答案列表") - holder.bindAnswerItem(answer,true, mEntrance, "问题详情") + holder.bindAnswerItem(answer, true, mEntrance, "问题详情") holder.binding.root.setOnClickListener { (mContext as Activity).startActivityForResult(intent, QuestionsDetailFragment.QUESTIONS_DETAIL_ANSWER_REQUEST) } @@ -189,7 +189,7 @@ class QuestionsDetailAdapter( val index = position - TOP_ITEM_COUNT if (index != -1) { val viewHolder = holder as CommunityAnswerItemViewHolder - val answerEntity = mEntityList[index].similarAnswer?:return + val answerEntity = mEntityList[index].similarAnswer ?: return viewHolder.bindAnswerItem(answerEntity, "", "问题推荐") viewHolder.binding.title.setOnClickListener { val questions = answerEntity.questions @@ -266,7 +266,9 @@ class QuestionsDetailAdapter( } // 问题描述 - holder.mDes.text = description + holder.mDes.initWidth(mContext.resources.displayMetrics.widthPixels - 40F.dip2px()) + holder.mDes.maxLines = 3 + holder.mDes.setOriginalText(description) holder.mDes.goneIf(TextUtils.isEmpty(description)) // "关注问题" diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/detail/QuestionsDetailItemViewHolder.java b/app/src/main/java/com/gh/gamecenter/qa/questions/detail/QuestionsDetailItemViewHolder.java index a7382eb35c..c2fa3ebc4b 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/detail/QuestionsDetailItemViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/detail/QuestionsDetailItemViewHolder.java @@ -7,6 +7,7 @@ import android.widget.TextView; import com.facebook.drawee.view.SimpleDraweeView; import com.gh.base.BaseRecyclerViewHolder; import com.gh.base.OnListClickListener; +import com.gh.common.view.ExpandAndCloseTextView; import com.gh.gamecenter.R; import com.google.android.flexbox.FlexboxLayout; @@ -23,7 +24,7 @@ public class QuestionsDetailItemViewHolder extends BaseRecyclerViewHolder { @BindView(R.id.questionsdetail_item_title) public TextView mTitle; @BindView(R.id.questionsdetail_item_des) - public TextView mDes; + public ExpandAndCloseTextView mDes; @BindView(R.id.questionsdetail_item_pic1) public SimpleDraweeView mPic1; @BindView(R.id.questionsdetail_item_pic2) diff --git a/app/src/main/res/layout/piece_question_content.xml b/app/src/main/res/layout/piece_question_content.xml index c3e268900b..bc1c307d52 100644 --- a/app/src/main/res/layout/piece_question_content.xml +++ b/app/src/main/res/layout/piece_question_content.xml @@ -7,7 +7,7 @@ android:orientation="vertical" tools:showIn="@layout/questionsdetail_item"> -