倾斜的角标 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*/@Overrideprotected 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 colorpublic SlantedTextView setTextColor(int color) {myTextColor = color;mTextPaint.setColor(myTextColor);postInvalidate();return this;}// font sizepublic 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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/447243.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业资产安全之数据防泄密要领

在数字化时代&#xff0c;数据已成为企业最宝贵的资产之一。然而&#xff0c;随着数据价值的增加&#xff0c;数据泄露的风险也随之上升。从内部员工的无意泄露到外部黑客的恶意攻击&#xff0c;企业数据安全面临着前所未有的挑战。SDC沙盒数据防泄密解决方案&#xff0c;正是为…

几种常用大模型工具生成基于hi3861的OpenHarmony代码的尝试

引言 最近在上智能物联网的课程&#xff0c;讲授基于hi3861的OpenHarmony编程&#xff0c;所以尝试一下使用大模型工具生成相关的代码&#xff0c;看看效果如何。提问的方式比较简单粗暴&#xff1a; 在OpenHarmony的hi3861平台上&#xff0c;如何编程访问https的网站&#xf…

进程和线程

目录 进程 线程 进程和线程的区别 进程 什么是进程&#xff1f; 每个应用程序运行在操作系统上时&#xff0c; 操作系统会提供一种抽象&#xff0c;好像系统上只有这个程序在运行&#xff0c;所有的硬件资源都被这个程序在使用。 这种假象是通过抽象了一个进程的概念来完成…

什么是编译器?

我们平时所说的程序&#xff0c;是指双击后就可以直接运行的程序&#xff0c;这样的程序被称为可执行程序&#xff08;Executable Program&#xff09;。在 Windows 下&#xff0c;可执行程序的后缀有 .exe 和 .com&#xff08;其中 .exe 比较常见&#xff09;&#xff1b;在类…

决战Linux操作系统

前言&#xff1a; 你是否也曾经为Linux所困扰过&#xff0c;在网上找的资料零零散散&#xff0c;是否学完Linux后还是懵懵懂懂&#xff0c;别怕&#xff0c;这篇博客是博主精心为你准备的&#xff0c;现在&#xff0c;就让我们一起来走进Linux的世界&#xff0c;决战Linux&…

C语言 sizeof 的介绍,以及sizeof计算数组名、 数组首地址、数组的元素之间的区别

一、sizeof 介绍 sizeof 是 C 语言中的一个运算符&#xff0c;用于计算数据类型或变量在内存中占用的字节数。用于计算数据类型或变量所占的内存大小&#xff0c;以字节为单位。它可以在编译时计算其操作数的大小&#xff0c;并返回一个 size_t 类型的值。它可以帮助了解不同类…

WebGL 小白入门学习

1. WebGL是什么&#xff1f; WebGL&#xff08;Web Graphics Library&#xff09;是一种JavaScript API&#xff0c;它允许你在不需要安装任何额外插件的情况下&#xff0c;直接在浏览器中渲染高性能的2D和3D图形。WebGL利用了用户的图形处理单元&#xff08;GPU&#xff09;来…

统信桌面专业版【手动分区安装UOS系统】介绍

统信桌面专业版【手动分区安装UOS系统】介绍 全文导读功能概述准备环境安装步骤注意事项 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 全文导读 本文旨在详细介绍在安装UOS系统时采用手动分区的方法。虽然全盘安装通常是推荐的安装方式&…

实战篇:(四)Vue2 + Three.js 创建可交互的360度全景视图,可控制旋转、缩放完整代码

Vue2 Three.js 创建可交互的360度全景视图&#xff0c;可控制旋转、缩放 引言 在现代网页开发中&#xff0c;三维图形技术已经成为提升用户体验的重要工具。本文将展示如何使用 Three.js 创建一个简单的可交互360度全景视图。通过这一项目&#xff0c;你将能够学习到基本的场…

hadoop集群搭建-安装虚拟机

