倾斜的角标 android倾斜角标实现

android倾斜角标实现_android 图片角标如何制作-CSDN博客

复制代码
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.os.Build;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.view.View;

import com.feishi.pettyloan.R;

/**
 * @author qiaoshi
 * @name IndexText
 * @class name:com.example.mylibrary
 * @time 2019/10/12 14:40
 */
public class SlantedTextView extends View {
    public static final int TAG_LEFT = 0x00000000;
    public static final int TAG_Right = 0x00000001;
    public static final int TAG_LEFT_BOTTOM = 0x00000002;
    public static final int TAG_RIGHT_BOTTOM = 0x00000003;
    public static final int TAG_LEFT_BAR = 0x00000004;
    public static final int TAG_RIGHT_BAR = 0x00000005;
    public static final int TAG_LEFT_BOTTOM_BAR = 0x00000006;
    public static final int TAG_RIGHT_BOTTOM_BAR = 0x00000007;
    public static final int TAG_LEFT_ANGLE = 0x00000008;


    private int myBackgroundColor = Color.WHITE;//默认白色
    private int TAG_Mode = TAG_LEFT;
    private Paint mPaint;//绘制背景色

    private TextPaint mTextPaint;
    private String myText = "";
    private float myTextSize = 14;
    private float mySlantedHeight = 40;//倾斜高度
    private int myTextColor = Color.BLACK;
    private int ROTATE_ANGLE = 45;//默认倾斜角度
    private float PADDING_TOP = 0;//全角到底部距离


    public SlantedTextView(Context context) {
        super(context);
    }

