Administrator
2021-11-02 9f5b69c29faa83693f3d6af6f432ea903faac7f6
部分修改
2 files added
305 ■■■■■ changed files
app/src/main/java/com/duqing/missions/util/DimensionUtils.java 51 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/duqing/missions/widgets/TitleBarView.java 254 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/duqing/missions/util/DimensionUtils.java
New file
@@ -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);
    }
}
app/src/main/java/com/duqing/missions/widgets/TitleBarView.java
New file
@@ -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;
    }
}