2.1 安装虚拟机 在本地搭建集群就需要这么几个事 装虚拟机 安装环境 配置集群 启动 这篇博客主要就是讲的装虚拟机这一个环节的 装虚拟机就是和组装一台现实中的电脑一样&#xff0c;首先来说就是要有硬件&#xff0c;就是组装硬件&#xff0c;然后就是装系统&#xff…

Kind部署的K8s证书过期后的解决方案

证书通常有效期为1年&#xff0c;一年后服务将不可用解决方案就是更新证书 1. 找到 Kind 集群的控制平面容器名称,容器名称不一定是这个 docker ps --filter "namekind-control-plane"2. 进入 Kind 控制平面的容器&#xff1a; docker exec -it kind-control-plane…

javascript object

用const去define一个constant 用let (如果要reassign的话) 一个变量。

Redis-缓存一致性

缓存双写一致性 更新策略探讨 面试题 缓存设计要求 缓存分类&#xff1a; 只读缓存&#xff1a;&#xff08;脚本批量写入&#xff0c;canal 等&#xff09;读写缓存 同步直写&#xff1a;vip数据等即时数据异步缓写&#xff1a;允许延时&#xff08;仓库&#xff0c;物流&a…

解锁C++继承的奥秘:从基础到精妙实践(下)

文章目录 前言&#x1f950;五、多继承&#xff0c;菱形继承和菱形虚拟继承&#x1f9c0;5.1 多继承&#x1f9c0;5.2 菱形继承&#x1f9c0;5.3 虚拟继承&#xff08;解决菱形继承问题&#xff09;5.3.1 虚拟继承的语法&#xff1a;5.3.2 虚拟继承示例&#xff1a; &#x1f9…

springboot 整合 快手 移动应用 授权 发布视频 小黄车

前言&#xff1a; 因快手文档混乱&#xff0c;官方社区技术交流仍有很多未解之谜&#xff0c;下面3种文档的定义先区分。 代码中的JSON相关工具均用hutool工具包 1.快手 移动双端 原生SDK 文档https://mp.kuaishou.com/platformDocs/develop/mobile-app/ios.html 2.快手 Api 开…

Elasticsearch设置 X-Pack认证,设置账号和密码

前言 以下Elasticsearch版本&#xff1a;7.9.3 ES自带的X-Pack密码验证&#xff1a; X-Pack是elasticsearch的一个扩展包&#xff0c;将安全&#xff0c;警告&#xff0c;监视&#xff0c;图形和报告功能捆绑在一个易于安装的软件包中&#xff0c;所以我们想要开启账号密码验证…

网优学习干货:王者荣耀游戏用户体验洞察及质差识别(1)

一、课题背景 二、课题目的 针对热点游戏&#xff08;王者荣耀&#xff09;进行业务质量评估&#xff0c;并通过对端到端定界分析&#xff0c;从无线、核心网、互联网维度识别影响用户体验关键因素&#xff0c;为游戏用户的体验优化提供依据。 三、课题实施进度 王者荣耀卡顿特…

linux------缓冲区与C库的原理

前言 一、缓冲区 缓冲区的作用是提高效率&#xff0c;因为将数据写入到设备&#xff0c;是需要调用系统接口的&#xff0c;如果每次写入缓冲区的数据就调用一次系统调用&#xff0c;涉及到系统调用这时操作系统就会介入&#xff0c;用户态转为内核态&#xff0c;这个过程需要时…

linux 搭建sentinel

1.下载 linux执行下面的命令下载包 wget https://github.com/alibaba/Sentinel/releases/download/1.8.6/sentinel-dashboard-1.8.6.jar2.启动 nohup java -Dserver.port9090 -Dcsp.sentinel.dashboard.serverlocalhost:9090 -Dproject.namesentinel-dashboard -jar sentin…

k8s中控制器的使用

一、replicaset控制器 ReplicaSet 是下一代的 Replication Controller&#xff0c;官方推荐使用ReplicaSet ReplicaSet和Replication Controller的唯一区别是选择器的支持&#xff0c;ReplicaSet支持新的基于集合的选择器需求 ReplicaSet 确保任何时间都有指定数量的 Pod 副…