package com.duqing.missions.widgets;
|
|
import android.content.Context;
|
import android.content.res.TypedArray;
|
import android.graphics.Bitmap;
|
import android.graphics.Canvas;
|
import android.graphics.Color;
|
import android.graphics.Paint;
|
import android.graphics.Rect;
|
import android.graphics.RectF;
|
import android.graphics.drawable.BitmapDrawable;
|
import android.graphics.drawable.Drawable;
|
import android.util.AttributeSet;
|
import android.util.Log;
|
import android.view.MotionEvent;
|
import android.view.View;
|
|
import androidx.annotation.ColorInt;
|
import androidx.annotation.Nullable;
|
|
import com.duqing.missions.R;
|
import com.duqing.missions.util.DimensionUtils;
|
|
/**
|
* Created by Administrator on 2021/11/1 0001.
|
*/
|
public class TitleBarView extends View {
|
Drawable leftDra,rightDra;
|
private Rect mRect; // 绘制区域
|
private RectF leftClickRect,rightClickRect;//点击事件响应区域
|
String titleText,rightText;
|
@ColorInt int titleColor,rightTextColor;
|
float titleSize,rightTextSize,rightPadding;
|
Paint textPaint,rightTextPaint,drawPaint;
|
int viewWidth,viewHeight;
|
OnClickListener leftClick,rightClick;
|
int touchStartX,touchStartY;
|
|
|
public TitleBarView(Context context) {
|
this(context,null);
|
}
|
|
public TitleBarView(Context context, @Nullable AttributeSet attrs) {
|
this(context, attrs,0);
|
}
|
|
public TitleBarView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
|
super(context, attrs, defStyleAttr);
|
initWidget(context.obtainStyledAttributes(attrs,R.styleable.TitleBarView));
|
}
|
|
public TitleBarView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
super(context, attrs, defStyleAttr, defStyleRes);
|
initWidget(context.obtainStyledAttributes(attrs,R.styleable.TitleBarView));
|
}
|
|
public void initWidget(TypedArray array){
|
leftDra = array.getDrawable(R.styleable.TitleBarView_leftDrawable);
|
rightDra = array.getDrawable(R.styleable.TitleBarView_rightDrawable);
|
titleText = array.getString(R.styleable.TitleBarView_titleText);
|
titleColor = array.getColor(R.styleable.TitleBarView_titleTextColor, Color.BLACK);
|
titleSize = array.getDimension(R.styleable.TitleBarView_titleTextSize, DimensionUtils.convertSpToPixel(getContext(),16));
|
rightText = array.getString(R.styleable.TitleBarView_rightText);
|
rightTextColor = array.getColor(R.styleable.TitleBarView_rightTextColor,Color.BLACK);
|
rightTextSize = array.getDimension(R.styleable.TitleBarView_rightTextSize, DimensionUtils.convertSpToPixel(getContext(),14));
|
rightPadding = array.getDimension(R.styleable.TitleBarView_rightDrawablePadding,10);
|
|
textPaint = new Paint();
|
textPaint.setAntiAlias(true); // 是否抗锯齿
|
//mTextPaint.setAlpha(50); // 设置alpha不透明度,范围为0~255
|
textPaint.setColor(titleColor);
|
textPaint.setTextSize(titleSize);
|
// 设置画笔属性
|
textPaint.setStyle(Paint.Style.FILL);//画笔属性是实心圆
|
// paint.setStyle(Paint.Style.STROKE);//画笔属性是空心圆
|
textPaint.setStrokeWidth(4);//设置画笔粗细
|
|
|
rightTextPaint = new Paint();
|
rightTextPaint.setAntiAlias(true); // 是否抗锯齿
|
//mTextPaint.setAlpha(50); // 设置alpha不透明度,范围为0~255
|
rightTextPaint.setColor(rightTextColor);
|
rightTextPaint.setTextSize(rightTextSize);
|
// 设置画笔属性
|
rightTextPaint.setStyle(Paint.Style.FILL);//画笔属性是实心圆
|
// paint.setStyle(Paint.Style.STROKE);//画笔属性是空心圆
|
rightTextPaint.setStrokeWidth(4);//设置画笔粗细
|
|
}
|
|
@Override
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
viewWidth = getMeasuredWidth() - getPaddingLeft() - getPaddingRight();
|
viewHeight = getMeasuredHeight() - getPaddingTop() - getPaddingBottom();
|
mRect = new Rect(getPaddingLeft(),getPaddingTop(),getMeasuredWidth() - getPaddingRight(),getMeasuredHeight() - getPaddingBottom());
|
|
}
|
|
@Override
|
protected void onDraw(Canvas canvas) {
|
super.onDraw(canvas);
|
Log.e("TitleBarView","mRect:"+mRect);
|
if(leftDra != null){
|
final Bitmap bitmap = ((BitmapDrawable) leftDra).getBitmap();
|
float top = mRect.top+(viewHeight-bitmap.getHeight()*2f)/2;
|
float left = mRect.left-bitmap.getWidth()*0.5f;
|
leftClickRect = new RectF(left,top,left + (bitmap.getWidth()*2f),top + bitmap.getHeight()*2f);
|
canvas.drawBitmap(bitmap,mRect.left,mRect.top+(viewHeight-bitmap.getHeight())/2,null);
|
|
}
|
if(rightDra != null){
|
final Bitmap bitmap = ((BitmapDrawable) rightDra).getBitmap();
|
float chaTop = (viewHeight-bitmap.getHeight())/2;
|
float top = mRect.top+chaTop;
|
float left = mRect.right-bitmap.getWidth();
|
rightClickRect = new RectF(left-bitmap.getWidth()/2,top-bitmap.getHeight()/2,left+bitmap.getWidth()*2f,top+bitmap.getHeight()*1.5f);
|
canvas.drawBitmap(bitmap,left,top,null);
|
}
|
if(titleText != null){
|
final int textWidth = getTextWidth(textPaint, titleText);
|
final int textHeight = getTextHeight(textPaint);
|
final Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();
|
canvas.drawText(titleText,mRect.left+((viewWidth-textWidth)/2),mRect.top+((viewHeight-textHeight)/2)+(0-fontMetrics.ascent),textPaint);
|
}
|
if(rightText != null){
|
final int textWidth = getTextWidth(rightTextPaint, rightText);
|
final int textHeight = getTextHeight(rightTextPaint);
|
final Paint.FontMetrics fontMetrics = rightTextPaint.getFontMetrics();
|
float left = mRect.right-textWidth;
|
float top = mRect.top+((viewHeight-textHeight)/2)+(0-fontMetrics.ascent);
|
rightClickRect = new RectF(left-textWidth/2,top-textHeight,left+textWidth*2f,top+textHeight/2);
|
canvas.drawText(rightText,left,top,rightTextPaint);
|
}
|
}
|
@Override
|
public boolean onTouchEvent(MotionEvent event) {
|
int x = (int) event.getX();
|
int y = (int) event.getY();
|
int action = event.getAction();
|
switch (action) {
|
case MotionEvent.ACTION_DOWN:
|
touchStartX = x;
|
touchStartY = y;
|
break;
|
case MotionEvent.ACTION_MOVE:
|
break;
|
case MotionEvent.ACTION_UP:
|
if(isTouched(x,y,leftClickRect) && leftClick != null){
|
leftClick.onClick(this);
|
}else if(isTouched(x,y,rightClickRect) && rightClick != null){
|
rightClick.onClick(this);
|
}
|
|
break;
|
}
|
return true;
|
}
|
|
/**
|
* 是否为点击事件
|
* @param x
|
* @param y
|
* @param rectF
|
* @return
|
*/
|
private boolean isTouched(int x, int y, RectF rectF){
|
if(rectF == null){
|
return false;
|
}
|
if(x < rectF.right && x > rectF.left &&
|
touchStartX < rectF.right && touchStartX > rectF.left &&
|
y < rectF.bottom && y > rectF.top &&
|
touchStartY < rectF.bottom && touchStartY > rectF.top ){
|
return true;
|
}
|
return false;
|
}
|
public void setLeftDra(Drawable leftDra) {
|
this.leftDra = leftDra;
|
invalidate();
|
}
|
|
public void setRightDra(Drawable rightDra) {
|
this.rightDra = rightDra;
|
invalidate();
|
}
|
|
public void setTitleText(String titleText) {
|
this.titleText = titleText;
|
invalidate();
|
}
|
|
public void setRightText(String rightText) {
|
this.rightText = rightText;
|
invalidate();
|
}
|
|
public void setTitleColor(@ColorInt int titleColor) {
|
textPaint.setColor(titleColor);
|
invalidate();
|
}
|
|
public void setRightTextColor(@ColorInt int rightTextColor) {
|
rightTextPaint.setColor(rightTextColor);
|
invalidate();
|
}
|
|
public void setTitleSize(int titleSize) {
|
textPaint.setTextSize(DimensionUtils.convertSpToPixel(getContext(),titleSize));
|
invalidate();
|
}
|
|
public void setRightTextSize(float rightTextSize) {
|
rightTextPaint.setTextSize(DimensionUtils.convertSpToPixel(getContext(),rightTextSize));
|
invalidate();
|
}
|
|
public void setRightPadding(float rightPadding) {
|
this.rightPadding = rightPadding;
|
invalidate();
|
}
|
|
public void setLeftClick(OnClickListener leftClick) {
|
this.leftClick = leftClick;
|
}
|
|
public void setRightClick(OnClickListener rightClick) {
|
this.rightClick = rightClick;
|
}
|
|
//第二个参数是一个数组.传进去个长度跟字符串长度相同的float数组,方法调用后,里边塞的是每个字符的长度.
|
public int getTextWidth(Paint paint, String str) {
|
int iRet = 0;
|
if (str != null && str.length() > 0) {
|
int len = str.length();
|
float[] widths = new float[len];
|
paint.getTextWidths(str, widths);
|
for (int j = 0; j < len; j++) {
|
iRet += (int) Math.ceil(widths[j]);
|
}
|
}
|
return iRet;
|
}
|
|
//第二个参数是一个数组.传进去个长度跟字符串长度相同的float数组,方法调用后,里边塞的是每个字符的长度.
|
public int getTextHeight(Paint paint) {
|
Paint.FontMetrics fm = paint.getFontMetrics();
|
float height1 = fm.descent - fm.ascent;//文字的高度
|
float height2 = fm.bottom - fm.top + fm.leading;//行高
|
return (int) height2;
|
}
|
}
|