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

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

相关推荐
BLUcoding7 分钟前
Android 布局介绍
android
summerkissyou198711 分钟前
android-蓝牙-状态和协议值总结及监听例子
android·蓝牙
徒 花11 分钟前
数据库知识复习05
android·数据库
提子拌饭1332 小时前
番茄时间管理:鸿蒙Flutter 实现的高效时间管理工具
android·flutter·华为·架构·开源·harmonyos·鸿蒙
4311媒体网3 小时前
帝国CMS二次开发实战:精准实现“最新资讯”标识与高亮判断
android
BLUcoding3 小时前
Android 轻量级本地存储 SharedPreferences
android
冬奇Lab3 小时前
Camera HAL3 接口:Android 相机的真正底牌
android·音视频开发·源码阅读
sensen_kiss3 小时前
CAN302 Technologies for E-Commerce 电子商务技术 Pt.6 市场营销与SEO(搜索引擎优化)
android·学习·搜索引擎
菜鸟国国4 小时前
Compose + Koin ViewModel 实战完全手册
android
小羊子说4 小时前
Android 音频系统深度解析:从 App 到内核的完整链路
android·人工智能·性能优化·车载系统