جستجو پیشرفته در ریسایکلر ویو با کاتلین
جستجو پیشرفته در ریسایکلر ویو (RecyclerView)
1397-08-06
پخش ویدیو با videoView و MediaController کاتلین در اندروید
پخش ویدیو با کلاس videoView و MediaController کاتلین در اندروید
1397-10-08
تنظیم فاصله بین کلمات و حروف در تکست ویو با کاتلین

تنظیم فاصله بین کلمات و حروف در تکست ویو با کاتلین

سلام در این پست کلاس های سفارشی (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>

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *