From da513e68c34a554fa01db309fa73c378bee8006f Mon Sep 17 00:00:00 2001 From: "yuhei.g" Date: Fri, 9 Sep 2022 14:35:47 +0900 Subject: [PATCH 1/4] Prepare for next iteration --- library/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/build.gradle b/library/build.gradle index 5e3998a..8e692ba 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -39,7 +39,7 @@ afterEvaluate { artifact tasks.androidSourcesJar groupId = 'jp.tomorrowkey.android.gifplayer' artifactId = 'gifplayer' - version = '1.3.0' + version = '1.3.1-SNAPSHOT' } } } From f50276c2504b0f128a1630a68f6fc23151dcf294 Mon Sep 17 00:00:00 2001 From: "yuhei.g" Date: Fri, 9 Sep 2022 14:38:46 +0900 Subject: [PATCH 2/4] Fix stop the process if text is `SpannedEllipsizer` in `GifSpan#draw` and `getSize`. If text is `android.text.Layout.SpannedEllipsizer`, `text ! = view.getText()` will be false and stop. So changed to stop processing when `spanned.getSpanStart(this) == -1` --- .../android/gifplayer/GifSpan.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/library/src/main/java/jp/tomorrowkey/android/gifplayer/GifSpan.java b/library/src/main/java/jp/tomorrowkey/android/gifplayer/GifSpan.java index 01ee5f7..99a4e39 100644 --- a/library/src/main/java/jp/tomorrowkey/android/gifplayer/GifSpan.java +++ b/library/src/main/java/jp/tomorrowkey/android/gifplayer/GifSpan.java @@ -8,6 +8,7 @@ import android.graphics.Paint.FontMetricsInt; import android.os.AsyncTask; import android.text.Editable; +import android.text.Spanned; import android.text.style.ReplacementSpan; import android.util.TypedValue; import android.view.View; @@ -72,10 +73,11 @@ public int getSize(Paint paint, CharSequence text, int start, int end, if (view == null) { return 0; } - if (text != view.getText()) { - // Don't use equals because SpannableStringBuilder#equals was broken - // https://android.googlesource.com/platform/frameworks/base/+/6b4380ea5f71f031d1105d8986c813fefe056794 - return 0; + if (text instanceof Spanned) { + Spanned spanned = (Spanned) text; + if (spanned.getSpanStart(this) == -1) { + return 0; + } } if (scaleToTextSize > 0) { @@ -103,10 +105,12 @@ public void draw(Canvas canvas, CharSequence text, int start, int end, if (view == null) { return; } - if (text != view.getText()) { - // Don't use equals because SpannableStringBuilder#equals was broken - // https://android.googlesource.com/platform/frameworks/base/+/6b4380ea5f71f031d1105d8986c813fefe056794 - return; + if (text instanceof Spanned) { + Spanned spanned = (Spanned) text; + if (spanned.getSpanStart(this) == -1) { + Timber.tag(TAG).d("return"); + return; + } } if (decodeStatus == DECODE_STATUS_UNDECODE) { From 2f87435070a6137e41774ebace61e71c667c8065 Mon Sep 17 00:00:00 2001 From: "yuhei.g" Date: Thu, 22 Sep 2022 16:37:57 +0900 Subject: [PATCH 3/4] Remove unnecessary logging --- .../src/main/java/jp/tomorrowkey/android/gifplayer/GifSpan.java | 1 - 1 file changed, 1 deletion(-) diff --git a/library/src/main/java/jp/tomorrowkey/android/gifplayer/GifSpan.java b/library/src/main/java/jp/tomorrowkey/android/gifplayer/GifSpan.java index 99a4e39..3584ec4 100644 --- a/library/src/main/java/jp/tomorrowkey/android/gifplayer/GifSpan.java +++ b/library/src/main/java/jp/tomorrowkey/android/gifplayer/GifSpan.java @@ -108,7 +108,6 @@ public void draw(Canvas canvas, CharSequence text, int start, int end, if (text instanceof Spanned) { Spanned spanned = (Spanned) text; if (spanned.getSpanStart(this) == -1) { - Timber.tag(TAG).d("return"); return; } } From 0a07cddf54e7ae80096091990dcbbc4f2e3ebb81 Mon Sep 17 00:00:00 2001 From: "yuhei.g" Date: Mon, 26 Sep 2022 13:38:37 +0900 Subject: [PATCH 4/4] Add sample for oneline SpannedEllipsizer --- .../gifplayer/example/MainActivity.java | 34 +++++++++++++++++-- example/src/main/res/layout/main.xml | 27 ++++++++++++++- example/src/main/res/values/strings.xml | 3 ++ 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/example/src/main/java/jp/tomorrowkey/android/gifplayer/example/MainActivity.java b/example/src/main/java/jp/tomorrowkey/android/gifplayer/example/MainActivity.java index 2caa3fe..3718e59 100644 --- a/example/src/main/java/jp/tomorrowkey/android/gifplayer/example/MainActivity.java +++ b/example/src/main/java/jp/tomorrowkey/android/gifplayer/example/MainActivity.java @@ -6,11 +6,13 @@ import android.os.HandlerThread; import android.text.Editable; import android.text.Spannable; +import android.text.SpannableStringBuilder; import android.text.TextWatcher; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; +import android.widget.TextView; import jp.tomorrowkey.android.gifplayer.GifSpan; import jp.tomorrowkey.android.gifplayer.GifView; @@ -22,6 +24,7 @@ public class MainActivity extends Activity implements OnClickListener, TextWatch private GifView gifView; private EditText editText; + private TextView textView; static { Timber.plant(new Timber.DebugTree()); @@ -41,6 +44,9 @@ public void onCreate(Bundle savedInstanceState) { final Button btnStop = findViewById(R.id.btnStop); final Button btnPrevFrame = findViewById(R.id.btnPrevFrame); final Button btnNextFrame = findViewById(R.id.btnNextFrame); + final Button btnInput = findViewById(R.id.btnInput); + final Button btnClear = findViewById(R.id.btnClear); + textView = findViewById(R.id.textView); editText = findViewById(R.id.editText); gifView.setGif(R.drawable.break_droid); @@ -49,6 +55,8 @@ public void onCreate(Bundle savedInstanceState) { btnStop.setOnClickListener(this); btnPrevFrame.setOnClickListener(this); btnNextFrame.setOnClickListener(this); + btnInput.setOnClickListener(this); + btnClear.setOnClickListener(this); editText.addTextChangedListener(this); } @@ -66,6 +74,10 @@ public void onClick(View v) { gifView.prevFrame(); } else if (id == R.id.btnNextFrame) { gifView.nextFrame(); + } else if (id == R.id.btnInput) { + inputText(); + } else if (id == R.id.btnClear) { + clearText(); } } @@ -87,6 +99,10 @@ public void onTextChanged(final CharSequence s, final int start, final int befor } } + @Override + public void afterTextChanged(Editable editable) { + } + private boolean hasGifSpan(final Spannable s, final int position) { final GifSpan[] gifSpans = s.getSpans(position, position + 1, GifSpan.class); if (gifSpans != null) { @@ -104,8 +120,22 @@ private boolean hasGifSpan(final Spannable s, final int position) { return false; } - @Override - public void afterTextChanged(Editable s) { + private void inputText() { + CharSequence s = editText.getText(); + final Spannable spannable = new SpannableStringBuilder(s.toString()); + final int count = spannable.length(); + + for (int i = 0; i < count; i++) { + if (hasGifSpan(spannable, i)) continue; + final GifSpan span = new GifSpan(textView, R.drawable.break_droid, 1.4f); + span.start(); + spannable.setSpan(span, i, i + 1, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + } + textView.setText(spannable, TextView.BufferType.SPANNABLE); + } + private void clearText() { + editText.getText().clear(); } } \ No newline at end of file diff --git a/example/src/main/res/layout/main.xml b/example/src/main/res/layout/main.xml index 3acdb81..e61e555 100644 --- a/example/src/main/res/layout/main.xml +++ b/example/src/main/res/layout/main.xml @@ -46,7 +46,32 @@ + + + + + android:orientation="horizontal"> + +