


تنظیم فاصله بین کلمات و حروف در تکست ویو با کاتلین
سلام در این پست کلاس های سفارشی (Custom) برای تنظیم کردن فاصله بین حروف در تکست ویو و فاصله بین کلمات در تکست ویو قرار دادم.که نکته جالب آنها این است که میشه از آن برای تمام نسخه های اندروید استفاده کرد.چون برخی اتریبیوت ها مثل android:letterSpacing هستند که برای نسخه های ۲۱ به بالا استفاده میشوند (پس عملا مارو محدود میکنن !)
(این کلاس برای تکست های فارسی چندان کارایی نداره و برای تکست های انگلیسی استفاده میشه)
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
}
}
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 بسازید و محتویات زیر را درونش قرار بدید
<?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>