Skip to content

Commit

Permalink
Some general refactoring.
Browse files Browse the repository at this point in the history
  • Loading branch information
diogobernardino committed Jul 16, 2019
1 parent 3881250 commit 995d715
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 52 deletions.
Expand Up @@ -28,7 +28,7 @@ class BarChartFragment : Fragment() {

chart.add(set)
chart.animation.duration = 10000
chart.render()
chart.show()
}

companion object {
Expand Down
Expand Up @@ -31,7 +31,7 @@ class LineChartFragment : Fragment() {

chart.add(set)
chart.animation.duration = 10000
chart.render()
chart.show()
}

companion object {
Expand Down
Expand Up @@ -12,13 +12,15 @@ class DefaultAnimation : ChartAnimation() {
callback: () -> Unit
): ChartAnimation {

// Entries animators
entries.forEach { entry ->
val eAnimator: ObjectAnimator = ObjectAnimator.ofFloat(entry, "y", y, entry.y)
eAnimator.duration = duration
eAnimator.interpolator = interpolator
eAnimator.start()
}

// Global animator
val animator: ValueAnimator = ValueAnimator.ofInt(0, 1)
animator.addUpdateListener { callback.invoke() }
animator.duration = duration
Expand Down
Expand Up @@ -9,7 +9,7 @@ class NoAnimation : ChartAnimation() {
entries: MutableList<ChartEntry>,
callback: () -> Unit
): ChartAnimation {
callback.invoke()
callback()
return this
}
}
Expand Up @@ -7,15 +7,14 @@ import com.db.williamchart.data.ChartEntry
import com.db.williamchart.data.ChartLabel
import com.db.williamchart.data.ChartSet
import com.db.williamchart.view.ChartView.Axis
import java.lang.IllegalArgumentException

class ChartRenderer(
private val view: ChartContract.View,
private val painter: Painter,
private var animation: ChartAnimation
) : ChartContract.Renderer {

private val defStepNumY = 3
private val defaultStepNumY = 3

private var data: ChartSet? = null

Expand Down Expand Up @@ -55,6 +54,7 @@ class ChartRenderer(
if (isProcessed) return true // Data already processed, proceed with drawing

if (data == null) return false // No data, cancel drawing

if (data!!.entries.size <= 1) throw IllegalArgumentException("A chart needs more than one entry.")

val frameLeft = paddingLeft.toFloat()
Expand Down Expand Up @@ -121,10 +121,11 @@ class ChartRenderer(
else {
val longestChartLabel = yLabels.maxBy { painter.measureLabelWidth(it.label, labelsSize) }
Paddings(
if (longestChartLabel != null) painter.measureLabelWidth(longestChartLabel.label, labelsSize) else 0F,
painter.measureLabelHeight(labelsSize) / 2,
0F,
painter.measureLabelHeight(labelsSize) / 2)
if (longestChartLabel != null) painter.measureLabelWidth(longestChartLabel.label, labelsSize) else 0F,
painter.measureLabelHeight(labelsSize) / 2,
0F,
painter.measureLabelHeight(labelsSize) / 2
)
}
}

Expand All @@ -135,12 +136,12 @@ class ChartRenderer(
private fun defineY(): List<ChartLabel> {

val borders = findBorderValues(data!!.entries)
val valuesStep = (borders.max - borders.min) / defStepNumY
val valuesStep = (borders.max - borders.min) / defaultStepNumY

return List(defStepNumY + 1, {
return List(defaultStepNumY + 1) {
val aux = borders.min + valuesStep * it
ChartLabel(aux.toString(), 0F, 0F)
})
}
}

private fun processX(
Expand Down Expand Up @@ -179,7 +180,7 @@ class ChartRenderer(
chartBottom: Float
) {

val screenStep = (chartBottom - chartTop) / defStepNumY
val screenStep = (chartBottom - chartTop) / defaultStepNumY
var screenCursor = chartBottom + painter.measureLabelHeight(labelsSize) / 2

yLabels.forEach {
Expand All @@ -199,8 +200,8 @@ class ChartRenderer(
data!!.entries.forEachIndexed { index, entry ->
entry.x = xLabels[index].x
entry.y = frameBottom -
((frameBottom - frameTop) * (entry.value - borders.min) /
(borders.max - borders.min))
((frameBottom - frameTop) * (entry.value - borders.min) /
(borders.max - borders.min))
}
}

Expand All @@ -219,10 +220,11 @@ class ChartRenderer(

private fun negotiatePaddingsXY(paddingsX: Paddings, paddingsY: Paddings): Paddings {
return Paddings(
maxOf(paddingsX.left, paddingsY.left),
maxOf(paddingsX.top, paddingsY.top),
maxOf(paddingsX.right, paddingsY.right),
maxOf(paddingsX.bottom, paddingsY.bottom))
maxOf(paddingsX.left, paddingsY.left),
maxOf(paddingsX.top, paddingsY.top),
maxOf(paddingsX.right, paddingsY.right),
maxOf(paddingsX.bottom, paddingsY.bottom)
)
}
}

Expand Down
83 changes: 50 additions & 33 deletions williamchart/src/main/java/com/db/williamchart/view/ChartView.kt
@@ -1,12 +1,12 @@
package com.db.williamchart.view

import android.content.Context
import android.content.res.TypedArray
import android.graphics.Canvas
import android.graphics.Typeface
import android.support.v4.content.res.ResourcesCompat
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
import android.view.ViewTreeObserver
import android.widget.RelativeLayout
import com.db.williamchart.ChartContract
Expand All @@ -16,7 +16,6 @@ import com.db.williamchart.animation.ChartAnimation
import com.db.williamchart.animation.DefaultAnimation
import com.db.williamchart.animation.NoAnimation
import com.db.williamchart.data.ChartLabel

import com.db.williamchart.data.ChartSet
import com.db.williamchart.renderer.ChartRenderer

Expand All @@ -28,9 +27,9 @@ abstract class ChartView @JvmOverloads constructor(

enum class Axis { NONE, X, Y, XY }

private val defFrameWidth = 200
private val defaultFrameWidth = 200

private val defFrameHeight = 100
private val defaultFrameHeight = 100

var labelsSize: Float = 60F

Expand All @@ -43,9 +42,16 @@ abstract class ChartView @JvmOverloads constructor(
var animation: ChartAnimation = DefaultAnimation()

private val drawListener = ViewTreeObserver.OnPreDrawListener {
renderer.preDraw(measuredWidth, measuredHeight,
paddingLeft, paddingTop, paddingRight, paddingBottom,
axis, labelsSize)
renderer.preDraw(
measuredWidth,
measuredHeight,
paddingLeft,
paddingTop,
paddingRight,
paddingBottom,
axis,
labelsSize
)
}

protected var canvas: Canvas? = null
Expand All @@ -57,20 +63,9 @@ abstract class ChartView @JvmOverloads constructor(
init {
viewTreeObserver.addOnPreDrawListener(drawListener)

val arr = context.theme.obtainStyledAttributes(attrs, R.styleable.ChartAttrs, 0, 0)

axis = when (arr.getString(R.styleable.ChartAttrs_chart_axis)) {
"0" -> Axis.NONE
"1" -> Axis.X
"2" -> Axis.Y
else -> Axis.XY
}
labelsSize = arr.getDimension(R.styleable.ChartAttrs_chart_labelsSize, labelsSize)
labelsColor = arr.getColor(R.styleable.ChartAttrs_chart_labelsColor, labelsColor)
if (arr.hasValue(R.styleable.ChartAttrs_chart_labelsFont))
labelsFont =
ResourcesCompat.getFont(context,
arr.getResourceId(R.styleable.ChartAttrs_chart_labelsFont, -1))
val styledAttributes =
context.theme.obtainStyledAttributes(attrs, R.styleable.ChartAttrs, 0, 0)
handleAttributes(styledAttributes)
}

override fun onAttachedToWindow() {
Expand All @@ -87,12 +82,13 @@ abstract class ChartView @JvmOverloads constructor(
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)

val widthMode = View.MeasureSpec.getMode(widthMeasureSpec)
val heightMode = View.MeasureSpec.getMode(heightMeasureSpec)
val widthMode = MeasureSpec.getMode(widthMeasureSpec)
val heightMode = MeasureSpec.getMode(heightMeasureSpec)

setMeasuredDimension(
if (widthMode == View.MeasureSpec.AT_MOST) defFrameWidth else widthMeasureSpec,
if (heightMode == View.MeasureSpec.AT_MOST) defFrameHeight else heightMeasureSpec)
if (widthMode == MeasureSpec.AT_MOST) defaultFrameWidth else widthMeasureSpec,
if (heightMode == MeasureSpec.AT_MOST) defaultFrameHeight else heightMeasureSpec
)
}

/**
Expand All @@ -110,26 +106,47 @@ abstract class ChartView @JvmOverloads constructor(
renderer.draw()
}

override fun drawLabels(xLabels: List<ChartLabel>) {

if (canvas == null) return

painter.prepare(
textSize = labelsSize,
color = labelsColor,
font = labelsFont
)
xLabels.forEach { canvas!!.drawText(it.label, it.x, it.y, painter.paint) }
}

fun add(set: ChartSet) {
renderer.add(set)
}

fun render() {
fun show() {
renderer.render()
}

fun anim() {
renderer.anim(animation)
}

override fun drawLabels(xLabels: List<ChartLabel>) {
private fun handleAttributes(typedArray: TypedArray) {

if (canvas == null) return
axis = when (typedArray.getString(R.styleable.ChartAttrs_chart_axis)) {
"0" -> Axis.NONE
"1" -> Axis.X
"2" -> Axis.Y
else -> Axis.XY
}
labelsSize = typedArray.getDimension(R.styleable.ChartAttrs_chart_labelsSize, labelsSize)
labelsColor = typedArray.getColor(R.styleable.ChartAttrs_chart_labelsColor, labelsColor)
if (typedArray.hasValue(R.styleable.ChartAttrs_chart_labelsFont))
labelsFont =
ResourcesCompat.getFont(
context,
typedArray.getResourceId(R.styleable.ChartAttrs_chart_labelsFont, -1)
)

painter.prepare(
textSize = labelsSize,
color = labelsColor,
font = labelsFont)
xLabels.forEach { canvas!!.drawText(it.label, it.x, it.y, painter.paint) }
typedArray.recycle()
}
}

0 comments on commit 995d715

Please sign in to comment.