android TextView实现文字字符不同方向显示

实现方案:通过TextView的rotation属性将文字或者字符进行任意角度旋转

  1. 判断是否是中文
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
                    }
                }
            }
        }
    }

根据上面代码即可实现对中文跟标点符号进行区分然后绘制任意角度,也可以不做判断对任何文字进行绘制。下面是最终效果

相关推荐
alexhilton1 天前
使用FunctionGemma进行设备端函数调用
android·kotlin·android jetpack
冬奇Lab1 天前
InputManagerService:输入事件分发与ANR机制
android·源码阅读
张小潇1 天前
AOSP15 Input专题InputManager源码分析
android·操作系统
RdoZam1 天前
Android-封装基类Activity\Fragment,从0到1记录
android·kotlin
奥陌陌2 天前
android 打印函数调用堆栈
android
用户985120035832 天前
Compose Navigation 3 深度解析(二):基础用法
android·android jetpack
恋猫de小郭2 天前
Android 官方正式官宣 AI 支持 AppFunctions ,Android 官方 MCP 和系统级 OpenClaw 雏形
android·前端·flutter
黄林晴2 天前
Android 17 Beta 2,隐私这把锁又拧紧了
android
Kapaseker2 天前
研究表明,开发者对Kotlin集合的了解不到 20%
android·kotlin
bqliang2 天前
Compose 媒体查询 (Media Query API) 🖱️👇🕹️
android·android jetpack