package com.kescoode.adk.ui;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.os.Build;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.view.View;
import com.kescoode.adk.view.Views;
/**
* 圆形的Logo,用于如个人头像,标题栏等等
*
* @author Kesco Lin
*/
public class CircleLogo extends View {
private String logoText;
private int logoColor;
private int logoTextColor;
private int logoSize;
private float logoTextSize;
public CircleLogo(Context context) {
this(context, null);
}
public CircleLogo(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CircleLogo(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
construct(context, attrs, defStyleAttr);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public CircleLogo(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
construct(context, attrs, defStyleAttr);
}
private void construct(Context context, AttributeSet attrs, int defStyleAttr) {
readAttr(context, attrs, defStyleAttr);
Views.setBackground(this, createDrawable(logoColor));
}
private void readAttr(Context context, AttributeSet attrs, int defStyleAttr) {
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleLogoAttrs, defStyleAttr, 0);
if (a != null) {
try {
logoColor = a.getColor(R.styleable.CircleLogoAttrs_logo_color,
getResources().getColor(R.color.adk_grey_blue));
logoTextColor = a.getColor(R.styleable.CircleLogoAttrs_logo_text_color,
getResources().getColor(R.color.adk_white));
logoSize = a.getDimensionPixelSize(R.styleable.CircleLogoAttrs_logo_size,
getResources().getDimensionPixelSize(R.dimen.default_circle_logo_size));
logoTextSize = a.getDimension(R.styleable.CircleLogoAttrs_logo_text_size,
getResources().getDimension(R.dimen.default_circle_logo_text_size));
String defaultText = a.getString(R.styleable.CircleLogoAttrs_logo_text);
logoText = defaultText == null ?
getResources().getString(R.string.default_circle_logo_text) : defaultText;
} finally {
a.recycle();
}
}
}
private Drawable createDrawable(int color) {
OvalShape ovalShape = new OvalShape();
ShapeDrawable shapeDrawable = new ShapeDrawable(ovalShape);
shapeDrawable.getPaint().setColor(color);
return shapeDrawable;
}
@Override
protected void onDraw(@NonNull Canvas canvas) {
super.onDraw(canvas);
drawText(canvas, logoText);
}
private void drawText(Canvas canvas, String text) {
Paint paint = new Paint();
paint.setColor(logoTextColor);
paint.setStyle(Paint.Style.FILL);
paint.setTextSize(logoTextSize);
paint.setTypeface(Typeface.SANS_SERIF);
paint.setTextAlign(Paint.Align.CENTER);
float xPos = canvas.getWidth() / 2;
Paint.FontMetrics fontMetrics = paint.getFontMetrics();
float height = canvas.getHeight();
float fontHeight = fontMetrics.bottom - fontMetrics.top;
// TODO: 垂直置中的算法仍还要优化
float yPos = (height - fontHeight) / 2 - fontMetrics.top;
canvas.drawText(text, xPos, yPos, paint);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(logoSize, logoSize);
}
public void setLogoText(@NonNull String text) {
if (text.length() != 1) {
throw new IllegalArgumentException("The input text must have 1 character length.");
}
logoText = text;
invalidate();
}
public void setLogoColor(int color) {
logoColor = color;
Views.setBackground(this, createDrawable(color));
}
}