实现方案:通过TextView的rotation属性将文字或者字符进行任意角度旋转
- 判断是否是中文
java
/**
* 判断是否是中文字符
*/
fun isChinese(str: Char): Boolean {
val ub = Character.UnicodeBlock.of(str)
return ub === Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS //包含主要的中文汉字字符
|| ub === Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS //包含一些兼容性汉字字符
|| ub === Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A //包含额外的汉字字符
|| ub === Character.UnicodeBlock.GENERAL_PUNCTUATION //包括中英文标点符号
|| ub === Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION //专门的中文符号和标点
|| ub === Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS //ASCII
}
2.判断是否是中文标点符号
Kotlin
fun isPunctuation(str: Char): Boolean {
val ub = Character.UnicodeBlock.of(str)
return ub === Character.UnicodeBlock.GENERAL_PUNCTUATION
|| ub === Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
}
3.设置文字任意旋转角度
Kotlin
/**
* 设置文字任意角度
*/
fun setDirectionRotate(rotate: Float) {
mDirection = DIRECTION_OTHER
mRotate = rotate
invalidate()
}
4.绘制旋转文字
Kotlin
private var mLastTextOther = false//非中文
private var mRotate = 0f //旋转角度
override fun onDraw(canvas: Canvas) {
//属于正常显示不需要绘制
if (isDefault) {
super.onDraw(canvas)
return
}
paint?.let {
canvas.withSave {
val len = text.length
var py = left.toFloat()
var h = height / 2f
if (h <= 0) {
h = mHeight / 2f
}
val textHeight = it.textSize / 2
for (i in 0..<len) {
val c = text[i]
val charWidth = it.measureText(c.toString())
if (isPunctuation(c)) {
mLastTextOther = false
canvas.drawText(c.toString(), py + charWidth / 2, h + textHeight, it)
py += charWidth
} else if (isChinese(c)) {
mLastTextOther = false
val textWidth = it.measureText(c.toString())
canvas.withRotation(mRotate, py + textWidth, h + textHeight) {
drawText(c.toString(), py + textWidth, h + textHeight, it)
}
py += textWidth
} else {
if (!mLastTextOther) {//上一个为中文
canvas.drawText(c.toString(), py + charWidth, h + textHeight, it)
py += charWidth * 2
} else { // 非中文字符正常绘制
canvas.drawText(c.toString(), py, h + textHeight, it)
py += charWidth
}
mLastTextOther = true
}
}
}
}
}
根据上面代码即可实现对中文跟标点符号进行区分然后绘制任意角度,也可以不做判断对任何文字进行绘制。下面是最终效果
