-
-
Save Bhavdip/6ee99d05c754ac4a5063e571e9c7cc4a to your computer and use it in GitHub Desktop.
[SeparatorTextViewSample:SeparatorTextView] #tags:Android
This file contains hidden or 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
<?xml version="1.0" encoding="utf-8"?> | |
<resources> | |
<declare-styleable name="SeparatorTextViewFull"> | |
<attr name="dividerResId" format="reference"/> | |
<attr name="dividerColor" format="color"/> | |
<attr name="dividerHeight" format="dimension"/> | |
<attr name="dividerTextPadding" format="dimension"/> | |
</declare-styleable> | |
</resources> |
This file contains hidden or 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
import android.annotation.TargetApi; | |
import android.content.Context; | |
import android.graphics.Canvas; | |
import android.graphics.Paint; | |
import android.os.Build; | |
import android.util.AttributeSet; | |
import android.view.Gravity; | |
import android.widget.TextView; | |
/** | |
* Simple version used in the article: | |
* https://medium.com/@ali.muzaffar/creating-a-custom-textview-as-a-section-header-73cb8e194917 | |
*/ | |
public class SeparatorTextView extends TextView { | |
public SeparatorTextView(Context context) { | |
super(context); | |
} | |
public SeparatorTextView(Context context, AttributeSet attrs) { | |
super(context, attrs); | |
} | |
public SeparatorTextView(Context context, AttributeSet attrs, int defStyleAttr) { | |
super(context, attrs, defStyleAttr); | |
} | |
@TargetApi(Build.VERSION_CODES.LOLLIPOP) | |
public SeparatorTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { | |
super(context, attrs, defStyleAttr, defStyleRes); | |
} | |
@Override | |
protected void onDraw(Canvas canvas) { | |
super.onDraw(canvas); | |
// we use the default paint, | |
// our line will be the same color as the text. | |
Paint paint = getPaint(); | |
//start at the vertical center of the textview | |
int top = (getHeight() + getPaddingTop() - getPaddingBottom())/2; | |
//start at the left margin | |
int left = getPaddingLeft(); | |
//we draw all the way to the right | |
int right = getWidth() - getPaddingRight(); | |
//we want the line to be 2 pixel thick | |
int bottom = top + 2; | |
int horizontalCenter = (getWidth() + getPaddingLeft() - getPaddingRight()) / 2; | |
int textWidth = (int) paint.measureText(getText().toString()); | |
int halfTextWidth = textWidth/2; | |
int padding = 16; | |
int gravity = getGravity(); | |
if ((gravity & Gravity.LEFT) == Gravity.LEFT) { | |
canvas.drawRect(left + textWidth + padding, //left | |
top, | |
right, | |
bottom, | |
paint); | |
} else if ((gravity & Gravity.RIGHT) == Gravity.RIGHT) { | |
canvas.drawRect(left, | |
top, | |
right - textWidth - padding, //right | |
bottom, | |
paint); | |
} else { | |
canvas.drawRect(left, | |
top, | |
horizontalCenter - halfTextWidth - padding, //right | |
bottom, | |
paint); | |
canvas.drawRect(horizontalCenter + halfTextWidth + padding, //left | |
top, | |
right, | |
bottom, | |
paint); | |
} | |
} | |
} |
This file contains hidden or 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
import android.annotation.TargetApi; | |
import android.content.Context; | |
import android.content.res.ColorStateList; | |
import android.content.res.TypedArray; | |
import android.graphics.Canvas; | |
import android.graphics.Paint; | |
import android.graphics.drawable.Drawable; | |
import android.graphics.drawable.NinePatchDrawable; | |
import android.os.Build; | |
import android.util.AttributeSet; | |
import android.util.TypedValue; | |
import android.view.Gravity; | |
import android.widget.TextView; | |
/** | |
* use along with attrs.xml | |
* dividerResId will be used if provided | |
* dividerHeight, dividerColor are only used if dividerResId is not provided. | |
* dividerTextPadding is the space between the lines and the text. | |
*/ | |
public class SeparatorTextViewFull extends TextView { | |
private static final int[] ATTRS = new int[]{android.R.attr.listDivider}; | |
private Drawable mDivider; | |
private Paint mDividerPaint; | |
int mPadding = 16; | |
int mDividerColor = -1; | |
int mDividerHeight = 2; | |
boolean isNinePatch = false; | |
public SeparatorTextViewFull(Context context) { | |
super(context); | |
init(context, null); | |
} | |
public SeparatorTextViewFull(Context context, AttributeSet attrs) { | |
super(context, attrs); | |
init(context, attrs); | |
} | |
public SeparatorTextViewFull(Context context, AttributeSet attrs, int defStyleAttr) { | |
super(context, attrs, defStyleAttr); | |
init(context, attrs); | |
} | |
@TargetApi(Build.VERSION_CODES.LOLLIPOP) | |
public SeparatorTextViewFull(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { | |
super(context, attrs, defStyleAttr, defStyleRes); | |
init(context, attrs); | |
} | |
@Override | |
protected void onDraw(Canvas c) { | |
super.onDraw(c); | |
int left = getPaddingLeft(); | |
int top = getPaddingTop(); | |
int bottom = getHeight() - getPaddingBottom(); | |
if (isNinePatch || mDivider == null) { | |
top = (getHeight() + getPaddingTop()) / 2; | |
if (mDivider != null) { | |
bottom = top + mDivider.getIntrinsicHeight(); | |
} else { | |
bottom = top + mDividerHeight; | |
if (mDividerHeight > 1) { | |
bottom -= mDividerHeight / 2; | |
top -= mDividerHeight / 2; | |
} | |
} | |
} | |
int right = getWidth() - getPaddingRight(); | |
int textWidth = (int) getTextSize(); | |
int gravity = getGravity(); | |
if ((gravity & Gravity.LEFT) == Gravity.LEFT) { | |
if (mDivider != null) { | |
mDivider.setBounds(left + textWidth + mPadding, top, right, bottom); | |
mDivider.draw(c); | |
} else { | |
c.drawRect(left + textWidth + mPadding, top, right, bottom, mDividerPaint); | |
} | |
} else if ((gravity & Gravity.RIGHT) == Gravity.RIGHT) { | |
if (mDivider != null) { | |
mDivider.setBounds(left, top, right - textWidth - mPadding, bottom); | |
mDivider.draw(c); | |
} else { | |
c.drawRect(left, top, right - textWidth - mPadding, bottom, mDividerPaint); | |
} | |
} else { | |
// int w = c.getWidth(); | |
int w = getWidth() - getPaddingLeft() - getPaddingRight(); | |
int xPos = (w / 2) - textWidth / 2; | |
if (mDivider != null) { | |
mDivider.setBounds(left, top, xPos - mPadding, bottom); | |
mDivider.draw(c); | |
mDivider.setBounds(xPos + textWidth + mPadding, top, right, bottom); | |
mDivider.draw(c); | |
} else { | |
c.drawRect(left, top, xPos - mPadding, bottom, mDividerPaint); | |
c.drawRect(xPos + textWidth + mPadding, top, right, bottom, mDividerPaint); | |
} | |
} | |
} | |
private void init(Context context, AttributeSet attrs) { | |
mDividerPaint = new Paint(); | |
mDividerPaint.setColor(getPaint().getColor()); | |
if (attrs == null) { | |
final TypedArray styledAttributes = context.obtainStyledAttributes(ATTRS); | |
mDivider = styledAttributes.getDrawable(0); | |
styledAttributes.recycle(); | |
} else { | |
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SeparatorTextViewFull, 0, 0); | |
final int N = a.getIndexCount(); | |
for (int i = 0; i < N; i++) { | |
int attr = a.getIndex(i); | |
switch (attr) { | |
case R.styleable.SeparatorTextViewFull_dividerResId: | |
int dividerResId = a.getResourceId(attr, 0); | |
if (dividerResId != 0) { | |
mDivider = context.getResources().getDrawable(dividerResId); | |
isNinePatch = mDivider instanceof NinePatchDrawable; | |
} else { | |
mDivider = null; | |
} | |
break; | |
case R.styleable.SeparatorTextViewFull_dividerTextPadding: | |
int textPadding = a.getDimensionPixelSize(attr, mPadding); | |
if (textPadding != mPadding) { | |
mPadding = textPadding; | |
} | |
break; | |
case R.styleable.SeparatorTextViewFull_dividerHeight: | |
int dividerHeight = a.getDimensionPixelSize(attr, -1); | |
if (dividerHeight != -1) { | |
mDividerHeight = dividerHeight; | |
} else { | |
mDividerHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mDividerHeight, getResources().getDisplayMetrics()); | |
} | |
break; | |
case R.styleable.SeparatorTextViewFull_dividerColor: | |
ColorStateList dividerColor = a.getColorStateList(attr); | |
if (dividerColor != null) { | |
mDividerColor = dividerColor.getColorForState(getDrawableState(), getPaint().getColor()); | |
mDividerPaint.setColor(mDividerColor); | |
} | |
break; | |
} | |
} | |
a.recycle(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment