diff options
Diffstat (limited to 'src/me/grantland/widget/AutofitTextView.java')
-rw-r--r-- | src/me/grantland/widget/AutofitTextView.java | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/src/me/grantland/widget/AutofitTextView.java b/src/me/grantland/widget/AutofitTextView.java new file mode 100644 index 000000000..f21a9c1bf --- /dev/null +++ b/src/me/grantland/widget/AutofitTextView.java @@ -0,0 +1,208 @@ +/* + * Copyright (C) 2014 Grantland Chew + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package me.grantland.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.widget.TextView; + +/** + * A {@link TextView} that re-sizes its text to be no larger than the width of the view. + * + * @attr ref R.styleable.AutofitTextView_sizeToFit + * @attr ref R.styleable.AutofitTextView_minTextSize + * @attr ref R.styleable.AutofitTextView_precision + */ +public class AutofitTextView extends TextView implements AutofitHelper.OnTextSizeChangeListener { + + private AutofitHelper mHelper; + + public AutofitTextView(Context context) { + super(context); + init(context, null, 0); + } + + public AutofitTextView(Context context, AttributeSet attrs) { + super(context, attrs); + init(context, attrs, 0); + } + + public AutofitTextView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(context, attrs, defStyle); + } + + private void init(Context context, AttributeSet attrs, int defStyle) { + mHelper = AutofitHelper.create(this, attrs, defStyle) + .addOnTextSizeChangeListener(this); + } + + // Getters and Setters + + /** + * {@inheritDoc} + */ + @Override + public void setTextSize(int unit, float size) { + super.setTextSize(unit, size); + if (mHelper != null) { + mHelper.setTextSize(unit, size); + } + } + + /** + * {@inheritDoc} + */ + @Override + public void setLines(int lines) { + super.setLines(lines); + if (mHelper != null) { + mHelper.setMaxLines(lines); + } + } + + /** + * {@inheritDoc} + */ + @Override + public void setMaxLines(int maxLines) { + super.setMaxLines(maxLines); + if (mHelper != null) { + mHelper.setMaxLines(maxLines); + } + } + + /** + * Returns the {@link AutofitHelper} for this View. + */ + public AutofitHelper getAutofitHelper() { + return mHelper; + } + + /** + * Returns whether or not the text will be automatically re-sized to fit its constraints. + */ + public boolean isSizeToFit() { + return mHelper.isEnabled(); + } + + /** + * Sets the property of this field (sizeToFit), to automatically resize the text to fit its + * constraints. + */ + public void setSizeToFit() { + setSizeToFit(true); + } + + /** + * If true, the text will automatically be re-sized to fit its constraints; if false, it will + * act like a normal TextView. + * + * @param sizeToFit + */ + public void setSizeToFit(boolean sizeToFit) { + mHelper.setEnabled(sizeToFit); + } + + /** + * Returns the maximum size (in pixels) of the text in this View. + */ + public float getMaxTextSize() { + return mHelper.getMaxTextSize(); + } + + /** + * Set the maximum text size to the given value, interpreted as "scaled pixel" units. This size + * is adjusted based on the current density and user font size preference. + * + * @param size The scaled pixel size. + * + * @attr ref android.R.styleable#TextView_textSize + */ + public void setMaxTextSize(float size) { + mHelper.setMaxTextSize(size); + } + + /** + * Set the maximum text size to a given unit and value. See TypedValue for the possible + * dimension units. + * + * @param unit The desired dimension unit. + * @param size The desired size in the given units. + * + * @attr ref android.R.styleable#TextView_textSize + */ + public void setMaxTextSize(int unit, float size) { + mHelper.setMaxTextSize(unit, size); + } + + /** + * Returns the minimum size (in pixels) of the text in this View. + */ + public float getMinTextSize() { + return mHelper.getMinTextSize(); + } + + /** + * Set the minimum text size to the given value, interpreted as "scaled pixel" units. This size + * is adjusted based on the current density and user font size preference. + * + * @param minSize The scaled pixel size. + * + * @attr ref me.grantland.R.styleable#AutofitTextView_minTextSize + */ + public void setMinTextSize(int minSize) { + mHelper.setMinTextSize(TypedValue.COMPLEX_UNIT_SP, minSize); + } + + /** + * Set the minimum text size to a given unit and value. See TypedValue for the possible + * dimension units. + * + * @param unit The desired dimension unit. + * @param minSize The desired size in the given units. + * + * @attr ref me.grantland.R.styleable#AutofitTextView_minTextSize + */ + public void setMinTextSize(int unit, float minSize) { + mHelper.setMinTextSize(unit, minSize); + } + + /** + * Returns the amount of precision used to calculate the correct text size to fit within its + * bounds. + */ + public float getPrecision() { + return mHelper.getPrecision(); + } + + /** + * Set the amount of precision used to calculate the correct text size to fit within its + * bounds. Lower precision is more precise and takes more time. + * + * @param precision The amount of precision. + */ + public void setPrecision(float precision) { + mHelper.setPrecision(precision); + } + + @Override + public void onTextSizeChange(float textSize, float oldTextSize) { + // do nothing + } +} |