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

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

相关推荐
赏金术士4 小时前
Compose 教学项目
android·kotlin·compose
晓梦林4 小时前
ximai靶场学习笔记
android·笔记·学习
十六年开源服务商9 小时前
2026服务器配置优化与WordPress运维实战指南
android·运维·服务器
音视频牛哥11 小时前
大牛直播SDK(SmartMediaKit)Android平台Unity3D RTSP/RTMP播放器集成实践
android·unity3d·rtsp播放器·rtmp播放器·unity3d rtmp播放器·安卓unity rtsp播放器·安卓unity rtmp播放器
w1wi11 小时前
安卓抓包完全指南(一):从入门到 SSL Pinning 绕过
android·网络协议·ssl
aqi0012 小时前
一文理清 HarmonyOS 6.0.2 涵盖的十个升级点
android·华为·harmonyos·鸿蒙·harmony
赏金术士13 小时前
Jetpack Compose 状态提升(State Hoisting)完全指南
android·kotlin·compose
BoomHe14 小时前
git Rebase 为任意一笔提交补上 Change-Id
android·git·android studio
TDengine (老段)14 小时前
TDengine 超级表/子表/普通表 — 设计理念与内部表示
android·大数据·数据库·物联网·时序数据库·tdengine·涛思数据