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