19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.text.style; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 196d0474944aadc24daf31807273251a5573dcb982Florina Muntenescuimport android.annotation.FloatRange; 206d0474944aadc24daf31807273251a5573dcb982Florina Muntenescuimport android.annotation.NonNull; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.ParcelableSpan; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextPaint; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 266d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu/** 276d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu * Scales horizontally the size of the text to which it's attached by a certain factor. 286d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu * <p> 296d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu * Values > 1.0 will stretch the text wider. Values < 1.0 will stretch the text narrower. 306d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu * <p> 316d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu * For example, a <code>ScaleXSpan</code> that stretches the text size by 100% can be 326d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu * constructed like this: 336d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu * <pre>{@code 346d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu * SpannableString string = new SpannableString("Text with ScaleX span"); 356d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu *string.setSpan(new ScaleXSpan(2f), 10, 16, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}</pre> 366d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu * <img src="{@docRoot}reference/android/images/text/style/scalexspan.png" /> 376d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu * <figcaption>Text scaled by 100% with <code>ScaleXSpan</code>.</figcaption> 386d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu */ 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ScaleXSpan extends MetricAffectingSpan implements ParcelableSpan { 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 418a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock private final float mProportion; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 436d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu /** 446d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu * Creates a {@link ScaleXSpan} based on a proportion. Values > 1.0 will stretch the text wider. 456d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu * Values < 1.0 will stretch the text narrower. 466d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu * 476d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu * @param proportion the horizontal scale factor. 486d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu */ 496d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu public ScaleXSpan(@FloatRange(from = 0) float proportion) { 508a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock mProportion = proportion; 518a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock } 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 536d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu /** 546d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu * Creates a {@link ScaleXSpan} from a parcel. 556d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu */ 566d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu public ScaleXSpan(@NonNull Parcel src) { 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProportion = src.readFloat(); 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 596d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu 606d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu @Override 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getSpanTypeId() { 62a70d4a90a029910f788c3e7f8715cf3b842b1e2bAlan Viverette return getSpanTypeIdInternal(); 63a70d4a90a029910f788c3e7f8715cf3b842b1e2bAlan Viverette } 64a70d4a90a029910f788c3e7f8715cf3b842b1e2bAlan Viverette 65a70d4a90a029910f788c3e7f8715cf3b842b1e2bAlan Viverette /** @hide */ 666d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu @Override 67a70d4a90a029910f788c3e7f8715cf3b842b1e2bAlan Viverette public int getSpanTypeIdInternal() { 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TextUtils.SCALE_X_SPAN; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 706d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu 716d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu @Override 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 766d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu @Override 776d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu public void writeToParcel(@NonNull Parcel dest, int flags) { 78a70d4a90a029910f788c3e7f8715cf3b842b1e2bAlan Viverette writeToParcelInternal(dest, flags); 79a70d4a90a029910f788c3e7f8715cf3b842b1e2bAlan Viverette } 80a70d4a90a029910f788c3e7f8715cf3b842b1e2bAlan Viverette 81a70d4a90a029910f788c3e7f8715cf3b842b1e2bAlan Viverette /** @hide */ 826d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu @Override 836d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu public void writeToParcelInternal(@NonNull Parcel dest, int flags) { 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest.writeFloat(mProportion); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 876d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu /** 886d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu * Get the horizontal scale factor for the text. 896d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu * 906d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu * @return the horizontal scale factor. 916d0474944aadc24daf31807273251a5573dcb982Florina Muntenescu */ 928a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock public float getScaleX() { 938a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock return mProportion; 948a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock } 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 968a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock @Override 978a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock public void updateDrawState(TextPaint ds) { 988a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock ds.setTextScaleX(ds.getTextScaleX() * mProportion); 998a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock } 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1018a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock @Override 1028a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock public void updateMeasureState(TextPaint ds) { 1038a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock ds.setTextScaleX(ds.getTextScaleX() * mProportion); 1048a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock } 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 106