تنظیم فاصله بین کلمات و حروف در تکست ویو با کاتلین
سلام در این پست کلاس های سفارشی (Custom) برای تنظیم کردن فاصله بین حروف در تکست ویو و فاصله بین کلمات در تکست ویو قرار دادم.که نکته جالب آنها این است که میشه از آن برای تمام نسخه های اندروید استفاده کرد.چون برخی اتریبیوت ها مثل android:letterSpacing هستند که برای نسخه های ۲۱ به بالا استفاده میشوند (پس عملا مارو محدود میکنن !)
(این کلاس برای تکست های فارسی چندان کارایی نداره و برای تکست های انگلیسی استفاده میشه)
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | package dn.marjan.texteditmodules.span import android.content.Context import android.support.v7.widget.AppCompatTextView import android.text.Spannable import android.text.SpannableString import android.text.style.ScaleXSpan import android.util.AttributeSet import android.widget.TextView import dn.marjan.texteditmodules.R class LetterSpacingTextView(context: Context, attrs: AttributeSet) : AppCompatTextView(context, attrs) { var mLetterSpacing = LetterSpacing.BIGGEST set(value) { if (value != 0F) applyLetterSpacing(value) } private var mOriginalText: CharSequence? = "" init { mOriginalText = super .getText() val ta = context.obtainStyledAttributes(attrs, R.styleable.LetterSpacingTextView) this .mLetterSpacing = ta.getFloat(R.styleable.WordSpacingTextView_ws_space, LetterSpacing.BIGGEST) this .invalidate() } private fun applyLetterSpacing(span: Float) { if ( this == null || this .mOriginalText == null ) return val builder = StringBuilder() for (i in 0 until mOriginalText!!.length) { val c = "" + mOriginalText!![i] builder.append(c.toLowerCase()) if (i + 1 < mOriginalText!!.length) { builder.append( "\u00A0" ) } } val finalText = SpannableString(builder.toString()) if (builder.toString().length > 1 ) { var i = 1 while (i < builder.toString().length) { finalText.setSpan(ScaleXSpan(span), i, i + 1 , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) i += 2 } } super .setText(finalText, TextView.BufferType.SPANNABLE) } object LetterSpacing { const val NORMAL = 0F const val NORMALBIG = 0 .025F const val BIG = 0 .05F val BIGGEST = 0 .2F } } |
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | package dn.marjan.texteditmodules.span import android.content.Context import android.support.v7.widget.AppCompatTextView import android.text.Spannable import android.text.SpannableString import android.text.style.ScaleXSpan import android.util.AttributeSet import android.widget.TextView import dn.marjan.texteditmodules.R class WordSpacingTextView(context: Context, val attrs: AttributeSet) : AppCompatTextView(context, attrs) { var mWordSpacing = WordSpacing.BIGGEST set(value) { applyWordSpacing(value) } private var mOriginalText: CharSequence = "" init { mOriginalText = super .getText() val ta = context.obtainStyledAttributes(attrs, R.styleable.WordSpacingTextView) this .mWordSpacing = ta.getFloat(R.styleable.WordSpacingTextView_ws_space, WordSpacing.BIGGEST) this .invalidate() } private fun applyWordSpacing(span: Float) { if ( this == null || this .mOriginalText == null ) return val finalText = SpannableString(mOriginalText) if (mOriginalText.length > 1 ) { var end = 0 while ( true ) { end = mOriginalText.indexOf( ' ' , end + 1 ) if (end == - 1 ) break finalText.setSpan( ScaleXSpan(span), end, end + 1 , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE //for more info https://developer.android.com/reference/android/text/Spanned ) } super .setText(finalText, TextView.BufferType.SPANNABLE) } } } object WordSpacing { const val NORMAL = 0f const val NORMALBIG = 0.025 .toFloat() const val BIG = 0.05 .toFloat() const val BIGGEST = 0.2 .toFloat() } |
همچنین من اومدم برای راحتی کار یک اتریبیوت هم برای این کلاس ها تعریف کردم که برای تعریف اتریبیوت فقط کافیه درون فولدر values یک فایل xml با نام attrs بسازید و محتویات زیر را درونش قرار بدید
01 02 03 04 05 06 07 08 09 10 11 12 | <? xml version = "1.0" encoding = "utf-8" ?> < resources > <!--set attr for declare space in xml file--> < declare-styleable name = "LetterSpacingTextView" > < attr name = "ls_space" format = "float" /> </ declare-styleable > < declare-styleable name = "WordSpacingTextView" > < attr name = "ws_space" format = "float" /> </ declare-styleable > </ resources > |