CommonButton.kt 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. package com.adealink.weparty.commonui.widget
  2. import android.content.Context
  3. import android.content.res.ColorStateList
  4. import android.graphics.Color
  5. import android.graphics.drawable.GradientDrawable
  6. import android.graphics.drawable.StateListDrawable
  7. import android.util.AttributeSet
  8. import android.util.TypedValue
  9. import android.view.LayoutInflater
  10. import androidx.constraintlayout.widget.ConstraintLayout
  11. import androidx.core.content.withStyledAttributes
  12. import androidx.core.view.updateLayoutParams
  13. import com.adealink.weparty.R
  14. import com.adealink.weparty.commonui.drawabletoolbox.DrawableBuilder
  15. import com.adealink.weparty.commonui.drawabletoolbox.FlipDrawable
  16. import com.adealink.weparty.commonui.ext.dp
  17. import com.adealink.weparty.commonui.ext.dpf
  18. import com.adealink.weparty.commonui.ext.gone
  19. import com.adealink.weparty.commonui.ext.show
  20. import com.adealink.weparty.commonui.ext.sp
  21. import com.adealink.weparty.commonui.widget.util.getColorX
  22. import com.adealink.weparty.databinding.LayoutCommonButtonBinding
  23. class CommonButton @JvmOverloads constructor(
  24. context: Context,
  25. attrs: AttributeSet? = null,
  26. defStyleAttr: Int = 0,
  27. ) : ConstraintLayout(context, attrs, defStyleAttr) {
  28. companion object {
  29. const val BUTTON_CANCEL = 0
  30. const val BUTTON_CONFIRM = 1
  31. const val BUTTON_NORMAL_1 = 2
  32. const val BUTTON_NORMAL_2 = 3
  33. }
  34. private val binding = LayoutCommonButtonBinding.inflate(LayoutInflater.from(context), this)
  35. private var leftDrawableMargin: Int = 0
  36. var leftDrawableRes: Int? = 0
  37. set(value) {
  38. field = value
  39. setLeftDrawable(value)
  40. }
  41. var leftDrawableWidth: Int? = null
  42. set(value) {
  43. field = value
  44. setLeftDrawableSize(value)
  45. }
  46. private var rightDrawableMargin: Int = 0
  47. var rightDrawableRes: Int? = 0
  48. set(value) {
  49. field = value
  50. setRightDrawable(value)
  51. }
  52. var rightDrawableWidth: Int? = null
  53. set(value) {
  54. field = value
  55. setRightDrawableSize(value)
  56. }
  57. var text: CharSequence? = null
  58. set(value) {
  59. field = value
  60. setButtonText(value)
  61. }
  62. var textSize: Float = 0f
  63. set(value) {
  64. field = value
  65. setButtonTextSize(value)
  66. }
  67. var textColor: Int = Color.WHITE
  68. set(value) {
  69. field = value
  70. setButtonTextColor(value)
  71. }
  72. var strokeWidth: Int = 1
  73. private var buttonRadius = 100f
  74. private var buttonType = BUTTON_CONFIRM
  75. init {
  76. initAttrs(context, attrs)
  77. }
  78. private fun initAttrs(context: Context, attrs: AttributeSet?) {
  79. if (isInEditMode) {
  80. context.withStyledAttributes(attrs, R.styleable.CommonButton) {
  81. buttonRadius = getDimension(
  82. R.styleable.CommonButton_button_radius,
  83. 100f
  84. )
  85. text = getString(R.styleable.CommonButton_text)
  86. textSize = getDimensionPixelSize(R.styleable.CommonButton_textSize, 14).toFloat()
  87. textColor = getColor(R.styleable.CommonButton_textColor, Color.WHITE)
  88. buttonType = getInt(
  89. R.styleable.CommonButton_common_button_type,
  90. BUTTON_CONFIRM
  91. )
  92. leftDrawableRes = getResourceId(R.styleable.CommonButton_button_left_drawable, 0)
  93. leftDrawableWidth = getDimensionPixelSize(
  94. R.styleable.CommonButton_button_left_drawable_width,
  95. 0
  96. )
  97. leftDrawableMargin =
  98. getDimensionPixelSize(R.styleable.CommonButton_button_left_drawable_margin, 2)
  99. rightDrawableRes = getResourceId(R.styleable.CommonButton_button_right_drawable, 0)
  100. rightDrawableWidth = getDimensionPixelSize(
  101. R.styleable.CommonButton_button_right_drawable_width,
  102. 0
  103. )
  104. rightDrawableMargin =
  105. getDimensionPixelSize(R.styleable.CommonButton_button_right_drawable_margin, 2)
  106. }
  107. initView()
  108. return
  109. }
  110. context.withStyledAttributes(attrs, R.styleable.CommonButton) {
  111. buttonRadius = getDimension(
  112. R.styleable.CommonButton_button_radius,
  113. 24.dpf()
  114. )
  115. text = getString(R.styleable.CommonButton_text)
  116. textSize =
  117. getDimensionPixelSize(R.styleable.CommonButton_textSize, 14.sp()).toFloat()
  118. textColor = getColor(R.styleable.CommonButton_textColor, Color.WHITE)
  119. buttonType = getInt(
  120. R.styleable.CommonButton_common_button_type,
  121. BUTTON_CONFIRM
  122. )
  123. leftDrawableRes = getResourceId(R.styleable.CommonButton_button_left_drawable, 0)
  124. leftDrawableWidth = getDimensionPixelSize(
  125. R.styleable.CommonButton_button_left_drawable_width,
  126. 0
  127. )
  128. leftDrawableMargin =
  129. getDimensionPixelSize(
  130. R.styleable.CommonButton_button_left_drawable_margin,
  131. 4.dp()
  132. )
  133. rightDrawableRes = getResourceId(R.styleable.CommonButton_button_right_drawable, 0)
  134. rightDrawableWidth = getDimensionPixelSize(
  135. R.styleable.CommonButton_button_right_drawable_width,
  136. 0
  137. )
  138. rightDrawableMargin =
  139. getDimensionPixelSize(
  140. R.styleable.CommonButton_button_right_drawable_margin,
  141. 4.dp()
  142. )
  143. }
  144. strokeWidth = 1.dp()
  145. initView()
  146. }
  147. private fun initView() {
  148. binding.tvName.updateLayoutParams<LayoutParams> {
  149. marginStart = leftDrawableMargin
  150. marginEnd = rightDrawableMargin
  151. }
  152. when (buttonType) {
  153. BUTTON_CANCEL -> {
  154. background = StateListDrawable().apply {
  155. addState(
  156. intArrayOf(-android.R.attr.state_enabled),
  157. DrawableBuilder()
  158. .cornerRadius(buttonRadius.toInt())
  159. .solidColor(getColorX(R.color.white))
  160. .strokeColor(getColorX(R.color.color_FF4E5969))
  161. .strokeWidth(strokeWidth)
  162. .build()
  163. )
  164. addState(
  165. intArrayOf(android.R.attr.state_pressed),
  166. DrawableBuilder()
  167. .cornerRadius(buttonRadius.toInt())
  168. .solidColor(getColorX(R.color.white))
  169. .strokeColor(getColorX(R.color.color_FF4E5969))
  170. .strokeWidth(strokeWidth)
  171. .build()
  172. )
  173. addState(
  174. intArrayOf(),
  175. DrawableBuilder()
  176. .cornerRadius(buttonRadius.toInt())
  177. .solidColor(getColorX(R.color.white))
  178. .strokeColor(getColorX(R.color.color_FF4E5969))
  179. .strokeWidth(strokeWidth)
  180. .build()
  181. )
  182. }
  183. binding.tvName.setTextColor(
  184. ColorStateList(
  185. arrayOf(
  186. intArrayOf(-android.R.attr.state_enabled), //不可点击
  187. intArrayOf(android.R.attr.state_pressed), //按压
  188. intArrayOf() //一般状态
  189. ),
  190. intArrayOf(
  191. getColorX(R.color.color_FF4E5969),
  192. getColorX(R.color.color_FF4E5969),
  193. getColorX(R.color.color_FF4E5969),
  194. )
  195. )
  196. )
  197. }
  198. BUTTON_NORMAL_1 -> {
  199. background = StateListDrawable().apply {
  200. addState(
  201. intArrayOf(-android.R.attr.state_enabled),
  202. DrawableBuilder()
  203. .cornerRadius(buttonRadius.toInt())
  204. .solidColor(getColorX(R.color.color_FFC9CDD4))
  205. .build()
  206. )
  207. addState(
  208. intArrayOf(android.R.attr.state_pressed),
  209. DrawableBuilder()
  210. .solidColor(getColorX(R.color.color_FF15E5E2))
  211. .cornerRadius(buttonRadius.toInt())
  212. .build()
  213. )
  214. addState(
  215. intArrayOf(),
  216. DrawableBuilder()
  217. .solidColor(getColorX(R.color.color_FF15E5E2))
  218. .cornerRadius(buttonRadius.toInt())
  219. .build()
  220. )
  221. }
  222. binding.tvName.setTextColor(
  223. ColorStateList(
  224. arrayOf(
  225. intArrayOf(-android.R.attr.state_enabled), //不可点击
  226. intArrayOf(android.R.attr.state_pressed), //按压
  227. intArrayOf() //一般状态
  228. ),
  229. intArrayOf(
  230. getColorX(R.color.white),
  231. getColorX(R.color.white),
  232. getColorX(R.color.white),
  233. )
  234. )
  235. )
  236. }
  237. else -> {
  238. // BUTTON_CONFIRM
  239. background = StateListDrawable().apply {
  240. addState(
  241. intArrayOf(-android.R.attr.state_enabled),
  242. DrawableBuilder()
  243. .cornerRadius(buttonRadius.toInt())
  244. .solidColor(getColorX(R.color.color_FFC9CDD4))
  245. .build()
  246. )
  247. addState(
  248. intArrayOf(android.R.attr.state_pressed),
  249. DrawableBuilder()
  250. .gradient(true)
  251. .orientation(FlipDrawable.ORIENTATION_HORIZONTAL)
  252. .gradientRadius(buttonRadius)
  253. .cornerRadius(buttonRadius.toInt())
  254. .gradientColors(
  255. getColorX(R.color.color_FF48E6C2),
  256. getColorX(R.color.color_FF2A86E6),
  257. null
  258. )
  259. .gradientType(GradientDrawable.LINEAR_GRADIENT)
  260. .angle(0)
  261. .build()
  262. )
  263. addState(
  264. intArrayOf(),
  265. DrawableBuilder()
  266. .gradient(true)
  267. .orientation(FlipDrawable.ORIENTATION_HORIZONTAL)
  268. .gradientRadius(buttonRadius)
  269. .cornerRadius(buttonRadius.toInt())
  270. .gradientColors(
  271. getColorX(R.color.color_FF50FFD8),
  272. getColorX(R.color.color_FF2F95FF),
  273. null
  274. )
  275. .gradientType(GradientDrawable.LINEAR_GRADIENT)
  276. .angle(0)
  277. .build()
  278. )
  279. }
  280. binding.tvName.setTextColor(
  281. ColorStateList(
  282. arrayOf(
  283. intArrayOf(-android.R.attr.state_enabled), //不可点击
  284. intArrayOf(android.R.attr.state_pressed), //按压
  285. intArrayOf() //一般状态
  286. ),
  287. intArrayOf(
  288. getColorX(R.color.white),
  289. getColorX(R.color.white),
  290. getColorX(R.color.white),
  291. )
  292. )
  293. )
  294. }
  295. }
  296. }
  297. private fun setLeftDrawable(drawableRes: Int?) {
  298. if (drawableRes == null || drawableRes == 0) {
  299. binding.ivLeft.gone()
  300. } else {
  301. binding.ivLeft.show()
  302. binding.ivLeft.setImageResource(drawableRes)
  303. }
  304. }
  305. private fun setLeftDrawableSize(size: Int?) {
  306. if (size == null || size == 0) {
  307. binding.ivLeft.updateLayoutParams<LayoutParams> {
  308. this.width = LayoutParams.WRAP_CONTENT
  309. this.height = 0
  310. }
  311. } else {
  312. binding.ivLeft.updateLayoutParams<LayoutParams> {
  313. this.width = size
  314. this.height = size
  315. }
  316. }
  317. }
  318. private fun setRightDrawable(drawableRes: Int?) {
  319. if (drawableRes == null || drawableRes == 0) {
  320. binding.ivRight.gone()
  321. } else {
  322. binding.ivRight.show()
  323. binding.ivRight.setImageResource(drawableRes)
  324. }
  325. }
  326. private fun setRightDrawableSize(size: Int?) {
  327. if (size == null || size == 0) {
  328. binding.ivRight.updateLayoutParams<LayoutParams> {
  329. this.width = LayoutParams.WRAP_CONTENT
  330. this.height = 0
  331. }
  332. } else {
  333. binding.ivRight.updateLayoutParams<LayoutParams> {
  334. this.width = size
  335. this.height = size
  336. }
  337. }
  338. }
  339. private fun setButtonText(text: CharSequence?) {
  340. binding.tvName.text = text
  341. }
  342. private fun setButtonTextSize(pxSize: Float) {
  343. binding.tvName.setTextSize(TypedValue.COMPLEX_UNIT_PX, pxSize)
  344. }
  345. private fun setButtonTextColor(color: Int) {
  346. binding.tvName.setTextColor(color)
  347. }
  348. }