Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 71 additions & 7 deletions library/src/main/java/ke/tang/ruler/RulerView.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -84,6 +86,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
Expand Down Expand Up @@ -163,6 +166,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 {
Expand Down Expand Up @@ -283,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)
}
Expand All @@ -302,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)
}
Expand Down Expand Up @@ -359,6 +418,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
Expand Down Expand Up @@ -402,7 +463,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()
}
}
Expand Down Expand Up @@ -452,6 +514,8 @@ class RulerView @JvmOverloads constructor(context: Context, attrs: AttributeSet?
scrollToRoundedValue()
}
}
if (!notifyWhenMoving)
notifyValueChanged()
}
}
invalidate()
Expand Down
1 change: 1 addition & 0 deletions library/src/main/res/values/styleable.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
<attr name="rulerViewStyle" format="reference" />

<declare-styleable name="RulerView">
<attr name="notifyWhenMoving" format="boolean" />
<attr name="stepWidth" format="dimension" />
<attr name="rulerValueFormatter" format="string" />
<attr name="scaleColor" format="color|reference" />
Expand Down
5 changes: 5 additions & 0 deletions sample/src/main/java/ke/tang/ruler/sample/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -48,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(
Expand Down
14 changes: 14 additions & 0 deletions sample/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,20 @@
android:layout_height="wrap_content"
android:orientation="vertical">

<Switch
android:id="@+id/sw_enable"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/label_enable_ruler"
android:checked="true"/>

<Switch
android:id="@+id/sw_notify_when_moving"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/label_notify_moving"
android:checked="true"/>

<!--刻度宽度-->
<TextView
style="?android:textAppearanceSmall"
Expand Down
2 changes: 2 additions & 0 deletions sample/src/main/res/values-zh-rCN/values.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">标尺</string>
<string name="label_enable_ruler">启用</string>
<string name="label_notify_moving">移动时通知</string>
<string name="label_set_step_width">设置刻度间间距</string>
<string name="label_set_scale_color">设置刻度颜色</string>
<string name="label_set_ruler_color">设置标尺颜色</string>
Expand Down
2 changes: 2 additions & 0 deletions sample/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
<resources>
<string name="app_name">Ruler</string>
<string name="label_enable_ruler">Enable</string>
<string name="label_notify_moving">Notify when moving</string>
<string name="label_set_step_width">Set the distance between scales</string>
<string name="label_set_scale_color">Set scale color</string>
<string name="label_set_ruler_color">Set the ruler color</string>
Expand Down
2 changes: 1 addition & 1 deletion version.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ ext {
minSdkVersion : 15,
targetSdkVersion : 28,
versionCode : 6,
versionName : '1.0.5',
versionName : '1.0.7',
kotlin : '1.9.22',
build : '8.2.2',
library : [
Expand Down