前言
最近产品有一个需求是:要在一个距形卡片上做一个倾斜的Tag,类似:
(PS:不要注意那两毛三分的穷鬼),刚开始想着用UI切图就可以了嘛,but是不可以的,在不同手机上分辨率是不同的,直接用图片适配肯定会有问题,所以打算自定义。
实现思路
额画图太丑了,这里解释一下:这里以左上角为例,我们可以把手机屏幕看成是一个直角坐标轴,我们要画一个斜角标示,只需要在我们的距形框内画一个正方形通过正方形的对角线(这里必须是正方形,这样可以控制x,y等距离),这样操控斜角标示长度只需要控制对角线长度通过path方法来绘制路径,右边同理,我们也不需要过多计算,只需要通过moveTo方法移动坐标原点。
而绘制字体呢以对角线中心为坐标原点像左右绘制通过canvas.rotate()设置字体倾斜于对角线平行。效果如下:
核心代码
绘制背景色
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;
通过计算绘制字体和角度
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; //设置字体 canvas.rotate(angle, centerX, centerY); canvas.drawText(myText, toX, toY + PADDING_TOP, mTextPaint);
使用方法
testView.setText("打折中") .setMode(TAG_LEFT_BAR) .setBackground(Color.parseColor("#ff6677")) .setTextColor(Color.parseColor("#000000")) .setSlantedHeight(50) .setTextSize(29); 或直接在布局中 <com.example.mylibrary.mySlantedTextView android:layout_width="80dp" android:layout_height="80dp" android:layout_alignParentTop="true" android:layout_alignParentRight="true" app:myBackgroundColor="#667fff" app:mySlantedHeight="30dp" app:myText="热卖中" app:myTextColor="#ffffff" app:myTextSize="16sp" app:tagModel="right_bar" />
常用API
API名称 | 介绍 |
---|---|
myBackgroundColor | 斜角背景颜色 |
mySlantedHeight | 斜角高度 |
myText | 字体展示 |
tagModel | 样式模式共八种 |
myTextSize | 字体大小 |
myTextColor | 字体颜色 |
源码见github
github源码地址
总结
以上所述是小编给大家介绍的Android实现倾斜角标样式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
本文向大家介绍Angular4实现鼠标悬停3d倾斜效果,包括了Angular4实现鼠标悬停3d倾斜效果的使用技巧和注意事项,需要的朋友参考一下 Angular 是什么 Angular 是由谷歌开发与维护一个开发跨平台应用程序的框架,同时适用于手机与桌面。 Angular 有什么特点 基于 Angular 我们可以构建适用于所有平台的应用。比如:Web 应用、移动 Web 应用、移动应用和桌面应用等
问题内容: 有谁知道如何用scipy绘制偏态正态分布?我认为可以使用stats.norm类,但我不知道如何使用。此外,如何估计描述一维数据集偏斜正态分布的参数? 问题答案: 根据Wikipedia的描述, 如果你想找到一个数据集的使用规模,位置和形状参数,例如使用,并且, 应该给你类似的东西,
选择索引 在“倾斜摄影”菜单栏中点击“打开数据”,找到本地倾斜摄影索引(lfp)文件存放位置,点击打开osgb转换后的lfp格式倾斜摄影数据文件(具体转换步骤见“倾斜摄影”菜单栏中的“数据转换”),该lfp文件包含三维模型所在的经度、纬度、高度值,便于倾斜摄影三维模型在地球上进行定位。支持倾斜摄影三维模型格式为smart3d和大疆智图生成的osgb格式。 打开后数据效果
视锥体的参数,orientation设置初始值0,为什么出现倾斜?
问题内容: 我正在尝试创建一个倾斜的div,在我所看到的任何地方,我都发现了如何使用某种边框来完成此操作,该方法将不起作用,因为div将放置在图像的顶部。 因此,目前使用Bootstrap的代码如下: 这是相关的CSS: 因此,我想向右上方倾斜。我尝试使用边框很少成功或没有成功,并且每当我尝试使边框透明时,都不会显示边框。 有谁对如何使用CSS创建它有任何想法吗?我认为它也应该具有响应性,这是一个
问题内容: 我正在尝试创建如下图所示的形状,仅在一侧(例如,底侧)具有倾斜的边缘,而其他边缘保持笔直。 我尝试使用border方法(下面给出了代码),但是形状的尺寸是动态的,因此无法使用此方法。 我也尝试过使用渐变作为背景(例如下面的代码),但是随着尺寸的变化,它变得混乱了。您可以将鼠标悬停在以下代码段的形状上,以了解我的意思。 如何创建具有倾斜侧面的形状,并且还能够支持动态尺寸? 问题答案: 有