Android自定义View实现地铁显示牌效果

Android自定义View实现地铁显示牌效果,第1张

概述Android自定义View实现地铁显示牌效果 本文实例为大家分享了Android地铁显示牌的具体代码,供大家参考,具体内容如下 预览效果 目录 SubwayBoardView.java 代码 public class SubwayBoardView extends View { private Paint bgPaint, tbPaint, centerBgPaint, centerRingPaint, centerCirclePaint, centerCircleRingPaint, noStationPaint, stationPain @H_403_0@本文实例为大家分享了AndroID地铁显示牌的具体代码,供大家参考,具体内容如下

@H_403_0@预览效果

@H_403_0@

@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实现地铁显示牌效果所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1144304.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存