Skip to content

Commit 3edf3fb

Browse files
author
ChenRui
committed
优化闪存图片发布后网页版查看友好度
闪存链接识别
1 parent 4627686 commit 3edf3fb

15 files changed

+423
-39
lines changed

Diff for: app/src/main/java/com/rae/cnblogs/adapter/MomentAdapter.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.rae.cnblogs.adapter;
22

33
import android.support.v7.widget.GridLayoutManager;
4+
import android.text.Html;
45
import android.text.TextUtils;
56
import android.view.LayoutInflater;
67
import android.view.View;
@@ -132,7 +133,7 @@ public void onBindViewHolder(SimpleViewHolder viewHolder, int position, MomentBe
132133
// holder.deleteView.setOnClickListener(new ItemDeleteClickListener(m.getId(), position, mOnDeleteClickListener));
133134
holder.authorView.setText(m.getAuthorName());
134135
holder.dateView.setText(m.getPostTime());
135-
holder.summaryView.setText(m.getContent());
136+
holder.summaryView.setText(Html.fromHtml(m.getContent()));
136137
holder.androidTagView.setVisibility(m.isAndroidClient() ? View.VISIBLE : View.GONE);
137138
holder.commentView.setVisibility("0".equals(m.getCommentCount()) ? View.GONE : View.VISIBLE);
138139
holder.commentView.setText("0".equals(m.getCommentCount()) ? "" : m.getCommentCount() + "条回复");

Diff for: app/src/main/java/com/rae/cnblogs/adapter/MomentDetailAdapter.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import android.support.annotation.Nullable;
44
import android.support.v4.content.ContextCompat;
55
import android.support.v7.widget.GridLayoutManager;
6+
import android.text.Html;
67
import android.text.SpannableString;
78
import android.text.Spanned;
89
import android.text.TextUtils;
@@ -229,7 +230,7 @@ private void onBindDetailInfoViewHolder(MomentHolder holder, MomentBean m) {
229230
RaeImageLoader.displayHeaderImage(m.getAvatar(), holder.avatarView);
230231
holder.authorView.setText(m.getAuthorName());
231232
holder.dateView.setText(m.getPostTime());
232-
holder.summaryView.setText(m.getContent());
233+
holder.summaryView.setText(Html.fromHtml(m.getContent()));
233234
// holder.commentView.setText(m.getCommentCount());
234235
holder.androidTagView.setVisibility(m.isAndroidClient() ? View.VISIBLE : View.GONE);
235236
}

Diff for: app/src/main/java/com/rae/cnblogs/presenter/impl/PostMomentPresenterImpl.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ private String withImageContent(List<String> images) {
133133
int size = images.size();
134134
for (int i = 0; i < size; i++) {
135135
// 占位,用于计算字符大小
136-
array.put("t.cn/1234567");
136+
array.put("http://t.cn/1234567 ");
137137
}
138138
sb.append(array.toString());
139139
sb.append("#end");

Diff for: app/src/main/java/com/rae/cnblogs/service/MomentIntentService.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import com.tencent.bugly.crashreport.CrashReport;
3434

3535
import org.greenrobot.eventbus.EventBus;
36-
import org.json.JSONArray;
3736

3837
import java.io.File;
3938
import java.io.FileNotFoundException;
@@ -192,12 +191,14 @@ public void onSuccess(List<String> urls) {
192191
sendNotification(createNotificationBuilder().setContentText("图片上传成功,发布中...").build());
193192
StringBuilder sb = new StringBuilder(mMomentMetaData.content);
194193
sb.append("#img");
195-
JSONArray array = new JSONArray();
194+
// JSONArray array = new JSONArray();
196195
int size = urls.size();
197196
for (int i = 0; i < size; i++) {
198-
array.put(urls.get(i).replace("http://", ""));
197+
// array.put(urls.get(i));
198+
sb.append(urls.get(i));
199+
sb.append(" ");
199200
}
200-
sb.append(array.toString());
201+
// sb.append(array.toString());
201202
sb.append("#end");
202203

203204
RxObservable.create(mMomentApi.publish(sb.toString(), mMomentMetaData.flag), TAG)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
package com.rae.cnblogs.widget;
2+
3+
import android.content.Context;
4+
import android.graphics.Color;
5+
import android.text.Spannable;
6+
import android.text.method.MovementMethod;
7+
import android.util.AttributeSet;
8+
import android.view.MotionEvent;
9+
import android.widget.TextView;
10+
11+
import com.rae.cnblogs.widget.span.ISpanTouchFix;
12+
import com.rae.cnblogs.widget.span.QMUILinkTouchMovementMethod;
13+
import com.rae.cnblogs.widget.span.QMUITouchableSpan;
14+
15+
/**
16+
* <p>
17+
* 修复了 {@link TextView} 与 {@link android.text.style.ClickableSpan} 一起使用时,
18+
* 点击 {@link android.text.style.ClickableSpan} 也会触发 {@link TextView} 的事件的问题。
19+
* </p>
20+
* <p>
21+
* 同时通过 {@link #setNeedForceEventToParent(boolean)} 控制该 TextView 的点击事件能否传递给其 Parent,
22+
* 修复了 {@link TextView} 默认情况下如果添加了 {@link android.text.style.ClickableSpan} 之后就无法把点击事件传递给 {@link TextView} 的 Parent 的问题。
23+
* </p>
24+
* <p>
25+
* 注意: 使用该 {@link TextView} 时, 用 {@link QMUITouchableSpan} 代替 {@link android.text.style.ClickableSpan},
26+
* 且同时可以使用 {@link QMUITouchableSpan} 达到修改 span 的文字颜色和背景色的目的。
27+
* </p>
28+
* <p>
29+
* 注意: 使用该 {@link TextView} 时, 需调用 {@link #setMovementMethodDefault()} 方法设置默认的 {@link QMUILinkTouchMovementMethod},
30+
* TextView 会在 {@link #onTouchEvent(MotionEvent)} 时将事件传递给 {@link QMUILinkTouchMovementMethod},
31+
* 然后传递给 {@link QMUITouchableSpan}, 实现点击态的变化和点击事件的响应。
32+
* </p>
33+
*
34+
* @author cginechen
35+
* @date 2017-03-20
36+
* @see QMUITouchableSpan
37+
* @see QMUILinkTouchMovementMethod
38+
*/
39+
public class QMUISpanTouchFixTextView extends RaeTextView implements ISpanTouchFix {
40+
/**
41+
* 记录当前 Touch 事件对应的点是不是点在了 span 上面
42+
*/
43+
private boolean mTouchSpanHit;
44+
45+
/**
46+
* 记录每次真正传入的press,每次更改mTouchSpanHint,需要再调用一次setPressed,确保press状态正确
47+
*/
48+
private boolean mIsPressedRecord = false;
49+
/**
50+
* TextView是否应该消耗事件
51+
*/
52+
private boolean mNeedForceEventToParent = false;
53+
54+
public QMUISpanTouchFixTextView(Context context) {
55+
this(context, null);
56+
}
57+
58+
public QMUISpanTouchFixTextView(Context context, AttributeSet attrs) {
59+
this(context, attrs, 0);
60+
}
61+
62+
public QMUISpanTouchFixTextView(Context context, AttributeSet attrs, int defStyleAttr) {
63+
super(context, attrs, defStyleAttr);
64+
setHighlightColor(Color.TRANSPARENT);
65+
}
66+
67+
public void setNeedForceEventToParent(boolean needForceEventToParent) {
68+
mNeedForceEventToParent = needForceEventToParent;
69+
setFocusable(!needForceEventToParent);
70+
setClickable(!needForceEventToParent);
71+
setLongClickable(!needForceEventToParent);
72+
}
73+
74+
/**
75+
* 使用者主动调用
76+
*/
77+
public void setMovementMethodDefault() {
78+
setMovementMethodCompat(QMUILinkTouchMovementMethod.getInstance());
79+
}
80+
81+
public void setMovementMethodCompat(MovementMethod movement) {
82+
setMovementMethod(movement);
83+
if (mNeedForceEventToParent) {
84+
setNeedForceEventToParent(true);
85+
}
86+
}
87+
88+
@Override
89+
public boolean onTouchEvent(MotionEvent event) {
90+
if (!(getText() instanceof Spannable)) {
91+
return super.onTouchEvent(event);
92+
}
93+
mTouchSpanHit = true;
94+
// 调用super.onTouchEvent,会走到QMUILinkTouchMovementMethod
95+
// 会走到QMUILinkTouchMovementMethod#onTouchEvent会修改mTouchSpanHint
96+
boolean ret = super.onTouchEvent(event);
97+
if (mNeedForceEventToParent) {
98+
return mTouchSpanHit;
99+
}
100+
return ret;
101+
}
102+
103+
@Override
104+
public void setTouchSpanHit(boolean hit) {
105+
if (mTouchSpanHit != hit) {
106+
mTouchSpanHit = hit;
107+
setPressed(mIsPressedRecord);
108+
}
109+
}
110+
111+
@SuppressWarnings("SimplifiableIfStatement")
112+
@Override
113+
public boolean performClick() {
114+
if (!mTouchSpanHit && !mNeedForceEventToParent) {
115+
return super.performClick();
116+
}
117+
return false;
118+
}
119+
120+
@SuppressWarnings("SimplifiableIfStatement")
121+
@Override
122+
public boolean performLongClick() {
123+
if (!mTouchSpanHit && !mNeedForceEventToParent) {
124+
return super.performLongClick();
125+
}
126+
return false;
127+
}
128+
129+
@Override
130+
public final void setPressed(boolean pressed) {
131+
mIsPressedRecord = pressed;
132+
if (!mTouchSpanHit) {
133+
onSetPressed(pressed);
134+
}
135+
}
136+
137+
protected void onSetPressed(boolean pressed) {
138+
super.setPressed(pressed);
139+
}
140+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.rae.cnblogs.widget.span;
2+
3+
/**
4+
* @author cginechen
5+
* @date 2017-08-07
6+
*/
7+
8+
public interface ISpanTouchFix {
9+
/**
10+
* 记录当前 Touch 事件对应的点是不是点在了 span 上面
11+
*/
12+
void setTouchSpanHit(boolean hit);
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.rae.cnblogs.widget.span;
2+
3+
import android.view.View;
4+
5+
/**
6+
* @author cginechen
7+
* @date 2017-03-20
8+
*/
9+
10+
public interface ITouchableSpan {
11+
void setPressed(boolean pressed);
12+
void onClick(View widget);
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package com.rae.cnblogs.widget.span;
2+
3+
import android.text.Layout;
4+
import android.text.Selection;
5+
import android.text.Spannable;
6+
import android.view.MotionEvent;
7+
import android.widget.TextView;
8+
9+
10+
/**
11+
* @author cginechen
12+
* @date 2017-03-20
13+
*/
14+
15+
public class QMUILinkTouchDecorHelper {
16+
private ITouchableSpan mPressedSpan;
17+
18+
public boolean onTouchEvent(TextView textView, Spannable spannable, MotionEvent event) {
19+
if (event.getAction() == MotionEvent.ACTION_DOWN) {
20+
mPressedSpan = getPressedSpan(textView, spannable, event);
21+
if (mPressedSpan != null) {
22+
mPressedSpan.setPressed(true);
23+
Selection.setSelection(spannable, spannable.getSpanStart(mPressedSpan),
24+
spannable.getSpanEnd(mPressedSpan));
25+
}
26+
if (textView instanceof ISpanTouchFix) {
27+
ISpanTouchFix tv = (ISpanTouchFix) textView;
28+
tv.setTouchSpanHit(mPressedSpan != null);
29+
}
30+
return mPressedSpan != null;
31+
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
32+
ITouchableSpan touchedSpan = getPressedSpan(textView, spannable, event);
33+
if (mPressedSpan != null && touchedSpan != mPressedSpan) {
34+
mPressedSpan.setPressed(false);
35+
mPressedSpan = null;
36+
Selection.removeSelection(spannable);
37+
}
38+
if (textView instanceof ISpanTouchFix) {
39+
ISpanTouchFix tv = (ISpanTouchFix) textView;
40+
tv.setTouchSpanHit(mPressedSpan != null);
41+
}
42+
return mPressedSpan != null;
43+
} else if (event.getAction() == MotionEvent.ACTION_UP) {
44+
boolean touchSpanHint = false;
45+
if (mPressedSpan != null) {
46+
touchSpanHint = true;
47+
mPressedSpan.setPressed(false);
48+
mPressedSpan.onClick(textView);
49+
}
50+
51+
mPressedSpan = null;
52+
Selection.removeSelection(spannable);
53+
if (textView instanceof ISpanTouchFix) {
54+
ISpanTouchFix tv = (ISpanTouchFix) textView;
55+
tv.setTouchSpanHit(touchSpanHint);
56+
}
57+
return touchSpanHint;
58+
} else {
59+
if (mPressedSpan != null) {
60+
mPressedSpan.setPressed(false);
61+
}
62+
if (textView instanceof ISpanTouchFix) {
63+
ISpanTouchFix tv = (ISpanTouchFix) textView;
64+
tv.setTouchSpanHit(false);
65+
}
66+
Selection.removeSelection(spannable);
67+
return false;
68+
}
69+
70+
}
71+
72+
public ITouchableSpan getPressedSpan(TextView textView, Spannable spannable, MotionEvent event) {
73+
int x = (int) event.getX();
74+
int y = (int) event.getY();
75+
76+
x -= textView.getTotalPaddingLeft();
77+
y -= textView.getTotalPaddingTop();
78+
79+
x += textView.getScrollX();
80+
y += textView.getScrollY();
81+
82+
Layout layout = textView.getLayout();
83+
int line = layout.getLineForVertical(y);
84+
int off = layout.getOffsetForHorizontal(line, x);
85+
if (x < layout.getLineLeft(line) || x > layout.getLineRight(line)) {
86+
// 实际上没点到任何内容
87+
off = -1;
88+
}
89+
90+
ITouchableSpan[] link = spannable.getSpans(off, off, ITouchableSpan.class);
91+
ITouchableSpan touchedSpan = null;
92+
if (link.length > 0) {
93+
touchedSpan = link[0];
94+
}
95+
return touchedSpan;
96+
}
97+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.rae.cnblogs.widget.span;
2+
3+
import android.text.Spannable;
4+
import android.text.method.LinkMovementMethod;
5+
import android.text.method.MovementMethod;
6+
import android.text.method.Touch;
7+
import android.view.MotionEvent;
8+
import android.widget.TextView;
9+
10+
/**
11+
* 配合 {@link QMUILinkTouchDecorHelper} 使用
12+
*
13+
* @author cginechen
14+
* @date 2017-03-20
15+
*/
16+
17+
public class QMUILinkTouchMovementMethod extends LinkMovementMethod {
18+
19+
@Override
20+
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
21+
return sHelper.onTouchEvent(widget, buffer, event)
22+
|| Touch.onTouchEvent(widget, buffer, event);
23+
}
24+
25+
public static MovementMethod getInstance() {
26+
if (sInstance == null)
27+
sInstance = new QMUILinkTouchMovementMethod();
28+
29+
return sInstance;
30+
}
31+
32+
private static QMUILinkTouchMovementMethod sInstance;
33+
private static QMUILinkTouchDecorHelper sHelper = new QMUILinkTouchDecorHelper();
34+
35+
}

0 commit comments

Comments
 (0)