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