首頁 > 軟體

Android實現水平帶刻度的進度條

2022-04-01 13:03:01

本文範例為大家分享了Android實現水平帶刻度進度條的具體程式碼,供大家參考,具體內容如下

效果

1、attrsl.xml

<!-- 帶刻度的 進度條 -->
    <declare-styleable name="HorizontalProgressSeekBar">
        <attr name="progressColor" />
        <attr name="max" />
        <attr name="progressContentIcon" format="reference" />
        <attr name="progressGoalIcon" format="reference" />
        <attr name="progressGoalIconWidthHeight" format="dimension" />
        <attr name="progressContentIconHeight" format="dimension" />
        <attr name="progressContentIconWidth" format="dimension" />
        <attr name="progressDistance" format="dimension" />
</declare-styleable>

2、HorizontalProgressSeekBar.class 

public class HorizontalProgressSeekBar extends View {
    private int viewWidth;
    private int viewHeight;
    private Paint strokePain;
    private List<Integer> goalTimes;
    private int maxData = 80;
    private Bitmap progressGoalBitmap;
    private Bitmap progressContentBitmap;
    private float proceedTime;
    private int PROGRESS_COLOR = Color.parseColor("#FE78A6");
    private float goalProportion;
    private Paint backgroundPaint;
    private int distance = 10;
    private int distancePxMax;
    private int distancePxMin;
    private int distancePx;
    private RectF rectF;
    private List<Integer> bitmapType;
    private Bitmap bitmapHomeCornerKick;
    private Bitmap bitmapHomeTeamRedCard;
    private Bitmap bitmapHomeTeamScored;
    private Bitmap bitmapVisitingCornerKick;
    private Bitmap bitmapVisitingTeamScored;
    private List<BollProgressDataBean> homeTeamIncidentList;
    private List<BollProgressDataBean> visitingTeamIncidentList;
    private BollProgressDataBean homeTeamIncidentListBean;
    private BollProgressDataBean visitingTeamIncidentListBean;
    private RectF rectFStrokePain;
    private int bitmapHomeCornerKickWidth;
    private int bitmapHomeTeamScoredWidth;
 
    /**
     * 繪製進球 時刻上主隊
     *
     * @param canvas
     */
    private float incidentTimeNumber;
 
    public HorizontalProgressSeekBar(Context context) {
        this(context, null);
    }
 
