<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32: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。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45