안 드 로 이 드 여러 단계 색상 진행 표시 줄 효과 구현
이 진 도 는 사실 상대 적 으로 간단 하 다.
여기 서 그 려 야 할 것 을 간단하게 두 부분 으로 나 눌 수 있다.
1.회색 배경 부분
2.멀 티 컬러 진행 부분
실제 그리 기 에서 세그먼트 부분 은 진도 값 에 따라 동적 으로 그리 기 가 쉽 지 않 습 니 다.
그러므로 다단 색 부분 을 배경 으로 그립 니 다.실제 회색 부분 은 진도 값 에 따라 다단 색 부분의 진도 변화 효 과 를 얻 을 수 있 습 니 다.
실현 절차
1.사용자 정의 View 로 진행 막대 그리 기
2.배경 및 진도 막대 그리 기 에 필요 한 붓 정의
private Paint backgroundPaint, progressPaint, linePaint;//
3.서로 다른 색 구역 의 행렬 배열 을 정의 합 니 다.(여기 서 진 도 를 여러 색 블록 으로 나 눕 니 다)4.색상 배열 과 비례 하 는 배열 을 정의 합 니 다.그 다음 에 비례 와 색상 에 따라 그립 니 다.
private Rect progressRect = new Rect();// ;
private Rect backgroundRects[];//
private float weights[];//
private int colors[];//
5.진도 값,감청 등 잡다 한 항목 을 정의 합 니 다.
private float progress = 10, maxProgress = 100;//
private OnProgressChangeListener listener;
6.draw 방법 에서 그리 기7.배경 색 블록 그리 기
//
int x = 0, y = getHeight();
int progressX = (int) getWidthForWeight(progress, maxProgress);
for (int i = 0; i < colors.length; i++) {
Rect rect = backgroundRects[i];
backgroundPaint.setColor(colors[i]);
int width = (int) (getWidthForWeight(weights[i], totalWeight));
rect.set(x, 0, x + width, y);
x += width;//
canvas.drawRect(rect, backgroundPaint);//
}
8.진도 막대 및 분할 선 그리 기
progressRect.set(0, 0, progressX, getHeight());//
canvas.drawRect(progressRect, progressPaint);//
for (int i = 0, lineX = 0; i < colors.length; i++) {
int width = (int) (getWidthForWeight(weights[i], totalWeight));
//
lineX = lineX + width;
if (lineX < progressX) {//
canvas.drawLine(lineX, 0, lineX, getHeight(), linePaint);
}
}
마지막 으로 이 루어 진 효과 도 를 보 겠 습 니 다.전체 코드
package com.wq.widget;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.animation.LinearInterpolator;
/**
*
* Created by WQ on 2017/7/11.
*/
public class MultistageProgress extends View {
private Paint backgroundPaint, progressPaint, linePaint;//
private Rect progressRect = new Rect();// ;
private Rect backgroundRects[];//
private float weights[];//
private int colors[];//
private float totalWeight;//
public static final int DEF_COLORS[];//
public static final float DEF_WEIGHTS[];//
private float progress = 10, maxProgress = 100;//
private OnProgressChangeListener listener;
static {
DEF_COLORS = new int[]{
Color.parseColor("#00B6D0"),
Color.parseColor("#0198AE"),
Color.parseColor("#008396"),
Color.parseColor("#007196"),
Color.parseColor("#005672")
};
DEF_WEIGHTS = new float[]{
138, 35, 230, 230, 57
};
}
public float getProgress() {
return progress;
}
public void setProgress(float progress) {
this.progress = progress;
invalidate();
onProgressChange();
}
private void onProgressChange() {
if (listener != null) {
int position = 0;
int currentWidth = (int) getWidthForWeight(getProgress(), getMaxProgress());
int tmpWidth = 0;
for (int i = 0; i < weights.length; i++) {
tmpWidth += (int) getWidthForWeight(weights[i], totalWeight);
if (tmpWidth >= currentWidth) {
position = i;
break;
}
}
listener.onProgressChange(getProgress(), position);
}
}
public float getMaxProgress() {
return maxProgress;
}
public void setMaxProgress(float maxProgress) {
this.maxProgress = maxProgress;
invalidate();
}
public OnProgressChangeListener getProgressChangeListener() {
return listener;
}
public void setProgressChangeListener(OnProgressChangeListener listener) {
this.listener = listener;
}
public MultistageProgress(Context context) {
super(context);
init();
}
public MultistageProgress(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MultistageProgress(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public MultistageProgress(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
public void init() {
backgroundPaint = new Paint();
backgroundPaint.setStyle(Paint.Style.FILL_AND_STROKE);
backgroundPaint.setColor(Color.RED);
progressPaint = new Paint();
progressPaint.setStyle(Paint.Style.FILL_AND_STROKE);
progressPaint.setColor(Color.parseColor("#d9d9d9"));
linePaint = new Paint();
linePaint.setStyle(Paint.Style.FILL_AND_STROKE);
linePaint.setColor(Color.parseColor("#e7eaf0"));
linePaint.setStrokeWidth(2);
setColors(DEF_COLORS, DEF_WEIGHTS);
}
/**
*
*
* @param color
*/
public void setProgressColor(int color) {
progressPaint.setColor(color);
}
/**
*
*
* @param colors
* @param weights
*/
public void setColors(int[] colors, float weights[]) {
if (colors == null || weights == null) {
throw new NullPointerException("colors And weights must be not null");
}
if (colors.length != weights.length) {
throw new IllegalArgumentException("colors And weights length must be same");
}
backgroundRects = new Rect[colors.length];
this.colors = colors;
this.weights = weights;
totalWeight = 0;
for (int i = 0; i < weights.length; i++) {
totalWeight += weights[i];
backgroundRects[i] = new Rect();
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (backgroundRects == null) {
return;
}
if (maxProgress <= 0) {
maxProgress = getWidth();
}
//
int x = 0, y = getHeight();
int progressX = (int) getWidthForWeight(progress, maxProgress);
for (int i = 0; i < colors.length; i++) {
Rect rect = backgroundRects[i];
backgroundPaint.setColor(colors[i]);
int width = (int) (getWidthForWeight(weights[i], totalWeight));
rect.set(x, 0, x + width, y);
x += width;//
canvas.drawRect(rect, backgroundPaint);//
}
progressRect.set(0, 0, progressX, getHeight());//
canvas.drawRect(progressRect, progressPaint);//
for (int i = 0, lineX = 0; i < colors.length; i++) {
int width = (int) (getWidthForWeight(weights[i], totalWeight));
//
lineX = lineX + width;
if (lineX < progressX) {//
canvas.drawLine(lineX, 0, lineX, getHeight(), linePaint);
}
}
}
/**
*
*
* @param weight
* @param totalWeight
* @return
*/
public float getWidthForWeight(float weight, float totalWeight) {
return getWidth() * (weight / totalWeight) + 0.5f;
}
/**
*
*
* @param position
* @return
*/
public float getXForWeightPosition(int position) {
float xPosition = 0;
for (int i = 0; i < position; i++) {
xPosition += getWidthForWeightPosition(i);
}
return xPosition;
}
/**
*
*
* @param position
* @return
*/
public float getWidthForWeightPosition(int position) {
return getWidth() * (weights[position] / totalWeight) + 0.5f;
}
ObjectAnimator valueAnimator;
public void autoChange(float startProgress, float endProgress, long changeTime) {
if (valueAnimator != null && valueAnimator.isRunning()) return;
setProgress((int) startProgress);
setMaxProgress((int) endProgress);
valueAnimator = ObjectAnimator.ofFloat(this, "progress", startProgress, endProgress);
valueAnimator.setDuration(changeTime);
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (float) animation.getAnimatedValue();
// setProgress((int) value);
Log.d(getClass().getName(), " " + value);
}
});
valueAnimator.start();
}
public void stopChange() {
if (valueAnimator != null && valueAnimator.isRunning()) valueAnimator.cancel();
}
@Override
protected void onDetachedFromWindow() {
if (valueAnimator != null && valueAnimator.isRunning()) {
valueAnimator.cancel();
}
super.onDetachedFromWindow();
}
public interface OnProgressChangeListener {
/**
*
* @param progress
* @param position
*/
void onProgressChange(float progress, int position);
}
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.