    public HorizontalProgressSeekBar(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
 
    public HorizontalProgressSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.HorizontalProgressSeekBar);
        try {
            PROGRESS_COLOR = a.getColor(R.styleable.HorizontalProgressSeekBar_progressColor, PROGRESS_COLOR);
            maxData = a.getInt(R.styleable.HorizontalProgressSeekBar_max, maxData);
            int progressContentIconWidth = (int) a.getDimension(R.styleable.HorizontalProgressSeekBar_progressContentIconWidth, dipToPx(22));
            int progressContentIconHeight = (int) a.getDimension(R.styleable.HorizontalProgressSeekBar_progressContentIconHeight, dipToPx(25));
            progressContentBitmap = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getContext().getResources(),
                    a.getResourceId(R.styleable.HorizontalProgressSeekBar_progressContentIcon, R.mipmap.rest)), progressContentIconWidth, progressContentIconHeight, true);
            int progressGoalIconWidthHeight = (int) a.getDimension(R.styleable.HorizontalProgressSeekBar_progressGoalIconWidthHeight, dipToPx(22));
            progressGoalBitmap = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getContext().getResources(),
                    a.getResourceId(R.styleable.HorizontalProgressSeekBar_progressGoalIcon, R.drawable.share)), progressGoalIconWidthHeight, progressGoalIconWidthHeight, true);
 
            bitmapHomeCornerKick = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getContext().getResources(),
                    R.mipmap.home_corner_kick_xiao), progressGoalIconWidthHeight, progressGoalIconWidthHeight, true);
            bitmapHomeTeamRedCard = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getContext().getResources(),
                    R.mipmap.home_team_red_card_xiao), progressGoalIconWidthHeight, progressGoalIconWidthHeight, true);
            bitmapHomeTeamScored = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getContext().getResources(),
                    R.mipmap.home_team_scored_xiao), progressGoalIconWidthHeight, progressGoalIconWidthHeight, true);
            bitmapVisitingCornerKick = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getContext().getResources(),
                    R.mipmap.visiting_corner_kick_xiao), progressGoalIconWidthHeight, progressGoalIconWidthHeight, true);
            bitmapVisitingTeamScored = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getContext().getResources(),
                    R.mipmap.visiting_team_scored_xiao), progressGoalIconWidthHeight, progressGoalIconWidthHeight, true);
 
 
            distancePx =  a.getDimensionPixelOffset(R.styleable.HorizontalProgressSeekBar_progressDistance,dipToPx(distance));
 
 
            if (bitmapHomeCornerKick != null){
                bitmapHomeCornerKickWidth = bitmapHomeCornerKick.getWidth();
            }
 
            if (bitmapHomeTeamScored != null){
                bitmapHomeTeamScoredWidth = bitmapHomeTeamScored.getWidth();
            }
 
        } finally {
            a.recycle();
        }
 
        distancePxMax = dipToPx(distance + 2);
        distancePxMin = dipToPx(distance - 2);
        strokePain = new Paint();
        backgroundPaint = new Paint();
    }
 
    /**
     * 設定進球時間狀態
     *
     * @param goalTimes
     */
    public void setGoalTime(int max, float proceedTime, List<Integer> goalTimes) {
        this.maxData = max;
        this.proceedTime = proceedTime;
        this.goalTimes = goalTimes;
        invalidateView();
    }
 
    /**
     * 設定進球時間狀態
     * max 計算90由於中間遮擋效果,所以傳遞按照100 
     * homeTeamIncidentList 主隊時間和事件
     * visitingTeamIncidentList  客隊時間和事件
     */
    public void setGoalTimeBitmap(int max, float proceedTime, List<BollProgressDataBean> homeTeamIncidentList, List<BollProgressDataBean> visitingTeamIncidentList) {
        this.maxData = max;
        this.proceedTime = proceedTime;
        this.homeTeamIncidentList = homeTeamIncidentList;
        this.visitingTeamIncidentList = visitingTeamIncidentList;
        invalidateView();
    }
 
    public void setBitmapType(List<Integer> bitmapType) {
        this.bitmapType = bitmapType;
        invalidateView();
    }
 
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        viewWidth = w;
        viewHeight = h;
    }
 
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        drawProgress(canvas);
        drawBorder(canvas);
        drawMeasureBorder(canvas);
        drawImage(canvas);
        drawGoalTime(canvas);
        drawGoalTimeButton(canvas);
    }
 
    /**
     * 繪製空心 長方形
     *
     * @param canvas
     */
    private void drawBorder(Canvas canvas) {
        strokePain.reset();
        strokePain.setStyle(Paint.Style.STROKE);
        strokePain.setAntiAlias(true);
        strokePain.setStrokeWidth(2);
        strokePain.setColor(Color.parseColor("#151515"));
        rectFStrokePain = new RectF(distancePx, viewHeight * 0.35f, viewWidth - distancePx, viewHeight * 0.65f);
        canvas.drawRect(rectFStrokePain, strokePain);
    }
 
    private void drawProgress(Canvas canvas) {
        strokePain.reset();
        strokePain.setStyle(Paint.Style.FILL);
        strokePain.setAntiAlias(true);
        strokePain.setStrokeWidth(2);
        strokePain.setColor(Color.parseColor("#258940"));
        if (proceedTime <= 45) {
            rectF = new RectF(distancePx, viewHeight * 0.35f, ((float) viewWidth - 2 * distancePx) * (proceedTime / maxData) + distancePx, viewHeight * 0.65f);
        } else {
            if (proceedTime >= 90) {
                rectF = new RectF(distancePx, viewHeight * 0.35f, ((float) viewWidth - 2 * distancePx) * ((proceedTime + distance) / maxData) + distancePx, viewHeight * 0.65f);
            } else {
                rectF = new RectF(distancePx, viewHeight * 0.35f, ((float) viewWidth - 2 * distancePx) * ((proceedTime + distance) / maxData) + distancePx, viewHeight * 0.65f);
            }
        }
 
        canvas.drawRect(rectF, strokePain);
    }
 
    /**
     * 繪製刻度
     *
     * @param canvas
     */
    private void drawMeasureBorder(Canvas canvas) {
        strokePain.setStyle(Paint.Style.STROKE);
        float eachWidth = (viewWidth - 2 * distancePx) / 20;
        strokePain.setStrokeWidth(2);
        int drawNoNumber = 20 / 2;
        strokePain.setColor(Color.parseColor("#FF424242"));
        for (int i = 1; i <= 19; i++) {
            //長短線條
            if (drawNoNumber != i && i != 9 && i != 11) {
                if (i % 2 == 0) {
                    canvas.drawLine(eachWidth * i + distancePx, viewHeight * 0.66f, eachWidth * i + distancePx, viewHeight * 0.45f, strokePain);
                } else {
                    canvas.drawLine(eachWidth * i + distancePx, viewHeight * 0.66f, eachWidth * i + distancePx, viewHeight * 0.55f, strokePain);
                }
            }
        }
    }
 
    /**
     * 繪製H 圖片
     *
     * @param canvas
     */
    private void drawImage(Canvas canvas) {
        if (progressContentBitmap != null) {
            canvas.drawBitmap(progressContentBitmap,  (int) (viewWidth / 2.0 - progressContentBitmap.getWidth() / 2.0 ), (int) (viewHeight / 2.0 - (progressContentBitmap.getHeight()) / 2.0f), strokePain);
        }
 
    }
 
 
    private void drawGoalTime(Canvas canvas) {
        //主隊比賽中的事件  14角球 2紅牌 1進球
 
        if (homeTeamIncidentList != null && homeTeamIncidentList.size() > 0) {
            for (int i = 0; i < homeTeamIncidentList.size(); i++) {
                homeTeamIncidentListBean = homeTeamIncidentList.get(i);
                String incidentTime = homeTeamIncidentListBean.getIncidentTime();
                String incidentType = homeTeamIncidentListBean.getIncidentType();
                if (incidentTime != null) {
                    try {
                        incidentTimeNumber = Float.parseFloat(incidentTime);
                    } catch (Exception e) {
 
                    }
 
                }
                if (incidentTimeNumber == 0) {
                    if (incidentType != null) {
                        if ("14".equals(incidentType)) {
                            homeIncidentZero(canvas, bitmapHomeCornerKick, incidentTimeNumber, 0.15f, incidentType);
                        } else if ("2".equals(incidentType)) {
                            homeIncidentZero(canvas, bitmapHomeTeamRedCard, incidentTimeNumber, 0.25f, incidentType);
                        } else if ("1".equals(incidentType)) {
                            homeIncidentZero(canvas, bitmapHomeTeamScored, incidentTimeNumber, 0.25f, incidentType);
                        }
                    }
                } else if (incidentTimeNumber <= 45 && incidentTimeNumber > 0) {
                    if (incidentType != null) {
                        if ("14".equals(incidentType)) {
                            homeTeamIncident(canvas, bitmapHomeCornerKick, incidentTimeNumber, 0.15f, incidentType);
                        } else if ("2".equals(incidentType)) {
                            homeTeamIncident(canvas, bitmapHomeTeamRedCard, incidentTimeNumber, 0.25f, incidentType);
                        } else if ("1".equals(incidentType)) {
                            homeTeamIncident(canvas, bitmapHomeTeamScored, incidentTimeNumber, 0.25f, incidentType);
                        }
                    }
 
                } else if (incidentTimeNumber > 45 && incidentTimeNumber < 90) {
                    if (incidentType != null) {
                        if ("14".equals(incidentType)) {
                            homeIncident(canvas, bitmapHomeCornerKick, incidentTimeNumber, 0.15f, incidentType);
                        } else if ("2".equals(incidentType)) {
                            homeIncident(canvas, bitmapHomeTeamRedCard, incidentTimeNumber, 0.25f, incidentType);
                        } else if ("1".equals(incidentType)) {
                            homeIncident(canvas, bitmapHomeTeamScored, incidentTimeNumber, 0.25f, incidentType);
                        }
                    }
                } else if (incidentTimeNumber >= 90) {
                    if (incidentType != null) {
                        incidentTimeNumber=90;
                        if ("14".equals(incidentType)) {
                            homeIncidentNinety(canvas, bitmapHomeCornerKick, incidentTimeNumber, 0.15f, incidentType);
                        } else if ("2".equals(incidentType)) {
                            homeIncidentNinety(canvas, bitmapHomeTeamRedCard, incidentTimeNumber, 0.25f, incidentType);
                        } else if ("1".equals(incidentType)) {
                            homeIncidentNinety(canvas, bitmapHomeTeamScored, incidentTimeNumber, 0.25f, incidentType);
                        }
                    }
                }
            }
        }
 
    }
 
    /**
     * 繪製進球 時刻下客隊
     *
     * @param canvas
     */
    private void drawGoalTimeButton(Canvas canvas) {
 
        if (visitingTeamIncidentList != null && visitingTeamIncidentList.size() > 0) {
            for (int i = 0; i < visitingTeamIncidentList.size(); i++) {
                visitingTeamIncidentListBean = visitingTeamIncidentList.get(i);
                String incidentTime = visitingTeamIncidentListBean.getIncidentTime();
                String incidentType = visitingTeamIncidentListBean.getIncidentType();
                if (incidentTime != null) {
                    try {
                        incidentTimeNumber = Float.parseFloat(incidentTime);
                    } catch (Exception e) {
 
                    }
 
                }
                if (incidentTimeNumber == 0) {
                    if (incidentType != null) {
                        if ("14".equals(incidentType)) {
                            homeIncidentZero(canvas, bitmapVisitingCornerKick, incidentTimeNumber, 0.56f, incidentType);
                        } else if ("2".equals(incidentType)) {
                            homeIncidentZero(canvas, bitmapHomeTeamRedCard, incidentTimeNumber, 0.45f, incidentType);
                        } else if ("1".equals(incidentType)) {
                            homeIncidentZero(canvas, bitmapVisitingTeamScored, incidentTimeNumber, 0.45f, incidentType);
                        }
                    }
                } else if (incidentTimeNumber <= 45 && incidentTimeNumber > 0) {
                    if (incidentType != null) {
                        if ("14".equals(incidentType)) {
                            homeTeamIncident(canvas, bitmapVisitingCornerKick, incidentTimeNumber, 0.56f, incidentType);
                        } else if ("2".equals(incidentType)) {
                            homeTeamIncident(canvas, bitmapHomeTeamRedCard, incidentTimeNumber, 0.45f, incidentType);
                        } else if ("1".equals(incidentType)) {
                            homeTeamIncident(canvas, bitmapVisitingTeamScored, incidentTimeNumber, 0.45f, incidentType);
                        }
                    }
 
                } else if (incidentTimeNumber > 45 && incidentTimeNumber < 90) {
                    if (incidentType != null) {
                        if ("14".equals(incidentType)) {
                            homeIncident(canvas, bitmapVisitingCornerKick, incidentTimeNumber, 0.56f, incidentType);
                        } else if ("2".equals(incidentType)) {
                            homeIncident(canvas, bitmapHomeTeamRedCard, incidentTimeNumber, 0.45f, incidentType);
                        } else if ("1".equals(incidentType)) {
                            homeIncident(canvas, bitmapVisitingTeamScored, incidentTimeNumber, 0.45f, incidentType);
                        }
                    }
                } else if (incidentTimeNumber >= 90) {
                    if (incidentType != null) {
                        incidentTimeNumber=90;
                        if ("14".equals(incidentType)) {
                            homeIncidentNinety(canvas, bitmapVisitingCornerKick, incidentTimeNumber, 0.56f, incidentType);
                        } else if ("2".equals(incidentType)) {
                            homeIncidentNinety(canvas, bitmapHomeTeamRedCard, incidentTimeNumber, 0.45f, incidentType);
                        } else if ("1".equals(incidentType)) {
                            homeIncidentNinety(canvas, bitmapVisitingTeamScored, incidentTimeNumber, 0.45f, incidentType);
                        }
                    }
                }
            }
        }
    }
 
    private void homeIncidentZero(Canvas canvas, Bitmap bitmapHomeCornerKick, float incidentTimeNumber, float v, String incidentType) {
        if ("14".equals(incidentType)) {
            canvas.drawBitmap(bitmapHomeCornerKick, (int) ((viewWidth - 2 * distancePx) * incidentTimeNumber / maxData - bitmapHomeCornerKickWidth / 2 + distancePxMax), viewHeight * v, strokePain);
        } else {
            canvas.drawBitmap(bitmapHomeCornerKick, (int) ((viewWidth - 2 * distancePx) * incidentTimeNumber / maxData - bitmapHomeCornerKickWidth / 2 + distancePx), viewHeight * v, strokePain);
        }
 
    }
 
    private void homeIncidentNinety(Canvas canvas, Bitmap bitmapHomeTeamScored, float incidentTimeNumber, float v, String incidentType) {
        if ("14".equals(incidentType)) {
            canvas.drawBitmap(bitmapHomeTeamScored, (int) ((viewWidth) * (incidentTimeNumber + 10) / maxData - bitmapHomeTeamScoredWidth / 2) - distancePxMin, viewHeight * v, strokePain);
        } else {
            canvas.drawBitmap(bitmapHomeTeamScored, (int) ((viewWidth) * (incidentTimeNumber + 10) / maxData - bitmapHomeTeamScoredWidth / 2) - distancePx, viewHeight * v, strokePain);
        }
 
    }
 
    private void homeIncident(Canvas canvas, Bitmap bitmapHomeTeamScored, float incidentTimeNumber, float v, String incidentType) {
        if ("14".equals(incidentType)) {
            canvas.drawBitmap(bitmapHomeTeamScored, (int) ((viewWidth - 2 * distancePx) * (incidentTimeNumber + 10) / maxData - bitmapHomeTeamScoredWidth / 2) + distancePxMax, viewHeight * v, strokePain);
        } else {
            canvas.drawBitmap(bitmapHomeTeamScored, (int) ((viewWidth - 2 * distancePx) * (incidentTimeNumber + 10) / maxData - bitmapHomeTeamScoredWidth / 2) + distancePx, viewHeight * v, strokePain);
        }
    }
 
    private void homeTeamIncident(Canvas canvas, Bitmap bitmapHomeCornerKick, float incidentTimeNumber, float v, String incidentType) {
        if ("14".equals(incidentType)) {
            canvas.drawBitmap(bitmapHomeCornerKick, (int) ((viewWidth - 2 * distancePx) * (incidentTimeNumber) / maxData - bitmapHomeCornerKickWidth / 2) + distancePxMax, viewHeight * v, strokePain);
        } else {
            canvas.drawBitmap(bitmapHomeCornerKick, (int) ((viewWidth - 2 * distancePx) * (incidentTimeNumber) / maxData - bitmapHomeCornerKickWidth / 2) + distancePx, viewHeight * v, strokePain);
        }
 
    }
 
 
    private void invalidateView() {
        if (Looper.getMainLooper() == Looper.myLooper()) {
            invalidate();
        } else {
            postInvalidate();
        }
    }
 
    private int dipToPx(float dip) {
        float density = getResources().getDisplayMetrics().density;
        return (int) (dip * density + 0.5f * (dip >= 0 ? 1 : -1));
    }
}

BollProgressDataBean.class

public class BollProgressDataBean {
    private String incidentType;  //主隊比賽中的事件  0 角球 1紅牌 2進球
    private String incidentTime;  //主隊比賽中發生事件的時間
 
    public String getIncidentType() {
        return incidentType;
    }
 
    public void setIncidentType(String incidentType) {
        this.incidentType = incidentType;
    }
 
    public String getIncidentTime() {
        return incidentTime;
    }
 
    public void setIncidentTime(String incidentTime) {
        this.incidentTime = incidentTime;
    }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com