11package com.opencraft.library
22
3- import android.annotation.SuppressLint
43import android.content.Context
54import android.content.res.TypedArray
6- import android.databinding.InverseBindingMethod
7- import android.databinding.InverseBindingMethods
8- import android.graphics.Color
9- import android.graphics.LinearGradient
10- import android.graphics.Point
11- import android.graphics.Shader
5+ import android.graphics.*
126import android.support.v7.widget.AppCompatTextView
137import android.util.AttributeSet
148
15- @InverseBindingMethods(InverseBindingMethod (type = GradientTextView ::class , attribute = " android:text" ))
169class GradientTextView constructor(context : Context , attrs : AttributeSet ? , defStyleAttr : Int ) : AppCompatTextView(context, attrs, defStyleAttr) {
1710
1811 constructor (context: Context ) : this (context, null )
1912 constructor (context: Context , attrs: AttributeSet ? ) : this (context, attrs, 0 )
2013
21- private var gradientColors = intArrayOf(Color .BLACK , Color .WHITE )
2214 private var gradientColorPos = floatArrayOf(0f , 1f )
23- private var linearGradient: LinearGradient ? = null
2415 private var angle = 0.0
2516 private var startOption = - 1
2617 private var endOption = - 1
18+ private var changedColors = true
2719
28- val TOP_LEFT = 0
29- val TOP_CENTER = 1
30- val MIDDLE_RIGHT = 2
31- val MIDDLE_LEFT = 3
32- val TOP_RIGHT = 4
33- val BOTTOM_LEFT = 5
34- val BOTTOM_CENTER = 6
35- val BOTTOM_RIGHT = 7
20+ var gradientColors = intArrayOf(Color .BLACK , Color .WHITE )
21+ set(value) {
22+ field = value
23+ changedColors = true
24+ invalidate()
25+ }
3626
3727 init {
3828 attrs?.let {
@@ -51,6 +41,18 @@ class GradientTextView constructor(context: Context, attrs: AttributeSet?, defSt
5141 }
5242 }
5343
44+ private fun getLinearGradient (): LinearGradient {
45+ val gradientStartPoint = getStartPoint()
46+ val gradientEndPoint = getEndPoint()
47+ return LinearGradient (gradientStartPoint.x.toFloat(),
48+ gradientStartPoint.y.toFloat(),
49+ gradientEndPoint.x.toFloat(),
50+ gradientEndPoint.y.toFloat(),
51+ gradientColors,
52+ gradientColorPos,
53+ Shader .TileMode .CLAMP )
54+ }
55+
5456 private fun loadAngle (typedArray : TypedArray ) {
5557 angle = typedArray.getInteger(R .styleable.GradientTextView_angle , 0 ).toDouble()
5658 }
@@ -75,37 +77,23 @@ class GradientTextView constructor(context: Context, attrs: AttributeSet?, defSt
7577 }
7678
7779 private fun loadColors (typedArray : TypedArray ) {
78- val colors = resources.getStringArray(typedArray
79- .getResourceId(R .styleable.GradientTextView_color_array , R .array.gradient_default))
80- colors?.let {
81- gradientColors = IntArray (it.size)
82- for (i in 0 until it.size) {
83- gradientColors[i] = Color .parseColor(it[i])
84- }
85- }
80+ gradientColors = resources.getIntArray(typedArray
81+ .getResourceId(R .styleable.GradientTextView_gradientColors , R .array.gradient_default))
8682 }
8783
88- @SuppressLint(" DrawAllocation" )
89- override fun onLayout (changed : Boolean , left : Int , top : Int , right : Int , bottom : Int ) {
90- super .onLayout(changed, left, top, right, bottom)
91- if (changed) {
92-
93- val startPoint = getStartPoint()
94- val endPoint = getEndPoint()
95-
96- linearGradient = LinearGradient (startPoint.x.toFloat(), startPoint.y.toFloat(), endPoint.x.toFloat(), endPoint.y.toFloat(),
97- gradientColors,
98- gradientColorPos,
99- Shader .TileMode .CLAMP )
100- paint.shader = linearGradient
84+ override fun onDraw (canvas : Canvas ? ) {
85+ if (changedColors) {
86+ changedColors = false
87+ paint.shader = getLinearGradient()
10188 }
89+ super .onDraw(canvas)
10290 }
10391
10492 private fun getEndPoint (): Point {
105- if (startOption > - 1 && endOption > - 1 ) {
106- return getPointFromEnum(endOption)
93+ return if (startOption > - 1 && endOption > - 1 ) {
94+ getPointFromEnum(endOption)
10795 } else {
108- return calcEndFromAngle()
96+ calcEndFromAngle()
10997
11098 }
11199 }
@@ -120,10 +108,10 @@ class GradientTextView constructor(context: Context, attrs: AttributeSet?, defSt
120108 }
121109
122110 private fun getStartPoint (): Point {
123- if (startOption > - 1 && endOption > - 1 ) {
124- return getPointFromEnum(startOption)
111+ return if (startOption > - 1 && endOption > - 1 ) {
112+ getPointFromEnum(startOption)
125113 } else {
126- return calcStartFromAngle()
114+ calcStartFromAngle()
127115 }
128116 }
129117
@@ -151,4 +139,15 @@ class GradientTextView constructor(context: Context, attrs: AttributeSet?, defSt
151139 val startY = centerY + (width - centerX) * Math .sin(radians) + (centerY - centerY) * Math .cos(radians);
152140 return Point (startX.toInt(), startY.toInt())
153141 }
142+
143+ companion object {
144+ const val TOP_LEFT = 0
145+ const val TOP_CENTER = 1
146+ const val MIDDLE_RIGHT = 2
147+ const val MIDDLE_LEFT = 3
148+ const val TOP_RIGHT = 4
149+ const val BOTTOM_LEFT = 5
150+ const val BOTTOM_CENTER = 6
151+ const val BOTTOM_RIGHT = 7
152+ }
154153}
0 commit comments