From a0ebd6960e7733ff2b1dbd1962020f19f7899b08 Mon Sep 17 00:00:00 2001 From: Xuan Nguyen Date: Sat, 4 May 2024 10:04:38 +0700 Subject: [PATCH 1/3] Add function enable/disable ruler --- library/src/main/java/ke/tang/ruler/RulerView.kt | 2 ++ sample/src/main/java/ke/tang/ruler/sample/MainActivity.kt | 3 +++ sample/src/main/res/layout/activity_main.xml | 7 +++++++ sample/src/main/res/values-zh-rCN/values.xml | 1 + sample/src/main/res/values/strings.xml | 1 + 5 files changed, 14 insertions(+) diff --git a/library/src/main/java/ke/tang/ruler/RulerView.kt b/library/src/main/java/ke/tang/ruler/RulerView.kt index 08e2437..d1c246c 100644 --- a/library/src/main/java/ke/tang/ruler/RulerView.kt +++ b/library/src/main/java/ke/tang/ruler/RulerView.kt @@ -359,6 +359,8 @@ class RulerView @JvmOverloads constructor(context: Context, attrs: AttributeSet? } override fun onTouchEvent(event: MotionEvent): Boolean { + if (!isEnabled) return false + event.pointerCount val x = event.x val y = event.y diff --git a/sample/src/main/java/ke/tang/ruler/sample/MainActivity.kt b/sample/src/main/java/ke/tang/ruler/sample/MainActivity.kt index 338d723..166cd09 100644 --- a/sample/src/main/java/ke/tang/ruler/sample/MainActivity.kt +++ b/sample/src/main/java/ke/tang/ruler/sample/MainActivity.kt @@ -8,6 +8,8 @@ import android.util.TypedValue import android.view.View import android.widget.AdapterView import android.widget.ArrayAdapter +import android.widget.CompoundButton +import android.widget.RadioGroup import android.widget.SeekBar import android.widget.Toast import androidx.appcompat.app.AppCompatActivity @@ -22,6 +24,7 @@ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) + binding.swEnable.setOnCheckedChangeListener { _, enabled -> binding.ruler.isEnabled = enabled } setContentView(binding.root) } diff --git a/sample/src/main/res/layout/activity_main.xml b/sample/src/main/res/layout/activity_main.xml index af7d3f2..fa0fda4 100644 --- a/sample/src/main/res/layout/activity_main.xml +++ b/sample/src/main/res/layout/activity_main.xml @@ -7,6 +7,13 @@ android:orientation="vertical" android:padding="8dp"> + + 标尺 + 启用 设置刻度间间距 设置刻度颜色 设置标尺颜色 diff --git a/sample/src/main/res/values/strings.xml b/sample/src/main/res/values/strings.xml index ed3f587..d022996 100644 --- a/sample/src/main/res/values/strings.xml +++ b/sample/src/main/res/values/strings.xml @@ -1,5 +1,6 @@ Ruler + Enable Set the distance between scales Set scale color Set the ruler color From d67872d6fa2d8df2cae121251c78b8d9ed035550 Mon Sep 17 00:00:00 2001 From: Xuan Nguyen Date: Sat, 4 May 2024 10:14:31 +0700 Subject: [PATCH 2/3] Add flag to notify change when moving --- .../src/main/java/ke/tang/ruler/RulerView.kt | 7 ++++++- library/src/main/res/values/styleable.xml | 1 + .../java/ke/tang/ruler/sample/MainActivity.kt | 4 +++- sample/src/main/res/layout/activity_main.xml | 21 ++++++++++++------- sample/src/main/res/values-zh-rCN/values.xml | 1 + sample/src/main/res/values/strings.xml | 1 + version.gradle | 2 +- 7 files changed, 27 insertions(+), 10 deletions(-) diff --git a/library/src/main/java/ke/tang/ruler/RulerView.kt b/library/src/main/java/ke/tang/ruler/RulerView.kt index d1c246c..21ec034 100644 --- a/library/src/main/java/ke/tang/ruler/RulerView.kt +++ b/library/src/main/java/ke/tang/ruler/RulerView.kt @@ -84,6 +84,7 @@ class RulerView @JvmOverloads constructor(context: Context, attrs: AttributeSet? requestLayout() invalidate() } + var notifyWhenMoving: Boolean = true @IntRange(from = 0, to = MAX_VALUE.toLong()) var maxValue: Int = 0 @@ -163,6 +164,7 @@ class RulerView @JvmOverloads constructor(context: Context, attrs: AttributeSet? init { setWillNotDraw(false) with(context.obtainStyledAttributes(attrs, R.styleable.RulerView, defStyleAttr, R.style.Widget_RulerView)) { + notifyWhenMoving = getBoolean(R.styleable.RulerView_notifyWhenMoving, true) stepWidth = getDimensionPixelOffset(R.styleable.RulerView_stepWidth, 10.toDip()) getString(R.styleable.RulerView_rulerValueFormatter).takeUnless { it.isNullOrBlank() }?.also { kotlin.runCatching { @@ -404,7 +406,8 @@ class RulerView @JvmOverloads constructor(context: Context, attrs: AttributeSet? if (it.toInt() in contentOffsetRange) dx else dx / 2 }.toInt() _value = getValueForContentOffset(contentOffset) - notifyValueChanged() + if (notifyWhenMoving) + notifyValueChanged() invalidate() } } @@ -454,6 +457,8 @@ class RulerView @JvmOverloads constructor(context: Context, attrs: AttributeSet? scrollToRoundedValue() } } + if (!notifyWhenMoving) + notifyValueChanged() } } invalidate() diff --git a/library/src/main/res/values/styleable.xml b/library/src/main/res/values/styleable.xml index 97d1743..c79b938 100644 --- a/library/src/main/res/values/styleable.xml +++ b/library/src/main/res/values/styleable.xml @@ -3,6 +3,7 @@ + diff --git a/sample/src/main/java/ke/tang/ruler/sample/MainActivity.kt b/sample/src/main/java/ke/tang/ruler/sample/MainActivity.kt index 166cd09..9a864af 100644 --- a/sample/src/main/java/ke/tang/ruler/sample/MainActivity.kt +++ b/sample/src/main/java/ke/tang/ruler/sample/MainActivity.kt @@ -24,7 +24,6 @@ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) - binding.swEnable.setOnCheckedChangeListener { _, enabled -> binding.ruler.isEnabled = enabled } setContentView(binding.root) } @@ -51,6 +50,9 @@ class MainActivity : AppCompatActivity() { binding.ruler.textColor ) + binding.swEnable.setOnCheckedChangeListener { _, enabled -> binding.ruler.isEnabled = enabled } + binding.swNotifyWhenMoving.setOnCheckedChangeListener { _, enabled -> binding.ruler.notifyWhenMoving = enabled } + binding.stepWidth.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { binding.ruler.stepWidth = (state.stepWidth + TypedValue.applyDimension( diff --git a/sample/src/main/res/layout/activity_main.xml b/sample/src/main/res/layout/activity_main.xml index fa0fda4..5a967a3 100644 --- a/sample/src/main/res/layout/activity_main.xml +++ b/sample/src/main/res/layout/activity_main.xml @@ -7,13 +7,6 @@ android:orientation="vertical" android:padding="8dp"> - - + + + + 标尺 启用 + 移动时通知 设置刻度间间距 设置刻度颜色 设置标尺颜色 diff --git a/sample/src/main/res/values/strings.xml b/sample/src/main/res/values/strings.xml index d022996..136e311 100644 --- a/sample/src/main/res/values/strings.xml +++ b/sample/src/main/res/values/strings.xml @@ -1,6 +1,7 @@ Ruler Enable + Notify when moving Set the distance between scales Set scale color Set the ruler color diff --git a/version.gradle b/version.gradle index 0428ed6..62eb4e4 100644 --- a/version.gradle +++ b/version.gradle @@ -4,7 +4,7 @@ ext { minSdkVersion : 15, targetSdkVersion : 28, versionCode : 6, - versionName : '1.0.5', + versionName : '1.0.6', kotlin : '1.9.22', build : '8.2.2', library : [ From fab51a7662e5f53ad76a7021a527d86b0dfea00e Mon Sep 17 00:00:00 2001 From: Xuan Nguyen Date: Thu, 9 May 2024 11:24:53 +0700 Subject: [PATCH 3/3] Auto layout min/max label to avoid overlap text --- .../src/main/java/ke/tang/ruler/RulerView.kt | 69 +++++++++++++++++-- version.gradle | 2 +- 2 files changed, 64 insertions(+), 7 deletions(-) diff --git a/library/src/main/java/ke/tang/ruler/RulerView.kt b/library/src/main/java/ke/tang/ruler/RulerView.kt index 21ec034..2210a0c 100644 --- a/library/src/main/java/ke/tang/ruler/RulerView.kt +++ b/library/src/main/java/ke/tang/ruler/RulerView.kt @@ -2,7 +2,11 @@ package ke.tang.ruler import android.content.Context import android.content.res.ColorStateList -import android.graphics.* +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Paint +import android.graphics.Rect +import android.graphics.RectF import android.graphics.drawable.Drawable import android.os.Parcel import android.os.Parcelable @@ -16,9 +20,7 @@ import androidx.annotation.ColorInt import androidx.annotation.DrawableRes import androidx.annotation.IntRange import androidx.core.math.MathUtils -import java.util.* -import kotlin.Comparator -import kotlin.collections.ArrayList +import java.util.Collections import kotlin.math.abs import kotlin.math.max import kotlin.math.min @@ -285,7 +287,35 @@ class RulerView @JvmOverloads constructor(context: Context, attrs: AttributeSet? if (labelRight > 0) { if (0 == index % sectionScaleCount || index == maxScaleCount || index == minScaleCount) { canvas.drawRect(left, rulerTop - scaleMaxHeight.toFloat(), right, rulerTop.toFloat(), rulerPaint) - canvas.drawText(label, centerX, fontY, labelPaint) + var labelX = centerX + var labelY = fontY + var diffIdx = index % sectionScaleCount + if (diffIdx != 0) { + when (index) { + minScaleCount -> { + labelPaint.textAlign = Paint.Align.CENTER + diffIdx = sectionScaleCount - diffIdx + if (labelPaint.measureText(label) > stepWidth * diffIdx) { + labelX -= labelPaint.measureText(label)/2 - scaleSize + labelY = rulerBottom - rulerSize - fontMetrics.bottom + } + } + + maxScaleCount -> { + labelPaint.textAlign = Paint.Align.CENTER + if (labelPaint.measureText(label) > stepWidth * diffIdx) { + labelX += labelPaint.measureText(label)/2 + scaleSize + labelY = rulerBottom - rulerSize - fontMetrics.bottom + } + } + + else -> labelPaint.textAlign = Paint.Align.CENTER + } + } + else { + labelPaint.textAlign = Paint.Align.CENTER + } + canvas.drawText(label, labelX, labelY, labelPaint) } else { canvas.drawRect(left, rulerTop - scaleMinHeight.toFloat(), right, rulerTop.toFloat(), rulerPaint) } @@ -304,7 +334,34 @@ class RulerView @JvmOverloads constructor(context: Context, attrs: AttributeSet? if (labelLeft < width) { if (0 == index % sectionScaleCount || index == maxScaleCount || index == minScaleCount) { canvas.drawRect(left, rulerBottom - rulerSize - scaleMaxHeight.toFloat(), right, rulerTop.toFloat(), rulerPaint) - canvas.drawText(label, centerX, fontY, labelPaint) + var labelX = centerX + var labelY = fontY + var diffIdx = index % sectionScaleCount + if (diffIdx != 0) { + when (index) { + minScaleCount -> { + labelPaint.textAlign = Paint.Align.CENTER + diffIdx = sectionScaleCount - diffIdx + if (labelPaint.measureText(label) > stepWidth * diffIdx) { + labelX -= labelPaint.measureText(label)/2 - scaleSize + labelY = rulerBottom - rulerSize - fontMetrics.bottom + } + } + + maxScaleCount -> { + labelPaint.textAlign = Paint.Align.CENTER + if (labelPaint.measureText(label) > stepWidth * diffIdx) { + labelX += labelPaint.measureText(label)/2 + scaleSize + labelY = rulerBottom - rulerSize - fontMetrics.bottom + } + } + else -> labelPaint.textAlign = Paint.Align.CENTER + } + } + else { + labelPaint.textAlign = Paint.Align.CENTER + } + canvas.drawText(label, labelX, labelY, labelPaint) } else { canvas.drawRect(left, rulerBottom - rulerSize - scaleMinHeight.toFloat(), right, rulerTop.toFloat(), rulerPaint) } diff --git a/version.gradle b/version.gradle index 62eb4e4..8d8dca9 100644 --- a/version.gradle +++ b/version.gradle @@ -4,7 +4,7 @@ ext { minSdkVersion : 15, targetSdkVersion : 28, versionCode : 6, - versionName : '1.0.6', + versionName : '1.0.7', kotlin : '1.9.22', build : '8.2.2', library : [