Skip to content

Commit 080bfe9

Browse files
author
xiangdong.cheng
committed
add lb_min_height attr
1 parent 53e445d commit 080bfe9

6 files changed

Lines changed: 47 additions & 30 deletions

File tree

app/src/main/AndroidManifest.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
</intent-filter>
1919
</activity>
2020

21-
<activity android:name=".demo.LoginDemoActivity" />
21+
<activity android:name=".demo.LoginDemoActivity"
22+
android:windowSoftInputMode="adjustResize"
23+
/>
2224

2325
<activity android:name=".demo.SecondActivity" />
2426

app/src/main/res/layout/activity_demo.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
xmlns:app="http://schemas.android.com/apk/res-auto"
88
android:orientation="vertical"
99
android:gravity="center"
10+
android:layout_marginTop="230dp"
1011
android:layout_width="match_parent"
1112
android:layout_height="match_parent">
1213

@@ -34,9 +35,11 @@
3435
android:layout_width="match_parent"
3536
android:layout_height="wrap_content"
3637
android:layout_marginTop="48dp"
38+
android:minHeight="48dp"
3739
android:layout_marginLeft="@dimen/activity_horizontal_margin"
3840
android:layout_marginRight="@dimen/activity_horizontal_margin"
39-
app:lb_btnText ="@string/button_text" />
41+
app:lb_btnText ="@string/button_text"
42+
app:lb_min_height="48dp"/>
4043

