Skip to content

Commit

Permalink
优化Tab的自定义性,可直接继承操作paint;增加自定义字体的示例
Browse files Browse the repository at this point in the history
  • Loading branch information
XuQK committed Mar 5, 2021
1 parent c17ffdd commit eb825b3
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 14 deletions.
Binary file added app/src/main/assets/chilanka.otf
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import android.view.animation.AccelerateInterpolator
import android.view.animation.DecelerateInterpolator
import androidx.appcompat.app.AppCompatActivity
import github.xuqk.kdtablayout.KDTabAdapter
import github.xuqk.kdtablayout.KDTabLayout
import github.xuqk.kdtablayout.sample.adapter.ViewPager2Adapter
import github.xuqk.kdtablayout.sample.widget.CustomFontTab
import github.xuqk.kdtablayout.widget.KDTab
import github.xuqk.kdtablayout.widget.KDTabIndicator
import github.xuqk.kdtablayout.widget.indicator.KDRecIndicator
Expand Down Expand Up @@ -159,7 +159,7 @@ class ScrollableTabActivity : AppCompatActivity() {

tab5.contentAdapter = object : KDTabAdapter() {
override fun createTab(position: Int): KDTab? {
return KDColorMorphingTextTab(this@ScrollableTabActivity, ZH[position]).apply {
return CustomFontTab(this@ScrollableTabActivity, EN[position]).apply {
horizontalPadding = 16f
selectedTextColor = Color.parseColor("#673ab7")
normalTextColor = Color.parseColor("#9ccc65")
Expand All @@ -178,7 +178,7 @@ class ScrollableTabActivity : AppCompatActivity() {
}

override fun getTabCount(): Int {
return ZH.size
return EN.size
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package github.xuqk.kdtablayout.sample.widget

import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Typeface
import github.xuqk.kdtablayout.widget.tab.KDColorMorphingTextTab

/**
* Created By:XuQK
* Created Date:21-3-5 下午2:57
* Creator Email:[email protected]
* Description:
*/

@SuppressLint("ViewConstructor")
class CustomFontTab(context: Context, text: String) : KDColorMorphingTextTab(context, text) {

private val customTypeface by lazy {
Typeface.createFromAsset(context.assets, "chilanka.otf")
}

override fun setPaintParam() {
super.setPaintParam()
paint.typeface = customTypeface
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,10 @@ import android.content.Context
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.Typeface
import android.graphics.fonts.FontFamily
import android.widget.TextView
import androidx.annotation.ColorInt
import github.xuqk.kdtablayout.KDTabLayout
import github.xuqk.kdtablayout.dpToPx
import github.xuqk.kdtablayout.getBaselineToCenter
import github.xuqk.kdtablayout.widget.KDTab
import kotlin.math.max

/**
* Created By:XuQK
Expand Down Expand Up @@ -86,7 +82,8 @@ open class KDSizeMorphingTextTab(context: Context, text: String) :
}

override fun computeContentBounds() {
paint.getTextBounds(text, 0, text.length, contentRect)
setPaintParam()

val contentWidth = contentRect.width()
val contentHeight = contentRect.height()
contentRect.left = left + (width - contentWidth) / 2
Expand All @@ -96,8 +93,8 @@ open class KDSizeMorphingTextTab(context: Context, text: String) :
}

override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
paint.textSize = dpToPx(context, max(selectedTextSize, normalTextSize)).toFloat()
paint.typeface = if (bold) Typeface.DEFAULT_BOLD else Typeface.DEFAULT
setPaintParam()

val w = paint.measureText(text) + dpToPx(context, horizontalPadding) * 2
setMeasuredDimension(
resolveSizeAndState(w.toInt(), widthMeasureSpec, 0),
Expand All @@ -106,15 +103,19 @@ open class KDSizeMorphingTextTab(context: Context, text: String) :
}

override fun drawContent(canvas: Canvas) {
setPaintParam()

paint.getFontMetrics(fontMetrics)
val baselineY = fontMetrics.getBaselineToCenter() + height / 2
canvas.drawText(text, (width / 2).toFloat(), baselineY, paint)
}

protected open fun setPaintParam() {
paint.reset()
paint.isAntiAlias = true
paint.textSize = dpToPx(context, textSize).toFloat()
paint.color = textColor
paint.typeface = if (bold) Typeface.DEFAULT_BOLD else Typeface.DEFAULT
paint.textAlign = Paint.Align.CENTER
paint.getFontMetrics(fontMetrics)

val baselineY = fontMetrics.getBaselineToCenter() + height / 2
canvas.drawText(text, (width / 2).toFloat(), baselineY, paint)
}
}

0 comments on commit eb825b3

Please sign in to comment.