diff options
| -rw-r--r-- | core/java/android/widget/Editor.java | 32 | ||||
| -rw-r--r-- | core/java/android/widget/TextView.java | 5 |
2 files changed, 36 insertions, 1 deletions
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index 900f0d3e9e77..8d199d7f49b2 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -1339,6 +1339,38 @@ public class Editor { if (translate) canvas.translate(0, -cursorOffsetVertical); } + /** + * Invalidates all the sub-display lists that overlap the specified character range + */ + void invalidateTextDisplayList(Layout layout, int start, int end) { + if (mTextDisplayLists != null && layout instanceof DynamicLayout) { + final int firstLine = layout.getLineForOffset(start); + final int lastLine = layout.getLineForOffset(end); + + DynamicLayout dynamicLayout = (DynamicLayout) layout; + int[] blockEndLines = dynamicLayout.getBlockEndLines(); + int[] blockIndices = dynamicLayout.getBlockIndices(); + final int numberOfBlocks = dynamicLayout.getNumberOfBlocks(); + + int i = 0; + // Skip the blocks before firstLine + while (i < numberOfBlocks) { + if (blockEndLines[i] >= firstLine) break; + i++; + } + + // Invalidate all subsequent blocks until lastLine is passed + while (i < numberOfBlocks) { + final int blockIndex = blockIndices[i]; + if (blockIndex != DynamicLayout.INVALID_BLOCK_INDEX) { + mTextDisplayLists[blockIndex].invalidate(); + } + if (blockEndLines[i] >= lastLine) break; + i++; + } + } + } + void invalidateTextDisplayList() { if (mTextDisplayLists != null) { for (int i = 0; i < mTextDisplayLists.length; i++) { diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 37d9db7bad64..0e7fe7f3eb89 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -6860,7 +6860,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } else { ims.mContentChanged = true; } - if (mEditor != null) getEditor().invalidateTextDisplayList(); + if (mEditor != null) { + if (oldStart >= 0) getEditor().invalidateTextDisplayList(mLayout, oldStart, oldEnd); + if (newStart >= 0) getEditor().invalidateTextDisplayList(mLayout, newStart, newEnd); + } } if (MetaKeyKeyListener.isMetaTracker(buf, what)) { |