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
                    }
                }
            }
        }
    }

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

相关推荐
lizhenjun1142 小时前
android修改线程名字长度
android
用户69371750013845 小时前
Google 正在“收紧侧加载”:陌生 APK 安装或需等待 24 小时
android·前端
用户69371750013845 小时前
Room 3.0:这次不是升级,是重来
android·前端·google
alexhilton8 小时前
Compose中的ContentScale:终极可视化指南
android·kotlin·android jetpack
Digitally11 小时前
2026 年 8 款安卓数据擦除软件和应用对比
android
杨忆11 小时前
android 11以上 截图工具类
android
粤M温同学11 小时前
Android Studio 中安装 CodeBuddy AI助手
android·ide·android studio
阿拉斯攀登12 小时前
【RK3576 安卓 JNI/NDK 系列 08】RK3576 实战(二):JNI 调用 I2C 驱动读取传感器数据
android·安卓ndk入门·jni方法签名·java调用c++·rk3576底层开发·rk3576 i2c开发
赶路人儿13 小时前
常见的mcp配置
android·adb
符哥200813 小时前
充电桩 WiFi 局域网配网(Android/Kotlin)流程、指令及实例说明文档
android·开发语言·kotlin