    public SlantedTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(attrs);
    }

    public SlantedTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(attrs);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public SlantedTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init(attrs);
    }

    /**
     * 初始化相关方法
     */
    private void init(AttributeSet attrs) {
        //加载默认属性
        TypedArray array = getContext().obtainStyledAttributes(attrs, R.styleable.SlantedTextViewAtt);
        myBackgroundColor = array.getColor(R.styleable.SlantedTextViewAtt_myBackgroundColor, myBackgroundColor);
        myTextSize = array.getDimension(R.styleable.SlantedTextViewAtt_myTextSize, myTextSize);
        myTextColor = array.getColor(R.styleable.SlantedTextViewAtt_myTextColor, myTextColor);
        PADDING_TOP = array.getDimension(R.styleable.SlantedTextViewAtt_myPaddingTop, PADDING_TOP);
        mySlantedHeight = array.getDimension(R.styleable.SlantedTextViewAtt_mySlantedHeight, mySlantedHeight);

        if (array.hasValue(R.styleable.SlantedTextViewAtt_tagModel))//判断用户是否设置该方法
            TAG_Mode = array.getInt(R.styleable.SlantedTextViewAtt_tagModel, TAG_LEFT);
        if (array.hasValue(R.styleable.SlantedTextViewAtt_myText))
            myText = array.getString(R.styleable.SlantedTextViewAtt_myText);

        array.recycle();//设置完回收
        //初始化背景颜色画笔
        mPaint = new Paint();
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER));//设置绘制模式这里表示显示在上面
        mPaint.setAntiAlias(true);
        mPaint.setColor(myBackgroundColor);

        mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
        mTextPaint.setColor(myTextColor);
        mTextPaint.setTextSize(myTextSize);
        mTextPaint.setAntiAlias(true);


    }

    /**
     * 绘制字体颜色和背景颜色
     *
     * @param canvas
     */
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        drawBackgroundColor(canvas);
        drawText(canvas);
    }

    //绘制背景颜色
    private void drawBackgroundColor(Canvas canvas) {
        //通过path绘制路径
        Path path = new Path();
        int mWidth = getWidth();
        int mHeight = getHeight();
        if (mWidth != mHeight) throw new IllegalStateException("设置的布局高和宽度必须一致");
        switch (TAG_Mode) {//设置具体模式
            case TAG_LEFT:
                path.lineTo(0, mHeight);
                path.lineTo(mWidth, 0);
                break;
            case TAG_Right:
                path.lineTo(mWidth, 0);
                path.lineTo(mWidth, mHeight);
                break;
            case TAG_LEFT_BOTTOM:
                path.lineTo(mWidth, mHeight);
                path.lineTo(0, mHeight);
                break;
            case TAG_RIGHT_BOTTOM:
                path.moveTo(0, mHeight);//移动坐标原点位置
                path.lineTo(mWidth, mHeight);
                path.lineTo(mWidth, 0);
                break;
            case TAG_LEFT_BAR:
                path.moveTo(mWidth, 0);
                path.lineTo(0, mHeight);
                path.lineTo(0, mHeight - mySlantedHeight);
                path.lineTo(mWidth - mySlantedHeight, 0);
                break;
            case TAG_RIGHT_BAR:
                path.lineTo(mWidth, mHeight);
                path.lineTo(mWidth, mHeight - mySlantedHeight);
                path.lineTo(mySlantedHeight, 0);
                break;
            case TAG_LEFT_BOTTOM_BAR:
                path.lineTo(mWidth, mHeight);
                path.lineTo(mWidth - mySlantedHeight, mHeight);
                path.lineTo(0, mySlantedHeight);
                break;
            case TAG_RIGHT_BOTTOM_BAR:
                path.moveTo(0, mHeight);
                path.lineTo(mySlantedHeight, mHeight);
                path.lineTo(mWidth, mySlantedHeight);
                path.lineTo(mWidth, 0);
                break;
            case TAG_LEFT_ANGLE:
                //绘制两个角度
             /*   path.reset();
                path.moveTo(mWidth-pointWidth,0);
                path.lineTo(mWidth,pointHeight);
                path.lineTo(mWidth-pointWidth-26,pointHeight);*/

                // path.reset();
               /* path.moveTo(0,mHeight-pointWidth);
                path.lineTo(pointHeight,mHeight);
                path.lineTo(pointHeight,mHeight-pointWidth-26);*/
                /*
                path.moveTo(mWidth - 100 - pointWidth, 0);
                path.lineTo(mWidth - pointWidth, 0);
                path.lineTo(0, mHeight - pointWidth);
                path.lineTo(0, mHeight - 100 - pointWidth);*/
                break;
        }
        path.close();
        canvas.drawPath(path, mPaint);
        canvas.save();
    }

    //绘制字体(从中间开始设置字体)
    private void drawText(Canvas canvas) {
        int w = (int) (canvas.getWidth() - mySlantedHeight / 2);
        int h = (int) (canvas.getHeight() - mySlantedHeight / 2);
        float[] xy = calculateXY(w, h);
        float toX = xy[0];
        float toY = xy[1];
        float centerX = xy[2];
        float centerY = xy[3];
        float angle = xy[4];
        canvas.rotate(angle, centerX, centerY);
        canvas.drawText(myText, toX, toY + PADDING_TOP, mTextPaint);
    }

    private float[] calculateXY(int w, int h) {
        float[] xy = new float[5];
        Rect rect;
        RectF rectF;
        int offset = (int) (mySlantedHeight / 2);
        //根据模式进行绘制
        switch (TAG_Mode) {
            case TAG_LEFT:
            case TAG_LEFT_BAR:


                rect = new Rect(0, 0, w, h);
                rectF = new RectF(rect);
                rectF.right = mTextPaint.measureText(myText, 0, myText.length());
                rectF.bottom = mTextPaint.descent() - mTextPaint.ascent();//Ascent: 字符顶部到baseLine的距离  Descent: 字符底部到baseLine的距离
                rectF.left += (rect.width() - rectF.right) / 2.0f;
                rectF.top += (rect.height() - rectF.bottom) / 2.0f;
                xy[0] = rectF.left;
                xy[1] = rectF.top - mTextPaint.ascent();
                xy[2] = w / 2;
                xy[3] = h / 2;
                xy[4] = -ROTATE_ANGLE;
                break;
            case TAG_Right:
            case TAG_RIGHT_BAR:

                rect = new Rect(offset, 0, w + offset, h);
                rectF = new RectF(rect);
                rectF.right = mTextPaint.measureText(myText, 0, myText.length());
                rectF.bottom = mTextPaint.descent() - mTextPaint.ascent();
                rectF.left += (rect.width() - rectF.right) / 2.0f;
                rectF.top += (rect.height() - rectF.bottom) / 2.0f;
                xy[0] = rectF.left;
                xy[1] = rectF.top - mTextPaint.ascent();
                xy[2] = w / 2 + offset;
                xy[3] = h / 2;
                xy[4] = ROTATE_ANGLE;
                break;
            case TAG_LEFT_BOTTOM:
            case TAG_LEFT_BOTTOM_BAR:

                rect = new Rect(0, offset, w, h + offset);
                rectF = new RectF(rect);
                rectF.right = mTextPaint.measureText(myText, 0, myText.length());
                rectF.bottom = mTextPaint.descent() - mTextPaint.ascent();
                rectF.left += (rect.width() - rectF.right) / 2.0f;
                rectF.top += (rect.height() - rectF.bottom) / 2.0f;
                xy[0] = rectF.left;
                xy[1] = rectF.top - mTextPaint.ascent();
                xy[2] = w / 2;
                xy[3] = h / 2 + offset;
                xy[4] = ROTATE_ANGLE;
                break;

            case TAG_RIGHT_BOTTOM:
            case TAG_RIGHT_BOTTOM_BAR:
                rect = new Rect(offset, offset, w + offset, h + offset);
                rectF = new RectF(rect);
                rectF.right = mTextPaint.measureText(myText, 0, myText.length());
                rectF.bottom = mTextPaint.descent() - mTextPaint.ascent();
                rectF.left += (rect.width() - rectF.right) / 2.0f;
                rectF.top += (rect.height() - rectF.bottom) / 2.0f;
                xy[0] = rectF.left;
                xy[1] = rectF.top - mTextPaint.ascent();
                xy[2] = w / 2 + offset;
                xy[3] = h / 2 + offset;
                xy[4] = -ROTATE_ANGLE;
                break;
        }
        return xy;
    }

    /**
     * 暴露设置的方法
     */
    public SlantedTextView setText(String text) {
        myText = text;
        postInvalidate();
        return this;
    }

    public SlantedTextView setText(int res) {
        String str = getResources().getString(res);
        if (str != null) {
            setText(str);
        }
        return this;
    }

    public String getText() {
        return myText;
    }

    // font color
    public SlantedTextView setTextColor(int color) {
        myTextColor = color;
        mTextPaint.setColor(myTextColor);
        postInvalidate();
        return this;
    }

    // font size

    public SlantedTextView setTextSize(int size) {
        this.myTextSize = size;
        mTextPaint.setTextSize(myTextSize);
        postInvalidate();
        return this;

    }

    //背景颜色
    public SlantedTextView setBackground(int color) {
        myBackgroundColor = color;
        mPaint.setColor(myBackgroundColor);
        postInvalidate();
        return this;

    }


    public SlantedTextView setMode(int mode) {
        if (TAG_Mode > TAG_RIGHT_BOTTOM_BAR || TAG_Mode < 0)
            throw new IllegalArgumentException(mode + "不存该模式");
        this.TAG_Mode = mode;
        postInvalidate();
        return this;
    }

    public int getMode() {
        return TAG_Mode;
    }

    public SlantedTextView setSlantedHeight(int length) {
        mySlantedHeight = length;
        postInvalidate();
        return this;
    }

    public SlantedTextView setPadding(int padding) {
        PADDING_TOP = padding;
        postInvalidate();
        return this;
    }


}

