You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
4.8 KiB
156 lines
4.8 KiB
/*
|
|
* Copyright (c) 2017 m2049r et al.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
// based on https://github.com/marcokstephen/StepProgressBar
|
|
|
|
package com.wownero.wownerujo.widget;
|
|
|
|
import android.content.Context;
|
|
import android.content.res.TypedArray;
|
|
import android.graphics.Canvas;
|
|
import android.graphics.Paint;
|
|
import android.util.AttributeSet;
|
|
import android.view.View;
|
|
|
|
import com.wownero.wownerujo.R;
|
|
|
|
import timber.log.Timber;
|
|
|
|
public class DotBar extends View {
|
|
|
|
final private int inactiveColor;
|
|
final private int activeColor;
|
|
|
|
final private float dotSize;
|
|
private float dotSpacing;
|
|
|
|
final private int numDots;
|
|
private int activeDot;
|
|
|
|
final private Paint paint;
|
|
|
|
public DotBar(Context context, AttributeSet attrs) {
|
|
super(context, attrs);
|
|
|
|
TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.DotBar, 0, 0);
|
|
try {
|
|
inactiveColor = ta.getInt(R.styleable.DotBar_inactiveColor, 0);
|
|
activeColor = ta.getInt(R.styleable.DotBar_activeColor, 0);
|
|
dotSize = ta.getDimensionPixelSize(R.styleable.DotBar_dotSize, 8);
|
|
numDots = ta.getInt(R.styleable.DotBar_numberDots, 5);
|
|
activeDot = ta.getInt(R.styleable.DotBar_activeDot, 0);
|
|
} finally {
|
|
ta.recycle();
|
|
}
|
|
|
|
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
|
paint.setStyle(Paint.Style.FILL);
|
|
}
|
|
|
|
@Override
|
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
|
int desiredWidth = (int) ((numDots * dotSize) + getPaddingLeft() + getPaddingRight());
|
|
int desiredHeight = (int) (dotSize + getPaddingBottom() + getPaddingTop());
|
|
|
|
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
|
|
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
|
|
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
|
|
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
|
|
|
|
int width;
|
|
int height;
|
|
|
|
//Measure Width
|
|
if (widthMode == MeasureSpec.EXACTLY) {
|
|
//Must be this size
|
|
width = widthSize;
|
|
} else if (widthMode == MeasureSpec.AT_MOST) {
|
|
//Can't be bigger than...
|
|
width = Math.min(desiredWidth, widthSize);
|
|
} else {
|
|
//Be whatever you want
|
|
width = desiredWidth;
|
|
}
|
|
|
|
//Measure Height
|
|
if (heightMode == MeasureSpec.EXACTLY) {
|
|
//Must be this size
|
|
height = heightSize;
|
|
} else if (heightMode == MeasureSpec.AT_MOST) {
|
|
//Can't be bigger than...
|
|
height = Math.min(desiredHeight, heightSize);
|
|
} else {
|
|
//Be whatever you want
|
|
height = desiredHeight;
|
|
}
|
|
|
|
dotSpacing = (int) (((1.0 * width - (getPaddingLeft() + getPaddingRight())) / numDots - dotSize) / (numDots - 1));
|
|
|
|
Timber.d("dotSpacing=%f", dotSpacing);
|
|
//MUST CALL THIS
|
|
setMeasuredDimension(width, height);
|
|
}
|
|
|
|
@Override
|
|
protected void onDraw(Canvas canvas) {
|
|
super.onDraw(canvas);
|
|
|
|
// Centering the dots in the middle of the canvas
|
|
float singleDotSize = dotSpacing + dotSize;
|
|
float combinedDotSize = singleDotSize * numDots - dotSpacing;
|
|
int startingX = (int) ((canvas.getWidth() - combinedDotSize) / 2);
|
|
int startingY = (int) ((canvas.getHeight() - dotSize) / 2);
|
|
|
|
for (int i = 0; i < numDots; i++) {
|
|
int x = (int) (startingX + i * singleDotSize);
|
|
if (i == activeDot) {
|
|
paint.setColor(activeColor);
|
|
} else {
|
|
paint.setColor(inactiveColor);
|
|
}
|
|
canvas.drawCircle(x + dotSize / 2, startingY + dotSize / 2, dotSize / 2, paint);
|
|
}
|
|
}
|
|
|
|
public void next() {
|
|
if (activeDot < numDots - 2) {
|
|
activeDot++;
|
|
invalidate();
|
|
} // else no next - stay stuck at end
|
|
}
|
|
|
|
public void previous() {
|
|
if (activeDot >= 0) {
|
|
activeDot--;
|
|
invalidate();
|
|
} // else no previous - stay stuck at beginning
|
|
}
|
|
|
|
public void setActiveDot(int i) {
|
|
if ((i >= 0) && (i < numDots)) {
|
|
activeDot = i;
|
|
invalidate();
|
|
}
|
|
}
|
|
|
|
public int getActiveDot() {
|
|
return activeDot;
|
|
}
|
|
|
|
public int getNumDots() {
|
|
return numDots;
|
|
}
|
|
} |