Heorhii Lysenko Asked:2020-03-29 19:28:28 +0000 UTC2020-03-29 19:28:28 +0000 UTC 2020-03-29 19:28:28 +0000 UTC 消息时间指示器,设计 772 我正在尝试为信使设计一个聊天泡泡。我只是不知道如何显示消息时间指示器,就像在 Telegram 中一样: 我们希望文本锚定在气泡的一角,而不是与文本重叠。 android 1 个回答 Voted Best Answer Heorhii Lysenko 2020-04-03T21:16:59Z2020-04-03T21:16:59Z 我部分解决了这个问题,我在这里找到了解决方案: import android.annotation.TargetApi; import android.content.Context; import android.text.Layout; import android.util.AttributeSet; import android.view.View; import android.widget.FrameLayout; import android.widget.TextView; public class ChatBubbleLayout extends FrameLayout { public ChatBubbleLayout(Context context) { super(context); } public ChatBubbleLayout(Context context, AttributeSet attrs) { super(context, attrs); } public ChatBubbleLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @TargetApi(21) public ChatBubbleLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { TextView message_textView = (TextView) getChildAt(0); View localView = getChildAt(1); super.onMeasure(widthMeasureSpec, heightMeasureSpec); int view_size = View.MeasureSpec.getSize(widthMeasureSpec); Layout messageTextviewLayout = message_textView.getLayout(); int linestart = messageTextviewLayout.getLineStart(messageTextviewLayout.getLineCount() - 1); int lineend = messageTextviewLayout.getLineEnd(messageTextviewLayout.getLineCount() - 1); int desiredWidth = (int) Layout.getDesiredWidth(message_textView.getText() .subSequence(linestart, lineend), message_textView.getPaint()); int measuredWidth = message_textView.getMeasuredWidth(); int requiredWidth = Math.min(measuredWidth, (int) Math.ceil(Layout.getDesiredWidth(message_textView.getText(), message_textView.getPaint())) + message_textView.getPaddingRight() + message_textView.getPaddingLeft()); if (view_size - getPaddingLeft() - getPaddingRight() >= requiredWidth + localView.getMeasuredWidth()) { setMeasuredDimension(requiredWidth + localView.getMeasuredWidth() + getPaddingLeft() + getPaddingRight(), getMeasuredHeight()); } else if ((requiredWidth - message_textView.getPaddingLeft() - message_textView.getPaddingRight() < desiredWidth + localView.getMeasuredWidth())) { setMeasuredDimension(getMeasuredWidth(), getMeasuredHeight() + localView.getMeasuredHeight()); } } }
我部分解决了这个问题,我在这里找到了解决方案: