AsyncDrawable defer invalidation
This commit is contained in:
		
							parent
							
								
									2a43797023
								
							
						
					
					
						commit
						b6fa66914f
					
				| @ -7,6 +7,7 @@ | ||||
| * Add `requirePlugin(Class)` and `getPlugins` for `Markwon` instance | ||||
| * TablePlugin -> defer table invalidation (via `View.post`), so only one invalidation  | ||||
| happens with each draw-call | ||||
| * AsyncDrawableSpan -> defer invalidation | ||||
| 
 | ||||
| # 4.0.2 | ||||
| * Fix `JLatexMathPlugin` formula placeholder (cannot have line breaks) ([#149]) | ||||
|  | ||||
| @ -57,11 +57,14 @@ public abstract class AsyncDrawableScheduler { | ||||
|                 textView.setTag(R.id.markwon_drawables_scheduler, listener); | ||||
|             } | ||||
| 
 | ||||
|             // @since 4.1.0-SNAPSHOT | ||||
|             final DrawableCallbackImpl.Invalidator invalidator = new TextViewInvalidator(textView); | ||||
| 
 | ||||
|             AsyncDrawable drawable; | ||||
| 
 | ||||
|             for (AsyncDrawableSpan span : spans) { | ||||
|                 drawable = span.getDrawable(); | ||||
|                 drawable.setCallback2(new DrawableCallbackImpl(textView, drawable.getBounds())); | ||||
|                 drawable.setCallback2(new DrawableCallbackImpl(textView, invalidator, drawable.getBounds())); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @ -109,11 +112,23 @@ public abstract class AsyncDrawableScheduler { | ||||
| 
 | ||||
|     private static class DrawableCallbackImpl implements Drawable.Callback { | ||||
| 
 | ||||
|         // @since 4.1.0-SNAPSHOT | ||||
|         // interface to be used when bounds change and view must be invalidated | ||||
|         interface Invalidator { | ||||
|             void invalidate(); | ||||
|         } | ||||
| 
 | ||||
|         private final TextView view; | ||||
|         private final Invalidator invalidator; // @since 4.1.0-SNAPSHOT | ||||
| 
 | ||||
|         private Rect previousBounds; | ||||
| 
 | ||||
|         DrawableCallbackImpl(TextView view, Rect initialBounds) { | ||||
|         DrawableCallbackImpl( | ||||
|                 @NonNull TextView view, | ||||
|                 @NonNull Invalidator invalidator, | ||||
|                 Rect initialBounds) { | ||||
|             this.view = view; | ||||
|             this.invalidator = invalidator; | ||||
|             this.previousBounds = new Rect(initialBounds); | ||||
|         } | ||||
| 
 | ||||
| @ -136,8 +151,10 @@ public abstract class AsyncDrawableScheduler { | ||||
|             // but if the size has changed, then we need to update the whole layout... | ||||
| 
 | ||||
|             if (!previousBounds.equals(rect)) { | ||||
|                 // the only method that seems to work when bounds have changed | ||||
|                 view.setText(view.getText()); | ||||
|                 // @since 4.1.0-SNAPSHOT | ||||
|                 // invalidation moved to upper level (so invalidation can be deferred, | ||||
|                 // and multiple calls combined) | ||||
|                 invalidator.invalidate(); | ||||
|                 previousBounds = new Rect(rect); | ||||
|             } else { | ||||
| 
 | ||||
| @ -156,4 +173,24 @@ public abstract class AsyncDrawableScheduler { | ||||
|             view.removeCallbacks(what); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private static class TextViewInvalidator implements DrawableCallbackImpl.Invalidator, Runnable { | ||||
| 
 | ||||
|         private final TextView textView; | ||||
| 
 | ||||
|         TextViewInvalidator(@NonNull TextView textView) { | ||||
|             this.textView = textView; | ||||
|         } | ||||
| 
 | ||||
|         @Override | ||||
|         public void invalidate() { | ||||
|             textView.removeCallbacks(this); | ||||
|             textView.post(this); | ||||
|         } | ||||
| 
 | ||||
|         @Override | ||||
|         public void run() { | ||||
|             textView.setText(textView.getText()); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Dimitry Ivanov
						Dimitry Ivanov