diff --git a/qmui/src/main/java/com/qmuiteam/qmui/qqface/QMUINoQQFaceManager.java b/qmui/src/main/java/com/qmuiteam/qmui/qqface/QMUINoQQFaceManager.java new file mode 100644 index 00000000..0a84a7ce --- /dev/null +++ b/qmui/src/main/java/com/qmuiteam/qmui/qqface/QMUINoQQFaceManager.java @@ -0,0 +1,61 @@ +/* + * Tencent is pleased to support the open source community by making QMUI_Android available. + * + * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the MIT License (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * + * http://opensource.org/licenses/MIT + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is + * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.qmuiteam.qmui.qqface; + +import android.graphics.drawable.Drawable; + +public class QMUINoQQFaceManager implements IQMUIQQFaceManager{ + + @Override + public boolean maybeSoftBankEmoji(char c) { + return false; + } + + @Override + public int getSoftbankEmojiResource(char c) { + return 0; + } + + @Override + public boolean maybeEmoji(int codePoint) { + return false; + } + + @Override + public int getEmojiResource(int codePoint) { + return 0; + } + + @Override + public int getDoubleUnicodeEmoji(int currentCodePoint, int nextCodePoint) { + return 0; + } + + @Override + public int getQQfaceResource(CharSequence text) { + return 0; + } + + @Override + public Drawable getSpecialBoundsDrawable(CharSequence text) { + return null; + } + + @Override + public int getSpecialDrawableMaxHeight() { + return 0; + } +} diff --git a/qmui/src/main/java/com/qmuiteam/qmui/qqface/QMUIQQFaceCompiler.java b/qmui/src/main/java/com/qmuiteam/qmui/qqface/QMUIQQFaceCompiler.java index 1cbf2aa5..9ae87b6c 100644 --- a/qmui/src/main/java/com/qmuiteam/qmui/qqface/QMUIQQFaceCompiler.java +++ b/qmui/src/main/java/com/qmuiteam/qmui/qqface/QMUIQQFaceCompiler.java @@ -23,11 +23,15 @@ import android.util.LruCache; import com.qmuiteam.qmui.span.QMUITouchableSpan; import com.qmuiteam.qmui.util.QMUILangHelper; -import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; +import java.util.HashMap; import java.util.List; +import java.util.Map; + +import androidx.annotation.MainThread; +import androidx.annotation.NonNull; /** * {@link QMUIQQFaceView} 的内容解析器,将文本内容解析成 {@link QMUIQQFaceView} 想要的数据格式。 @@ -38,24 +42,31 @@ import java.util.List; public class QMUIQQFaceCompiler { private static final int SPAN_COLUMN = 2; + private static final Map sInstanceMap = new HashMap<>(4); + private static IQMUIQQFaceManager sDefaultQQFaceManager = new QMUINoQQFaceManager(); - private volatile static QMUIQQFaceCompiler sInstance; + public static void setDefaultQQFaceManager(@NonNull IQMUIQQFaceManager defaultQQFaceManager) { + sDefaultQQFaceManager = defaultQQFaceManager; + } - // cache private LruCache mCache; - private IQMUIQQFaceManager mQQFaceManager; - // 有多线程保护,如果内容非常多,可以扔到后台去(虽然暂时没有这个必要,但不避免有人想这么做) + + @MainThread + public static QMUIQQFaceCompiler getDefaultInstance(){ + return getInstance(sDefaultQQFaceManager); + } + + @MainThread public static QMUIQQFaceCompiler getInstance(IQMUIQQFaceManager manager) { - if (sInstance == null) { - synchronized (QMUIQQFaceCompiler.class) { - if (sInstance == null) { - sInstance = new QMUIQQFaceCompiler(manager); - } - } + QMUIQQFaceCompiler instance = sInstanceMap.get(manager); + if (instance != null) { + return instance; } - return sInstance; + instance = new QMUIQQFaceCompiler(manager); + sInstanceMap.put(manager, instance); + return instance; } private QMUIQQFaceCompiler(IQMUIQQFaceManager manager) { @@ -108,9 +119,9 @@ public class QMUIQQFaceCompiler { public int compare(QMUITouchableSpan o1, QMUITouchableSpan o2) { int start1 = spannable.getSpanStart(o1); int start2 = spannable.getSpanStart(o2); - if(start1 > start2){ + if (start1 > start2) { return 1; - }else if(start1 == start2){ + } else if (start1 == start2) { return 0; } return -1; diff --git a/qmui/src/main/java/com/qmuiteam/qmui/qqface/QMUIQQFaceView.java b/qmui/src/main/java/com/qmuiteam/qmui/qqface/QMUIQQFaceView.java index ea8a7fd8..1deed4cf 100644 --- a/qmui/src/main/java/com/qmuiteam/qmui/qqface/QMUIQQFaceView.java +++ b/qmui/src/main/java/com/qmuiteam/qmui/qqface/QMUIQQFaceView.java @@ -98,7 +98,6 @@ public class QMUIQQFaceView extends View { private int mMaxWidth = Integer.MAX_VALUE; private PressCancelAction mPendingPressCancelAction = null; private boolean mJumpHandleMeasureAndDraw = false; - private Runnable mDelayTextSetter = null; private boolean mIncludePad = true; private Typeface mTypeface = null; private int mParagraphSpace = 0; // 段间距 @@ -145,12 +144,7 @@ public class QMUIQQFaceView extends View { mSpecialDrawablePadding = array.getDimensionPixelSize(R.styleable.QMUIQQFaceView_qmui_special_drawable_padding, 0); final String text = array.getString(R.styleable.QMUIQQFaceView_android_text); if (!QMUILangHelper.isNullOrEmpty(text)) { - mDelayTextSetter = new Runnable() { - @Override - public void run() { - setText(text); - } - }; + mOriginText = text; } mMoreActionText = array.getString(R.styleable.QMUIQQFaceView_qmui_more_action_text); mMoreActionColor = array.getColor(R.styleable.QMUIQQFaceView_qmui_more_action_color, mTextColor); @@ -165,6 +159,7 @@ public class QMUIQQFaceView extends View { mSpanBgPaint = new Paint(); mSpanBgPaint.setAntiAlias(true); mSpanBgPaint.setStyle(Paint.Style.FILL); + setCompiler(QMUIQQFaceCompiler.getDefaultInstance()); } public void setOpenQQFace(boolean openQQFace) { @@ -276,9 +271,9 @@ public class QMUIQQFaceView extends View { } public void setCompiler(QMUIQQFaceCompiler compiler) { - mCompiler = compiler; - if (mDelayTextSetter != null) { - mDelayTextSetter.run(); + if(mCompiler != compiler){ + mCompiler = compiler; + setText(mOriginText, false); } } @@ -357,10 +352,10 @@ public class QMUIQQFaceView extends View { } } - public void setIncludeFontPadding(boolean includepad) { - if (mIncludePad != includepad) { + public void setIncludeFontPadding(boolean includePad) { + if (mIncludePad != includePad) { needReCalculateFontHeight = true; - mIncludePad = includepad; + mIncludePad = includePad; requestLayout(); invalidate(); } @@ -462,11 +457,14 @@ public class QMUIQQFaceView extends View { } public void setText(CharSequence charSequence) { - mDelayTextSetter = null; - CharSequence oldText = mOriginText; - if (mOriginText != null && mOriginText.equals(charSequence)) { + setText(charSequence, true); + } + + private void setText(CharSequence charSequence, boolean compareOldText) { + if(compareOldText && QMUILangHelper.objectEquals(charSequence, mOriginText)){ return; } + mOriginText = charSequence; setContentDescription(charSequence); if (mOpenQQFace && mCompiler == null) { @@ -474,11 +472,9 @@ public class QMUIQQFaceView extends View { } if (QMUILangHelper.isNullOrEmpty(mOriginText)) { - if (!QMUILangHelper.isNullOrEmpty(oldText)) { - mElementList = null; - requestLayout(); - invalidate(); - } + mElementList = null; + requestLayout(); + invalidate(); return; } diff --git a/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/QDApplication.java b/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/QDApplication.java index 0f3c2492..c3e38404 100644 --- a/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/QDApplication.java +++ b/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/QDApplication.java @@ -22,6 +22,7 @@ import android.content.Context; import android.content.res.Resources; import com.qmuiteam.qmui.arch.QMUISwipeBackActivityManager; +import com.qmuiteam.qmui.qqface.QMUIQQFaceCompiler; import com.qmuiteam.qmui.skin.QMUISkinManager; import com.qmuiteam.qmuidemo.manager.QDSkinManager; import com.qmuiteam.qmuidemo.manager.QDUpgradeManager; @@ -50,6 +51,7 @@ public class QDApplication extends Application { QDUpgradeManager.getInstance(this).check(); QMUISwipeBackActivityManager.init(this); + QMUIQQFaceCompiler.setDefaultQQFaceManager(QDQQFaceManager.getInstance()); QDSkinManager.install(this); } diff --git a/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/fragment/components/qqface/QDQQFacePerformanceTestFragment.java b/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/fragment/components/qqface/QDQQFacePerformanceTestFragment.java index 6393cba8..b6c4fa83 100644 --- a/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/fragment/components/qqface/QDQQFacePerformanceTestFragment.java +++ b/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/fragment/components/qqface/QDQQFacePerformanceTestFragment.java @@ -44,7 +44,7 @@ import butterknife.ButterKnife; * @date 2017-06-08 */ -@Widget(group = Group.Other, name = "性能观测") +@Widget(group = Group.Other, name = "性能观测[微笑]") public class QDQQFacePerformanceTestFragment extends BaseFragment { @BindView(R.id.topbar) QMUITopBarLayout mTopBar; @BindView(R.id.tabSegment) QMUITabSegment mTabSegment; diff --git a/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/fragment/components/qqface/QDQQFaceUsageFragment.java b/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/fragment/components/qqface/QDQQFaceUsageFragment.java index 31ae4c4a..691d8e26 100644 --- a/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/fragment/components/qqface/QDQQFaceUsageFragment.java +++ b/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/fragment/components/qqface/QDQQFaceUsageFragment.java @@ -19,6 +19,7 @@ package com.qmuiteam.qmuidemo.fragment.components.qqface; import android.view.LayoutInflater; import android.view.View; +import com.qmuiteam.qmui.qqface.QMUIQQFaceView; import com.qmuiteam.qmui.widget.QMUITopBar; import com.qmuiteam.qmuidemo.manager.QDDataManager; import com.qmuiteam.qmuidemo.base.BaseFragment; @@ -37,19 +38,19 @@ import butterknife.ButterKnife; @Widget(group = Group.Other, name = "QQ表情使用展示") public class QDQQFaceUsageFragment extends BaseFragment { @BindView(R.id.topbar) QMUITopBar mTopBar; - @BindView(R.id.qqface1) QDQQFaceView mQQFace1; - @BindView(R.id.qqface2) QDQQFaceView mQQFace2; - @BindView(R.id.qqface3) QDQQFaceView mQQFace3; - @BindView(R.id.qqface4) QDQQFaceView mQQFace4; - @BindView(R.id.qqface5) QDQQFaceView mQQFace5; - @BindView(R.id.qqface6) QDQQFaceView mQQFace6; - @BindView(R.id.qqface7) QDQQFaceView mQQFace7; - @BindView(R.id.qqface8) QDQQFaceView mQQFace8; - @BindView(R.id.qqface9) QDQQFaceView mQQFace9; - @BindView(R.id.qqface10) QDQQFaceView mQQFace10; - @BindView(R.id.qqface11) QDQQFaceView mQQFace11; - @BindView(R.id.qqface12) QDQQFaceView mQQFace12; - @BindView(R.id.qqface13) QDQQFaceView mQQFace13; + @BindView(R.id.qqface1) QMUIQQFaceView mQQFace1; + @BindView(R.id.qqface2) QMUIQQFaceView mQQFace2; + @BindView(R.id.qqface3) QMUIQQFaceView mQQFace3; + @BindView(R.id.qqface4) QMUIQQFaceView mQQFace4; + @BindView(R.id.qqface5) QMUIQQFaceView mQQFace5; + @BindView(R.id.qqface6) QMUIQQFaceView mQQFace6; + @BindView(R.id.qqface7) QMUIQQFaceView mQQFace7; + @BindView(R.id.qqface8) QMUIQQFaceView mQQFace8; + @BindView(R.id.qqface9) QMUIQQFaceView mQQFace9; + @BindView(R.id.qqface10) QMUIQQFaceView mQQFace10; + @BindView(R.id.qqface11) QMUIQQFaceView mQQFace11; + @BindView(R.id.qqface12) QMUIQQFaceView mQQFace12; + @BindView(R.id.qqface13) QMUIQQFaceView mQQFace13; @Override protected View onCreateView() { diff --git a/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/fragment/components/qqface/QDQQFaceView.java b/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/fragment/components/qqface/QDQQFaceView.java deleted file mode 100644 index 84c62021..00000000 --- a/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/fragment/components/qqface/QDQQFaceView.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Tencent is pleased to support the open source community by making QMUI_Android available. - * - * Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the MIT License (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * - * http://opensource.org/licenses/MIT - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is - * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, - * either express or implied. See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.qmuiteam.qmuidemo.fragment.components.qqface; - -import android.content.Context; -import android.util.AttributeSet; - -import com.qmuiteam.qmui.qqface.QMUIQQFaceCompiler; -import com.qmuiteam.qmui.qqface.QMUIQQFaceView; -import com.qmuiteam.qmuidemo.QDQQFaceManager; - -/** - * @author cginechen - * @date 2016-12-24 - */ - -public class QDQQFaceView extends QMUIQQFaceView { - public QDQQFaceView(Context context) { - this(context, null); - } - - public QDQQFaceView(Context context, AttributeSet attrs) { - super(context, attrs); - setCompiler(QMUIQQFaceCompiler.getInstance(QDQQFaceManager.getInstance())); - } -} diff --git a/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/fragment/components/qqface/pageView/QDQQFacePagerView.java b/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/fragment/components/qqface/pageView/QDQQFacePagerView.java index 55e01aab..45537e18 100644 --- a/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/fragment/components/qqface/pageView/QDQQFacePagerView.java +++ b/qmuidemo/src/main/java/com/qmuiteam/qmuidemo/fragment/components/qqface/pageView/QDQQFacePagerView.java @@ -44,8 +44,6 @@ public class QDQQFacePagerView extends QDQQFaceBasePagerView { QMUIQQFaceView qmuiqqFaceView; if (convertView == null || !(convertView instanceof QMUIQQFaceView)) { qmuiqqFaceView = new QMUIQQFaceView(getContext()); - qmuiqqFaceView.setCompiler(QMUIQQFaceCompiler.getInstance( - QDQQFaceManager.getInstance())); int padding = QMUIDisplayHelper.dp2px(getContext(), 16); ViewCompat.setBackground(qmuiqqFaceView, QMUIResHelper.getAttrDrawable( getContext(), R.attr.qmui_s_list_item_bg_with_border_bottom)); diff --git a/qmuidemo/src/main/res/layout/fragment_qqface_layout.xml b/qmuidemo/src/main/res/layout/fragment_qqface_layout.xml index 7061a961..d9436a83 100644 --- a/qmuidemo/src/main/res/layout/fragment_qqface_layout.xml +++ b/qmuidemo/src/main/res/layout/fragment_qqface_layout.xml @@ -41,7 +41,7 @@ - - - - - - - - - - - - -