From 6c29fda2b7408c13a486554c5be9d3c6b8296b95 Mon Sep 17 00:00:00 2001
From: nilupeng <qingingrunt2010@qq.com>
Date: Thu, 11 Aug 2022 09:01:04 +0000
Subject: [PATCH] 设置界面

---
 app/src/main/java/com/runt/open/mvvm/widgets/TitleBarView.java |  127 ++++++++++++++++++++++++++----------------
 1 files changed, 79 insertions(+), 48 deletions(-)

diff --git a/app/src/main/java/com/runt/open/mvvm/widgets/TitleBarView.java b/app/src/main/java/com/runt/open/mvvm/widgets/TitleBarView.java
index 746b72a..c96146d 100644
--- a/app/src/main/java/com/runt/open/mvvm/widgets/TitleBarView.java
+++ b/app/src/main/java/com/runt/open/mvvm/widgets/TitleBarView.java
@@ -2,22 +2,14 @@
 
 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.*;
 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.runt.open.mvvm.R;
 import com.runt.open.mvvm.util.DimensionUtils;
 
@@ -32,7 +24,7 @@
     String titleText,rightText;
     @ColorInt int titleColor,rightTextColor;
     float titleSize,rightTextSize,rightPadding;
-    Paint textPaint,rightTextPaint,drawPaint;
+    Paint textPaint,rightTextPaint;
     int viewWidth,viewHeight;
     OnClickListener leftClick,rightClick;
     int touchStartX,touchStartY;
@@ -67,27 +59,32 @@
         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); // 是否抗锯齿
+        int leftTint = array.getColor(R.styleable.TitleBarView_leftTint,-1);
+        if(leftTint != -1) {
+            setTint(leftDra,leftTint);
+        }
+        int rightTint = array.getColor(R.styleable.TitleBarView_rightTint,-1);
+        if(rightTint != -1) {
+            setTint(rightDra,rightTint);
+        }
+
+        textPaint = initPaint(titleColor,titleSize,4);
+
+        rightTextPaint = initPaint(rightTextColor,rightTextSize,4);
+
+    }
+
+    private Paint initPaint(int color,float size,int stroke){
+        Paint paint = new Paint();
+        paint.setAntiAlias(true); // 是否抗锯齿
         //mTextPaint.setAlpha(50); // 设置alpha不透明度,范围为0~255
-        textPaint.setColor(titleColor);
-        textPaint.setTextSize(titleSize);
+        paint.setColor(color);
+        paint.setTextSize(size);
         //        设置画笔属性
-        textPaint.setStyle(Paint.Style.FILL);//画笔属性是实心圆
+        paint.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);//设置画笔粗细
-
+        paint.setStrokeWidth(stroke);//设置画笔粗细
+        return paint;
     }
 
     @Override
@@ -105,36 +102,49 @@
         super.onDraw(canvas);
         Log.e("TitleBarView","onDraw 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);
+            //点击的区域
+            leftClickRect = drawBitmap(leftDra,canvas,getPaddingLeft());
 
         }
         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);
+            //点击的区域
+            rightClickRect = drawBitmap(rightDra,canvas,getPaddingRight()+viewWidth);
         }
         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);
+            final float[] textHeight = getTextHeight(textPaint);
+            float top = (getHeight()-textHeight[0])/2-textPaint.getFontMetrics().ascent;
+            canvas.drawText(titleText,mRect.left+((viewWidth-textWidth)/2),top,textPaint);
         }
         if(rightText != null){
             final int textWidth = getTextWidth(rightTextPaint, rightText);
-            final int textHeight = getTextHeight(rightTextPaint);
-            final Paint.FontMetrics fontMetrics = rightTextPaint.getFontMetrics();
+            final float[] textHeight = getTextHeight(rightTextPaint);
+            float chaleft = textWidth*0.5f;
+            float chaTop = textHeight[0]*0.5f;
             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);
+            float top = (getHeight()-textHeight[0])/2-textPaint.getFontMetrics().ascent;
+            rightClickRect = new RectF(left-chaleft,top-chaTop,left +chaleft*3,top + chaTop*3);
             canvas.drawText(rightText,left,top,rightTextPaint);
         }
+    }
+
+    /**
+     * 绘制图片
+     * @param drawable
+     * @param canvas
+     * @return  点击的区域
+     */
+    private RectF drawBitmap(Drawable drawable,Canvas canvas,float left){
+        final Bitmap bitmap = drawableToBitmap(drawable);
+        if(left>viewWidth){//右侧
+            left -= bitmap.getWidth();
+        }
+        float chaTop = bitmap.getHeight()*0.5f;
+        float chaleft = bitmap.getWidth()*0.5f;
+        //绘制的位置
+        float top = (getHeight()-bitmap.getHeight())/2;
+        canvas.drawBitmap(bitmap,left,top,null);
+        return new RectF(left-chaleft,top-chaTop,left +chaleft*3,top + chaTop*3);
     }
     @Override
     public boolean onTouchEvent(MotionEvent event) {
@@ -247,10 +257,31 @@
     }
 
     //第二个参数是一个数组.传进去个长度跟字符串长度相同的float数组,方法调用后,里边塞的是每个字符的长度.
-    public  int  getTextHeight(Paint paint) {
+    public float[] 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;
+        return new float[]{height1,height2};
+    }
+
+    private void setTint(Drawable drawable, @ColorInt int color){
+        if(drawable!= null){
+            drawable.setTint(color);
+        }
+    }
+
+
+    private Bitmap drawableToBitmap(Drawable drawable){
+        int w = drawable.getIntrinsicWidth();
+        int h = drawable.getIntrinsicHeight();
+        Bitmap.Config config =
+                drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
+                        : Bitmap.Config.RGB_565;
+        Bitmap bitmap = Bitmap.createBitmap(w,h,config);
+        //注意,下面三行代码要用到,否在在View或者surfaceview里的canvas.drawBitmap会看不到图
+        Canvas canvas = new Canvas(bitmap);
+        drawable.setBounds(0, 0, w, h);
+        drawable.draw(canvas);
+        return bitmap;
     }
 }

--
Gitblit v1.9.1