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