-
-
Save nuovothoth/b95983dfa38c2e794cd2570f156faa0a to your computer and use it in GitHub Desktop.
A custom TextView that can shrink its text size to fit in a single line
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Forked from: http://androidxref.com/4.1.1/xref/frameworks/base/core/java/com/android/internal/widget/DialogTitle.java | |
* Created by LeoLink on 2014-06-30. | |
*/ | |
import android.annotation.SuppressLint; | |
import android.content.Context; | |
import android.support.annotation.Nullable; | |
import android.text.Layout; | |
import android.text.TextUtils; | |
import android.util.AttributeSet; | |
import android.util.Log; | |
import android.util.TypedValue; | |
import android.widget.TextView; | |
@SuppressLint("AppCompatCustomView") | |
public class SingleLineTextView extends TextView { | |
private static final String TAG = SingleLineTextView.class.getSimpleName(); | |
private static final int MIN_TEXT_SIZE = 10; | |
public SingleLineTextView(Context context) { | |
super(context); | |
setSingleLine(); | |
setEllipsize(TextUtils.TruncateAt.END); | |
} | |
public SingleLineTextView(Context context, @Nullable AttributeSet attrs) { | |
super(context, attrs); | |
setSingleLine(); | |
setEllipsize(TextUtils.TruncateAt.END); | |
} | |
public SingleLineTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { | |
super(context, attrs, defStyleAttr); | |
setSingleLine(); | |
setEllipsize(TextUtils.TruncateAt.END); | |
} | |
@Override | |
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { | |
super.onMeasure(widthMeasureSpec, heightMeasureSpec); | |
Layout layout = getLayout(); | |
if (layout != null) { | |
int lineCount = layout.getLineCount(); | |
if (lineCount > 0) { | |
boolean isEllipsis = true; | |
while(isEllipsis) { | |
int ellipsisCount = layout.getEllipsisCount(lineCount - 1); | |
float textSize = getTextSize(); | |
if (ellipsisCount > 0 && textSize > MIN_TEXT_SIZE) { | |
Log.d(TAG, "Text is ellipsized"); | |
// textSize is already expressed in pixels | |
setTextSize(TypedValue.COMPLEX_UNIT_PX, (textSize - 1)); | |
super.onMeasure(widthMeasureSpec, heightMeasureSpec); //setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec)); | |
}else{ | |
isEllipsis = false; | |
} | |
} | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment