@H_403_8@
@H_403_0@目录@H_403_0@SubwayBoardVIEw.java@H_403_0@代码
public class SubwayBoardVIEw extends VIEw { private Paint bgPaint,tbPaint,centerBgPaint,centerRingPaint,centerCirclePaint,centerCircleRingPaint,noStationPaint,stationPaint,doorPaint; private TextPaint centerTextPaint,stationTextPaint,currentStationTextPaint,doorTextPaint; private float barHeight = DensityUtil.dp2Px(getContext(),20); private float centerCircleWIDth; private float centerRingWIDth; private float centerCircleRingstrokeWIDth = DensityUtil.dp2Px(getContext(),5); private float centerRingstrokeWIDth = DensityUtil.dp2Px(getContext(),36); private float centerCircleRingSweepAngle = 0f; private ObjectAnimator centerCircleRingAnim; private List<String> noStationStrs = new ArrayList<>(); private List<String> stationStrs = new ArrayList<>(); private String currentStationStrs = "杭州站"; private Bitmap doorBitmap; private Camera camera; public SubwayBoardVIEw(Context context) { super(context); initVIEw(); } public SubwayBoardVIEw(Context context,@Nullable AttributeSet attrs) { super(context,attrs); initVIEw(); } public SubwayBoardVIEw(Context context,@Nullable AttributeSet attrs,int defStyleAttr) { super(context,attrs,defStyleAttr); initVIEw(); } private voID initVIEw() { //全背景 bgPaint = new Paint(Paint.ANTI_AliAS_FLAG); bgPaint.setStyle(Paint.Style.FILL); bgPaint.setcolor(color.parsecolor("#85919a")); //上下边栏 tbPaint = new Paint(Paint.ANTI_AliAS_FLAG); tbPaint.setStyle(Paint.Style.FILL); tbPaint.setcolor(color.parsecolor("#c21b2c")); //中间栏 centerBgPaint = new Paint(Paint.ANTI_AliAS_FLAG); centerBgPaint.setStyle(Paint.Style.FILL); centerBgPaint.setcolor(color.parsecolor("#92a3d1")); //中间空白圆环区域 centerRingPaint = new Paint(Paint.ANTI_AliAS_FLAG); centerRingPaint.setStyle(Paint.Style.stroke); centerRingPaint.setstrokeWIDth(centerRingstrokeWIDth); centerRingPaint.setcolor(color.parsecolor("#85919a")); //中间圆 centerCirclePaint = new Paint(Paint.ANTI_AliAS_FLAG); centerCirclePaint.setStyle(Paint.Style.FILL); centerCirclePaint.setcolor(color.parsecolor("#c21b2c")); //中间圆边上的圆环 centerCircleRingPaint = new Paint(Paint.ANTI_AliAS_FLAG); centerCircleRingPaint.setStyle(Paint.Style.stroke); centerCircleRingPaint.setstrokeWIDth(centerCircleRingstrokeWIDth); centerCircleRingPaint.setstrokeCap(Paint.Cap.ROUND); centerCircleRingPaint.setcolor(color.parsecolor("#6e8ca6")); //中间文字 centerTextPaint = new TextPaint(Paint.ANTI_AliAS_FLAG); centerTextPaint.setStyle(Paint.Style.FILL); centerTextPaint.setFakeBoldText(true); centerTextPaint.setcolor(color.parsecolor("#333333")); centerTextPaint.setTextAlign(Paint.Align.CENTER); centerTextPaint.setShadowLayer(3,3,color.parsecolor("#6e8ca6")); centerTextPaint.setTextSize(DensityUtil.sp2px(getContext(),24)); //未到达的站 noStationPaint = new Paint(Paint.ANTI_AliAS_FLAG); noStationPaint.setStyle(Paint.Style.FILL_AND_stroke); noStationPaint.setcolor(color.parsecolor("#c21b2c")); //未到站文字 stationTextPaint = new TextPaint(Paint.ANTI_AliAS_FLAG); stationTextPaint.setStyle(Paint.Style.FILL); stationTextPaint.setcolor(color.parsecolor("#333333")); stationTextPaint.setTextAlign(Paint.Align.CENTER); stationTextPaint.setShadowLayer(3,color.parsecolor("#6e8ca6")); stationTextPaint.setTextSize(DensityUtil.sp2px(getContext(),18)); noStationStrs.add("宁波站"); noStationStrs.add("上虞站"); noStationStrs.add("绍兴站"); //已到达的站 stationPaint = new Paint(Paint.ANTI_AliAS_FLAG); stationPaint.setStyle(Paint.Style.FILL_AND_stroke); stationPaint.setcolor(color.parsecolor("#7586b2")); stationStrs.add("南京站"); stationStrs.add("苏州站"); stationStrs.add("上海站"); //到站文字 currentStationTextPaint = new TextPaint(Paint.ANTI_AliAS_FLAG); currentStationTextPaint.setStyle(Paint.Style.FILL); currentStationTextPaint.setFakeBoldText(true); currentStationTextPaint.setcolor(color.parsecolor("#3d5d9a")); currentStationTextPaint.setTextAlign(Paint.Align.left); currentStationTextPaint.setTextSize(DensityUtil.sp2px(getContext(),18)); doorPaint = new Paint(Paint.ANTI_AliAS_FLAG); doorBitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.open_door); doorTextPaint = new TextPaint(Paint.ANTI_AliAS_FLAG); doorTextPaint.setStyle(Paint.Style.FILL); doorTextPaint.setcolor(color.parsecolor("#c21b2c")); doorTextPaint.setTextAlign(Paint.Align.left); doorTextPaint.setTextSize(DensityUtil.sp2px(getContext(),14)); camera = new Camera(); } @OverrIDe protected voID onDraw(Canvas canvas) { super.onDraw(canvas); int wIDth = getWIDth(); int height = getHeight(); int centerX = wIDth / 2; int centerY = height / 2; //计算中间空白圆形宽度 if (0 == centerRingWIDth) { centerRingWIDth = (height - DensityUtil.dp2Px(getContext(),12)) * 1f / 2; } //计算中间圆的半径 if (0 == centerCircleWIDth) { centerCircleWIDth = centerRingWIDth - DensityUtil.dp2Px(getContext(),8); } //背景 canvas.drawRect(0,wIDth,height,bgPaint); //上下栏 canvas.drawRect(0,barHeight,tbPaint); canvas.drawRect(0,height - barHeight,tbPaint); //中间圆环空白区域 canvas.drawCircle(centerX,centerY,centerRingWIDth,centerRingPaint); //中间栏 float centerlineT = barHeight + DensityUtil.dp2Px(getContext(),10); float centerlineB = height - barHeight - DensityUtil.dp2Px(getContext(),10); canvas.drawRect(0,centerlineT,centerlineB,centerBgPaint); //中间圆 canvas.drawCircle(centerX,centerCircleWIDth,centerCirclePaint); //中间圆环 if (centerCircleRingSweepAngle > 0) { canvas.drawArc(centerX - centerCircleWIDth - (centerCircleRingstrokeWIDth / 2),centerY - centerCircleWIDth - (centerCircleRingstrokeWIDth / 2),centerX + centerCircleWIDth + (centerCircleRingstrokeWIDth / 2),centerY + centerCircleWIDth + (centerCircleRingstrokeWIDth / 2),-90f,centerCircleRingSweepAngle,false,centerCircleRingPaint); } //中间文字 Paint.FontMetrics FontMetrics = centerTextPaint.getFontMetrics(); float dx = (FontMetrics.bottom - FontMetrics.top) / 2 - FontMetrics.bottom; canvas.drawText(currentStationStrs,centerX,centerY + dx,centerTextPaint); //未到站 float stationStart = DensityUtil.dp2Px(getContext(),20); float stationWIDth = DensityUtil.dp2Px(getContext(),40); float stationpadding = DensityUtil.dp2Px(getContext(),20); for (int i = 0; i < noStationStrs.size(); i++) { canvas.drawPath(getStationVIEw(stationStart + (stationWIDth + stationpadding) * i,stationWIDth,centerlineB),noStationPaint); //保存画布 canvas.save(); String stationStr = noStationStrs.get(i); Paint.FontMetrics fm = stationTextPaint.getFontMetrics(); //文字高度 float FontHeight = (fm.bottom - fm.top) * stationStr.length(); //显示高度 float showHeigth = centerlineB - centerlineT; //移动画布 canvas.translate(stationStart + (stationWIDth + stationpadding) * i + stationWIDth / 3,centerlineT + (showHeigth - FontHeight) / 2); float strWIDth = stationTextPaint.measureText(stationStr) / stationStr.length(); StaticLayout staticLayout; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { staticLayout = StaticLayout.Builder.obtain(stationStr,stationStr.length(),(int) strWIDth).build(); } else { staticLayout = new StaticLayout(stationStr,(int) strWIDth,Layout.Alignment.AliGN_CENTER,1,true); } //绘制 staticLayout.draw(canvas); //还原画布 canvas.translate(-stationStart + (stationWIDth + stationpadding) * i,-centerlineT); canvas.restore(); } //已过站 float stationEnd = getWIDth() - DensityUtil.dp2Px(getContext(),20) - stationWIDth; for (int i = 0; i < stationStrs.size(); i++) { canvas.drawPath(getStationVIEw(stationEnd - (stationWIDth + stationpadding) * i,stationPaint); //保存画布 canvas.save(); String stationStr = noStationStrs.get(i); Paint.FontMetrics fm = stationTextPaint.getFontMetrics(); //文字高度 float FontHeight = (fm.bottom - fm.top) * stationStr.length(); //显示高度 float showHeigth = centerlineB - centerlineT; //移动画布 canvas.translate(stationEnd - (stationWIDth + stationpadding) * i + stationWIDth / 3,-centerlineT); canvas.restore(); } //到达站 String curentStr = "停靠站" + currentStationStrs; float FontwIDth = stationTextPaint.measureText(curentStr) / curentStr.length(); float pointX = centerX - centerRingWIDth - FontwIDth * 3 - DensityUtil.dp2Px(getContext(),26); Paint.FontMetrics fm = stationTextPaint.getFontMetrics(); float pointY = centerlineT + ((centerlineB - centerlineT) - (fm.bottom - fm.top) * 2) / 2; canvas.save(); canvas.translate(pointX,pointY); StaticLayout staticLayout; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { staticLayout = StaticLayout.Builder.obtain(curentStr,curentStr.length(),(int) (FontwIDth * 3)).build(); } else { staticLayout = new StaticLayout(curentStr,(int) (FontwIDth * 3),true); } //绘制 staticLayout.draw(canvas); canvas.translate(-pointX,-centerlineT); canvas.restore(); //开门提示 String primt = "注意开门"; float doorTextWIDth = doorTextPaint.measureText(primt); Paint.FontMetrics doorTextFm = doorTextPaint.getFontMetrics(); float doorTextheight = doorTextFm.bottom - doorTextFm.top; float dy = doorTextheight / 2 - doorTextFm.bottom; int doorTextleft = (int) (centerX + centerRingWIDth + DensityUtil.dp2Px(getContext(),26)); Rect rect = new Rect(); rect.left = (int) (doorTextleft + ((doorTextWIDth - doorBitmap.getWIDth()) / 2)); rect.top = (int) (centerlineT + ((centerlineB - centerlineT) - (doorBitmap.getHeight() + DensityUtil.dp2Px(getContext(),6) + + doorTextheight)) / 2); rect.right = rect.left + doorBitmap.getWIDth(); rect.bottom = rect.top + doorBitmap.getHeight(); //旋转 canvas.save(); camera.save(); canvas.translate(rect.left,rect.top); camera.rotateY(-45); camera.applyToCanvas(canvas); canvas.translate(-rect.left,-rect.top); camera.restore(); canvas.drawBitmap(doorBitmap,null,rect,doorPaint); canvas.restore(); canvas.drawText(primt,doorTextleft,rect.bottom + DensityUtil.dp2Px(getContext(),6) + (doorTextheight / 2) + dy,doorTextPaint); } /** * 获取站信息 * * @param pl * @param wIDth * @param centerlineT * @param centerlineB * @return */ private Path getStationVIEw(float pl,float wIDth,float centerlineT,float centerlineB) { float pt = centerlineT; float pr = pl + wIDth; float pb = centerlineB; float r = (pr - pl) / 3; Path path = new Path(); path.moveto(pl,pt); path.lineto(pr,pt); path.quadTo(pr - r,pt + (pb - pt) / 2,pr,pb); path.lineto(pl,pb); path.quadTo(pl - r,pl,pt); path.close(); return path; } public voID setCenterCircleRingSweepAngle(float centerCircleRingSweepAngle) { this.centerCircleRingSweepAngle = centerCircleRingSweepAngle; invalIDate(); } /** * 开始中间圆动画 */ public voID animCenterCircleRing() { if (null == centerCircleRingAnim) { centerCircleRingAnim = ObjectAnimator.offloat(this,"centerCircleRingSweepAngle",0f,360f); centerCircleRingAnim.setDuration(3000); centerCircleRingAnim.setInterpolator(new linearInterpolator()); centerCircleRingAnim.setRepeatCount(ValueAnimator.INFINITE); centerCircleRingAnim.setRepeatMode(ValueAnimator.RESTART); } centerCircleRingAnim.start(); } /** * 停止 */ public voID stopAnimCenterCircleRing() { if (null != centerCircleRingAnim) { centerCircleRingAnim.cancel(); } setCenterCircleRingSweepAngle(0); }}@H_403_0@以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。 总结
以上是内存溢出为你收集整理的Android自定义View实现地铁显示牌效果全部内容,希望文章能够帮你解决Android自定义View实现地铁显示牌效果所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)