4144
</LinearLayout>
4245

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ buildscript {
66
google()
77
}
88
dependencies {
9-
classpath 'com.android.tools.build:gradle:3.3.2'
9+
classpath 'com.android.tools.build:gradle:3.4.1'
1010
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
1111
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
1212
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
#Tue Apr 09 12:03:05 CST 2019
1+
#Thu Jun 20 16:19:59 CST 2019
22
distributionBase=GRADLE_USER_HOME
33
distributionPath=wrapper/dists
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip
6+
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip

library/src/main/java/com/dx/dxloadingbutton/lib/LoadingButton.kt

Lines changed: 36 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import android.view.MotionEvent
1111
import android.view.View
1212
import android.view.animation.AccelerateDecelerateInterpolator
1313
import android.view.animation.DecelerateInterpolator
14+
import kotlin.math.max
15+
import kotlin.math.min
1416

1517
enum class AnimationType{
1618
SUCCESSFUL,
@@ -37,8 +39,13 @@ class LoadingButton @JvmOverloads constructor(
3739

3840
private const val DEFAULT_COLOR = Color.BLUE
3941
private const val DEFAULT_TEXT_COLOR = Color.WHITE
42+
4043
}
4144

45+
private val mDensity = resources.displayMetrics.density
46+
47+
private val defaultMinHeight = 48 * mDensity
48+
4249
var animationEndAction: ((AnimationType) -> Unit)? = null
4350

4451
var rippleEnable = true
@@ -113,8 +120,9 @@ class LoadingButton @JvmOverloads constructor(
113120
invalidate()
114121
}
115122

116-
private val mDensity = resources.displayMetrics.density
123+
117124
private var mCurrentState = STATE_BUTTON
125+
private var mMinHeight = defaultMinHeight
118126

119127
private var mColorPrimary = DEFAULT_COLOR
120128
private var mDisabledBgColor = Color.LTGRAY
@@ -178,11 +186,12 @@ class LoadingButton @JvmOverloads constructor(
178186
rippleEnable = ta.getBoolean(R.styleable.LoadingButton_lb_rippleEnable, true)
179187
mRippleAlpha = ta.getFloat(R.styleable.LoadingButton_lb_btnRippleAlpha, 0.3f)
180188
mButtonCorner = ta.getFloat(R.styleable.LoadingButton_lb_cornerRadius, 2 * mDensity)
189+
mMinHeight = ta.getDimension(R.styleable.LoadingButton_lb_min_height, defaultMinHeight)
181190
ta.recycle()
182191
}
183192

184193
mPaint.apply {
185-
setLayerType(View.LAYER_TYPE_SOFTWARE, this)
194+
setLayerType(LAYER_TYPE_SOFTWARE, this)
186195
isAntiAlias = true
187196
color = mColorPrimary
188197
style = Paint.Style.FILL
@@ -237,15 +246,14 @@ class LoadingButton @JvmOverloads constructor(
237246

238247
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
239248
super.onSizeChanged(w, h, oldw, oldh)
240-
mRadius = (height - mPadding * 2).toInt() / 2
241-
249+
val viewHeight = max(h, mMinHeight.toInt())
250+
mRadius = (viewHeight - mPadding * 2).toInt() / 2
242251
mButtonRectF.top = mPadding
243-
mButtonRectF.bottom = height - mPadding
244-
252+
mButtonRectF.bottom = viewHeight - mPadding
245253
mArcRectF.left = (width / 2 - mRadius).toFloat()
246254
mArcRectF.top = mPadding
247255
mArcRectF.right = (width / 2 + mRadius).toFloat()
248-
mArcRectF.bottom = height - mPadding
256+
mArcRectF.bottom = viewHeight - mPadding
249257
}
250258

251259
override fun setEnabled(enabled: Boolean) {
@@ -282,29 +290,30 @@ class LoadingButton @JvmOverloads constructor(
282290

283291
override fun onDraw(canvas: Canvas) {
284292
super.onDraw(canvas)
293+
val viewHeight = max(height, mMinHeight.toInt())
285294
when (mCurrentState) {
286295
STATE_BUTTON, STATE_ANIMATION_STEP1 -> {
287-
val cornerRadius = (mRadius - mButtonCorner) * (mScaleWidth / (width / 2 - height / 2).toFloat()) + mButtonCorner
296+
val cornerRadius = (mRadius - mButtonCorner) * (mScaleWidth / (width / 2 - viewHeight / 2).toFloat()) + mButtonCorner
288297
mButtonRectF.left = mScaleWidth.toFloat()
289298
mButtonRectF.right = (width - mScaleWidth).toFloat()
290299
canvas.drawRoundRect(mButtonRectF, cornerRadius, cornerRadius, mPaint)
291300
if (mCurrentState == STATE_BUTTON) {
292-
canvas.drawText(mText, (width - mTextWidth) / 2, (height - mTextHeight) / 2 + mPadding * 2, mTextPaint)
301+
canvas.drawText(mText, (width - mTextWidth) / 2, (viewHeight - mTextHeight) / 2 + mPadding * 2, mTextPaint)
293302
if ((mTouchX > 0 || mTouchY > 0) && rippleEnable) {
294-
canvas.clipRect(0f, mPadding, width.toFloat(), height - mPadding)
303+
canvas.clipRect(0f, mPadding, width.toFloat(), viewHeight - mPadding)
295304
canvas.drawCircle(mTouchX, mTouchY, mRippleRadius, ripplePaint)
296305
}
297306
}
298307
}
299308
STATE_ANIMATION_STEP2 -> {
300-
canvas.drawCircle((width / 2).toFloat(), (height / 2).toFloat(), (mRadius - mScaleHeight).toFloat(), mPaint)
301-
canvas.drawCircle((width / 2).toFloat(), (height / 2).toFloat(), mRadius - mDensity, mStrokePaint)
309+
canvas.drawCircle((width / 2).toFloat(), (viewHeight / 2).toFloat(), (mRadius - mScaleHeight).toFloat(), mPaint)
310+
canvas.drawCircle((width / 2).toFloat(), (viewHeight / 2).toFloat(), mRadius - mDensity, mStrokePaint)
302311
}
303312
STATE_ANIMATION_LOADING -> {
304313
mPath.reset()
305314
mPath.addArc(mArcRectF, (270 + mAngle / 2).toFloat(), (360 - mAngle).toFloat())
306315
if (mAngle != 0) {
307-
mMatrix.setRotate(mDegree.toFloat(), (width / 2).toFloat(), (height / 2).toFloat())
316+
mMatrix.setRotate(mDegree.toFloat(), (width / 2).toFloat(), (viewHeight / 2).toFloat())
308317
mPath.transform(mMatrix)
309318
mDegree += 10
310319
}
@@ -314,20 +323,20 @@ class LoadingButton @JvmOverloads constructor(
314323
mPath.reset()
315324
mPath.addArc(mArcRectF, (270 + mAngle / 2).toFloat(), mEndAngle.toFloat())
316325
if (mEndAngle != 360) {
317-
mMatrix.setRotate(mDegree.toFloat(), (width / 2).toFloat(), (height / 2).toFloat())
326+
mMatrix.setRotate(mDegree.toFloat(), (width / 2).toFloat(), (viewHeight / 2).toFloat())
318327
mPath.transform(mMatrix)
319328
mDegree += 10
320329
}
321330
canvas.drawPath(mPath, mStrokePaint)
322331
}
323332
STATE_ANIMATION_SUCCESS -> {
324333
canvas.drawPath(mSuccessPath!!, mPathEffectPaint)
325-
canvas.drawCircle((width / 2).toFloat(), (height / 2).toFloat(), mRadius - mDensity, mStrokePaint)
334+
canvas.drawCircle((width / 2).toFloat(), (viewHeight / 2).toFloat(), mRadius - mDensity, mStrokePaint)
326335
}
327336
STATE_ANIMATION_FAILED -> {
328337
canvas.drawPath(mFailedPath!!, mPathEffectPaint)
329338
canvas.drawPath(mFailedPath2!!, mPathEffectPaint2)
330-
canvas.drawCircle((width / 2).toFloat(), (height / 2).toFloat(), mRadius - mDensity, mStrokePaint)
339+
canvas.drawCircle((width / 2).toFloat(), (viewHeight / 2).toFloat(), mRadius - mDensity, mStrokePaint)
331340
}
332341
}
333342
}
@@ -446,10 +455,10 @@ class LoadingButton @JvmOverloads constructor(
446455
}
447456

448457
private fun measureDimension(defaultSize: Int, measureSpec: Int) =
449-
when (View.MeasureSpec.getMode(measureSpec)) {
450-
View.MeasureSpec.EXACTLY -> View.MeasureSpec.getSize(measureSpec)
451-
View.MeasureSpec.AT_MOST -> Math.min(defaultSize, View.MeasureSpec.getSize(measureSpec))
452-
View.MeasureSpec.UNSPECIFIED -> defaultSize
458+
when (MeasureSpec.getMode(measureSpec)) {
459+
MeasureSpec.EXACTLY -> MeasureSpec.getSize(measureSpec)
460+
MeasureSpec.AT_MOST -> min(defaultSize, MeasureSpec.getSize(measureSpec))
461+
MeasureSpec.UNSPECIFIED -> defaultSize
453462
else -> defaultSize
454463
}
455464

@@ -486,10 +495,10 @@ class LoadingButton @JvmOverloads constructor(
486495
}
487496

488497
private fun playStartAnimation(isReverse: Boolean) {
489-
498+
val viewHeight = max(height, mMinHeight.toInt())
490499
val animator = ValueAnimator.ofInt(
491-
if (isReverse) width / 2 - height / 2 else 0,
492-
if (isReverse) 0 else width / 2 - height / 2)
500+
if (isReverse) width / 2 - viewHeight / 2 else 0,
501+
if (isReverse) 0 else width / 2 - viewHeight / 2)
493502
.apply {
494503
duration = 400
495504
interpolator = AccelerateDecelerateInterpolator()
@@ -647,13 +656,14 @@ class LoadingButton @JvmOverloads constructor(
647656

648657
private fun scaleSuccessPath() {
649658
val scaleMatrix = Matrix()
659+
val viewHeight = max(height, mMinHeight.toInt())
650660
ValueAnimator.ofFloat(1.0f, 0.0f)
651661
.apply {
652662
duration = 300
653663
interpolator = AccelerateDecelerateInterpolator()
654664
addUpdateListener { valueAnimator ->
655665
val value = valueAnimator.animatedValue as Float
656-
scaleMatrix.setScale(value, value, (width / 2).toFloat(), (height / 2).toFloat())
666+
scaleMatrix.setScale(value, value, (width / 2).toFloat(), (viewHeight / 2).toFloat())
657667
mSuccessPath!!.transform(scaleMatrix)
658668
invalidate()
659669
}
@@ -666,13 +676,14 @@ class LoadingButton @JvmOverloads constructor(
666676

667677
private fun scaleFailedPath() {
668678
val scaleMatrix = Matrix()
679+
val viewHeight = max(height, mMinHeight.toInt())
669680
ValueAnimator.ofFloat(1.0f, 0.0f)
670681
.apply {
671682
duration = 300
672683
interpolator = AccelerateDecelerateInterpolator()
673684
addUpdateListener { valueAnimator ->
674685
val value = valueAnimator.animatedValue as Float
675-
scaleMatrix.setScale(value, value, (width / 2).toFloat(), (height / 2).toFloat())
686+
scaleMatrix.setScale(value, value, (width / 2).toFloat(), (viewHeight / 2).toFloat())
676687
mFailedPath!!.transform(scaleMatrix)
677688
mFailedPath2!!.transform(scaleMatrix)
678689
invalidate()

library/src/main/res/values/attrs.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<attr name="lb_btnRippleColor" format="reference|color" />
1010
<attr name="lb_btnRippleAlpha" format="float" />
1111
<attr name="lb_cornerRadius" format="float" />
12+
<attr name="lb_min_height" format="dimension" />
1213
<attr name="lb_btnDisabledColor" format="reference|color" />
1314
<attr name="lb_disabledTextColor" format="reference|string" />
1415
</declare-styleable>

0 commit comments

Comments
 (0)