attrs.xml

复制代码
    <declare-styleable name="SlantedTextView">
        <attr name="slantedTextSize" format="dimension" />
        <attr name="slantedBackgroundColor" format="color" />
        <attr name="slantedText" format="string" />
        <attr name="slantedTextColor" format="color" />
        <attr name="slantedLength" format="dimension" />
        <attr name="slantedMode" format="enum">
            <enum name="left" value="0"></enum>
            <enum name="right" value="1"></enum>
            <enum name="left_bottom" value="2"></enum>
            <enum name="right_bottom" value="3"></enum>
            <enum name="left_triangle" value="4"></enum>
            <enum name="right_triangle" value="5"></enum>
            <enum name="left_bottom_triangle" value="6"></enum>
            <enum name="right_bottom_triangle" value="7"></enum>
        </attr>
    </declare-styleable>

    <!--提供布局调用属性(背景颜色)-->
    <declare-styleable name="SlantedTextViewAtt">
        <attr name="myBackgroundColor" format="color" />
        <attr name="tagModel" format="enum">
            <enum name="left" value="0"></enum>
            <enum name="right" value="1"></enum>
            <enum name="left_bottom" value="2"></enum>
            <enum name="right_bottom" value="3"></enum>
            <enum name="left_bar" value="4" />
            <enum name="right_bar" value="5" />
            <enum name="left_bottom_bar" value="6" />
            <enum name="right_bottom_bar" value="7" />
            <enum name="left_angle" value="8" />
        </attr>
        <attr name="myTextSize" format="dimension" />
        <attr name="myTextColor" format="color" />
        <attr name="myText" format="string" />
        <attr name="myPaddingTop" format="dimension" />
        <attr name="mySlantedHeight" format="dimension" />
    </declare-styleable>
相关推荐
思想觉悟2 小时前
Aosp开发磨刀石之ADB速查
android·c++
应用市场4 小时前
用本机跑的开源音乐模型,给安卓小游戏做 20 秒无缝循环背景音乐
android·python·游戏开发·soundpool·音频处理
企业数字化笔记4 小时前
表单发布前怎么验收?版本引用、字段兼容和历史数据回归
android·数据挖掘·回归
生信分析笔记4 小时前
Nature 正刊 GPN-Star 基因组语言模型
android
渣渣盟4 小时前
Flink 状态管理深度剖析:从 KeyedState 到 RocksDB,状态如何存储、恢复与扩缩容
android·大数据·flink
avi91114 小时前
电影开源Jevdo - 源码介绍(vue版)没有android 和 没有wpf
android·wpf·框架·数据爬虫·meego·电影管理
OxYGC4 小时前
[工程] PHP2Shell 漏洞解析:两条 PHP 内核 RCE,为什么应用层的防护全部失效
android·开发语言·php
拥小抱20 小时前
Compose 知识点
android
文章永久免费只为良心20 小时前
Web应用安全与防护_第三章_日志文件包含_从一道 CTFshow 题目讲透「日志投毒型 LFI → RCE」:原理、时序陷阱与全变种攻防手册
android·网络安全·渗透测试·漏洞危害·漏洞描述·日志投毒·红队指南
AIsoft_868920 小时前
学术讲座录音如何整理?录音APP可行吗
android·iphone