1 /* 2 * Copyright (C) 2006 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.text.style; 18 19 import android.annotation.NonNull; 20 import android.text.TextPaint; 21 22 /** 23 * The classes that affect character-level text formatting in a way that 24 * changes the width or height of characters extend this class. 25 */ 26 public abstract class MetricAffectingSpan 27 extends CharacterStyle 28 implements UpdateLayout { 29 30 /** 31 * Classes that extend MetricAffectingSpan implement this method to update the text formatting 32 * in a way that can change the width or height of characters. 33 * 34 * @param textPaint the paint used for drawing the text 35 */ updateMeasureState(@onNull TextPaint textPaint)36 public abstract void updateMeasureState(@NonNull TextPaint textPaint); 37 38 /** 39 * Returns "this" for most MetricAffectingSpans, but for 40 * MetricAffectingSpans that were generated by {@link #wrap}, 41 * returns the underlying MetricAffectingSpan. 42 */ 43 @Override getUnderlying()44 public MetricAffectingSpan getUnderlying() { 45 return this; 46 } 47 48 /** 49 * A Passthrough MetricAffectingSpan is one that 50 * passes {@link #updateDrawState} and {@link #updateMeasureState} 51 * calls through to the specified MetricAffectingSpan 52 * while still being a distinct object, 53 * and is therefore able to be attached to the same Spannable 54 * to which the specified MetricAffectingSpan is already attached. 55 */ 56 /* package */ static class Passthrough extends MetricAffectingSpan { 57 private MetricAffectingSpan mStyle; 58 59 /** 60 * Creates a new Passthrough of the specfied MetricAffectingSpan. 61 */ Passthrough(@onNull MetricAffectingSpan cs)62 Passthrough(@NonNull MetricAffectingSpan cs) { 63 mStyle = cs; 64 } 65 66 /** 67 * Passes updateDrawState through to the underlying MetricAffectingSpan. 68 */ 69 @Override updateDrawState(@onNull TextPaint tp)70 public void updateDrawState(@NonNull TextPaint tp) { 71 mStyle.updateDrawState(tp); 72 } 73 74 /** 75 * Passes updateMeasureState through to the underlying MetricAffectingSpan. 76 */ 77 @Override updateMeasureState(@onNull TextPaint tp)78 public void updateMeasureState(@NonNull TextPaint tp) { 79 mStyle.updateMeasureState(tp); 80 } 81 82 /** 83 * Returns the MetricAffectingSpan underlying this one, or the one 84 * underlying it if it too is a Passthrough. 85 */ 86 @Override getUnderlying()87 public MetricAffectingSpan getUnderlying() { 88 return mStyle.getUnderlying(); 89 } 90 } 91 } 92