From 9f5b69c29faa83693f3d6af6f432ea903faac7f6 Mon Sep 17 00:00:00 2001
From: Administrator <123>
Date: Tue, 02 Nov 2021 07:03:27 +0000
Subject: [PATCH] 部分修改
---
app/src/main/java/com/duqing/missions/util/DimensionUtils.java | 51 ++++++++
app/src/main/java/com/duqing/missions/widgets/TitleBarView.java | 254 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 305 insertions(+), 0 deletions(-)
diff --git a/app/src/main/java/com/duqing/missions/util/DimensionUtils.java b/app/src/main/java/com/duqing/missions/util/DimensionUtils.java
new file mode 100644
index 0000000..0b6e415
--- /dev/null
+++ b/app/src/main/java/com/duqing/missions/util/DimensionUtils.java
@@ -0,0 +1,51 @@
+package com.duqing.missions.util;
+
+import android.content.Context;
+import android.util.DisplayMetrics;
+
+/**
+ * Created by Administrator on 2021/11/2 0002.
+ */
+public class DimensionUtils {
+ /**
+ * dp获取dip
+ * @param dp
+ * @return
+ */
+ public int convertDpToPixel(float dp,Context context) {
+ DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
+ return (int) (dp * displayMetrics.density);
+ }
+
+ /***
+ * px获取dip
+ * @param pixel
+ * @return
+ */
+ public int convertPixelToDp(int pixel,Context context) {
+ DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
+ return (int) (pixel / displayMetrics.density);
+ }
+ /**
+ * 把pix值转换为sp
+ *
+ * @return
+ */
+ public static float convertPixelToSp( float pixValue,Context context) {
+ final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
+ return pixValue / fontScale + 0.5f;
+ }
+
+ /**
+ * 将sp值转换为px值,保证文字大小不变
+ *
+ * @param spValue
+ * @param context
+ * (DisplayMetrics类中属性scaledDensity)
+ * @return
+ */
+ public static int convertSpToPixel(Context context, float spValue) {
+ final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
+ return (int) (spValue * fontScale + 0.5f);
+ }
+}
diff --git a/app/src/main/java/com/duqing/missions/widgets/TitleBarView.java b/app/src/main/java/com/duqing/missions/widgets/TitleBarView.java
new file mode 100644
index 0000000..69d159c
--- /dev/null
+++ b/app/src/main/java/com/duqing/missions/widgets/TitleBarView.java
@@ -0,0 +1,254 @@
+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;
+ }
+}
--
Gitblit v1.9.1