上次去一个公司面试,面试官问了一个题,怎么用android的自定义view实现一个公章的效果,据说这是华为之前的面试题,我想了下,要是公章的效果,最外层是一个圆,里面是一个五角星,但是这文字怎么画呢,比较难搞,后来回来看了下java的api,发现人家的Path里面本来就提供了这么一个方法:

public void addArc(RectF oval, float startAngle, float sweepAngle) {addArc(oval.left, oval.top, oval.right, oval.bottom, startAngle, sweepAngle);
}

然后人家解释说了,根据狐线的角度生成相应的路径,所以我们就可以给文字设置一个相应绘制区域,使其绘制的文字都在这个区域内,

path.addArc(oval,-(firstrad-textPadding*i/2), textPadding);
接下来我们只需要在这个区域内把文字绘制上去就行了。
好的,下面是全部代码:

首先继承自View,我们在构造里面初始化,同样为了方便程序的扩展性,我们用自定义属性,
<declare-styleable name="Seal"><attr name="scale_text_size" format="dimension" /><attr name="scale_text_color" format="color" /><attr name="scale_text" format="string" /><attr name="scale_text_padding" format="float" /><attr name="circle_stroke_width" format="dimension" /><attr name="circle_color" format="color" /><attr name="circle_radius" format="dimension" />
</declare-styleable>
然后我们初始化的时候主要初始化文字,文字大小,文字间距,文字颜色等等,
接下来我们在重写Ondraww(Canvas canvas)
private void initViews(AttributeSet attrs, int defStyle) {TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.Seal, defStyle, 0);circleText = typedArray.getString(R.styleable.Seal_scale_text);textSize = typedArray.getDimension(R.styleable.Seal_scale_text_size, 20);scaleTextColor = typedArray.getColor(R.styleable.Seal_scale_text_color, getResources().getColor(R.color.c9));textPadding=typedArray.getFloat(R.styleable.Seal_scale_text_padding,50);circleStrokeWidth = typedArray.getDimensionPixelSize(R.styleable.Seal_circle_stroke_width, 3);circleColor = typedArray.getColor(R.styleable.Seal_circle_color, getResources().getColor(R.color.c9));circleRadius = typedArray.getDimensionPixelSize(R.styleable.Seal_circle_radius, 7);typedArray.recycle();
}

@Override
protected void onDraw(Canvas rootCanvas) {super.onDraw(rootCanvas);Bitmap image = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(image);Paint paint=new Paint();drawRing(canvas,paint);drawStar(canvas);drawText(canvas);rootCanvas.drawBitmap(image, 0, 0, null);
}

接下来是对应的三个方法:画圆环(ring),五角星(star),文字(text)
//圆环
//绘制五角星
最后在我们需要的视图中引用下就好了
private void drawText(Canvas canvas){Paint paint = new Paint();paint.setColor(Color.RED);paint.setTypeface(Typeface.DEFAULT_BOLD);paint.setTextAlign(Paint.Align.CENTER);paint.setTextSize(radius/5+5);//圆弧文字所在矩形范围RectF oval=new RectF(0, 0, 2*radius, (float) (2*radius));//第一个文字偏移角度,其中padding/2为文字间距float firstrad = 90 + textPadding * (circleText.length()) / 4 - textPadding/8;for(int i = 0; i < circleText.length(); i++){Path path = new Path();//根据角度生成弧线路径path.addArc(oval,-(firstrad-textPadding*i/2), textPadding);canvas.drawTextOnPath(String.valueOf(circleText.charAt(i)), path, -(float) (radius/3),(float) (radius/3), paint);}
}

private void drawStar(Canvas canvas){float start_radius = (float) ((radius / 2)*1.1);int x = centre, y = centre;float x1,y1,x2,y2,x3,y3,x4,y4,x5,y5;float r72 = (float) Math.toRadians(72);float r36 = (float) Math.toRadians(36);//顶点x1 = x;y1 = y - start_radius;//左1x2 = (float) (x - start_radius*Math.sin(r72));y2 = (float) (y - start_radius*Math.cos(r72));//右1x3 = (float) (x + start_radius*Math.sin(r72));y3 = (float) (y - start_radius*Math.cos(r72));//左2x4 = (float) (x - start_radius*Math.sin(r36));y4 = (float) (y + start_radius*Math.cos(r36));//右2x5 = (float) (x + start_radius*Math.sin(r36));y5 = (float) (y + start_radius*Math.cos(r36));//连接各个节点,绘制五角星Path path = new Path();path.moveTo(x1, y1);path.lineTo(x5, y5);path.lineTo(x2, y2);path.lineTo(x3, y3);path.lineTo(x4, y4);path.close();Paint paint = new Paint();paint.setColor(Color.RED);canvas.drawPath(path, paint);
}
//文字
private void drawRing(Canvas canvas, Paint paint) {centre = canvas.getWidth() / 2; // 获取圆心的x坐标radius = (int) (centre - circleStrokeWidth / 2); // 圆环的半径paint.setColor(Color.RED); // 设置圆环的颜色paint.setStyle(Paint.Style.STROKE); // 设置空心paint.setStrokeWidth(circleStrokeWidth); // 设置圆环的宽度paint.setAntiAlias(true); // 消除锯齿canvas.drawCircle(centre, centre, radius, paint); // 画出圆环
}

有需要源码的,请到下面地址下载:http://download.csdn.net/detail/xiangzhihong8/9479372
好的,就是这么简单,有任何疑问的请加我们的技术群278792776或者188716429
<com.xzh.sealmaster.view.SealViewandroid:layout_width="200dp"android:layout_height="200dp"android:layout_gravity="center"app:scale_text_size="16sp"app:scale_text_padding="50"app:scale_text="华为上海有限公司"/>
												

android自定义view实现公章效果相关推荐

  1. android中仿qq最新版抽屉,Android 自定义View实现抽屉效果

    Android 自定义View实现抽屉效果 说明 这个自定义View,没有处理好多点触摸问题 View跟着手指移动,没有采用传统的scrollBy方法,而是通过不停地重新布局子View的方式,来使得子 ...

  2. Android 自定义 圆环,Android自定义view实现圆环效果实例代码

    先上效果图,如果大家感觉不错,请参考实现代码. 重要的是如何实现自定义的view效果 (1)创建类,继承view,重写onDraw和onMesure方法 public class CirclePerc ...

  3. android波纹效果弹窗,Android自定义View实现波纹效果

    Android自定义View实现波纹效果 时间:2017-05-27     来源:移动互联网学院 1.引言:随着Android智能手机的普及,Android应用得到了大力支持,而Android应用的 ...

  4. android 循环弹幕,Android自定义View实现弹幕效果

    原标题:Android自定义View实现弹幕效果 在很多视频直播中都有弹幕功能,而安卓上没有简单好用的弹幕控件,本文介绍一个自定义弹幕view的demo. 效果图: 思路: 自定义Textitem类表 ...

  5. android下雨动画效果,Android 自定义View(二) 下雨效果

    Rain.gif Android 自定义View(二) 下雨效果 一 实现思路, 雨点用线段表示,通过控制线段的大小和宽度来表示不同的线段. 一个雨点下雨的过程可以表示为一条直线,一次雨点在下雨的过程 ...

  6. android功能相同的view,Android自定义View实现扫描效果

    本文实例为大家分享了Android自定义View实现扫描效果的具体代码,供大家参考,具体内容如下 演示效果如下: 实现内容: 1.控制动画是竖向或者横向 2.控制动画初始是从底部/左边开始,或者从上边 ...

  7. Android自定义View之奖券效果

    Android自定义View之奖券 2016-08-14 Android学习交 自定义View一直都是android进阶征途上必须要攻克的一关,很多初学者初接触自定义View时心中都会充满恐惧,有种不 ...

  8. Android自定义sleep图,android自定义view实现钟表效果

    本文实例为大家分享了android view实现钟表的具体代码,供大家参考,具体内容如下 先看效果图: 自定义view大家肯定已经不陌生了,所以直接今天直接步入正题:如何利用canvas去绘制出一个钟 ...

  9. android 文字锯齿,android自定义view锯齿状效果

    效果图 public class SawtoothBlackView extends View { //自定义画笔的属性 private Paint paint; //获取屏幕的系数 private ...

最新文章

  1. 【Qt】Qt编码风格、命名约定
  2. RabbitMQ通配符模式以及与Routing模式的区别
  3. 模拟赛-20190228-随机数(random)
  4. 集线器(Hub)、交换机(Switch)与路由器(Router)之间的区别和联系
  5. echarts生成图表
  6. 就业信息网进行服务器维护,服务器安全武汉大学黄石理工学院就业信息网.pptx...
  7. 不是计算机专业及其相关专业,对软件编程一窍不通,能学好编程吗?
  8. Android之launchMode总结
  9. 推搡辱骂外卖小哥 美女主持人再发道歉视频:网友集体不买账
  10. c语言c程序由函数构成 每个函数完成相对独立的功能,17秋学期(1709)《C语言程序设计》在线作业  满分...
  11. 你那不是拖延症,只是习惯性逃避
  12. PTA程序设计类实验辅助教学平台-基础编程题--JAVA--7.2 然后是几点
  13. Windows 2016 出現 0xc0000135 ServerManager.exe 无法启用
  14. 宅家必备 | 笔记本开启WiFi共享
  15. 无人值守安装系统完整(CentOS7)
  16. linux输入特殊符号密码,linux 输入特殊符号
  17. UE4之VR手柄和3D UI控件如何交互
  18. PyTorch 深度剖析:并行训练的 DP 和 DDP 分别在什么情况下使用及实例
  19. LeetCode 69: Sqrt(x) 求根号x(牛顿迭代法和二分查找法)
  20. 晨枫U盘维护V2.0_512M被淹死的鱼修正版

热门文章

  1. 对接新泰构建实体模式 李刚:金谷诺亚元宇宙赋能产业体系
  2. 超级好用的录屏软件:FSCapture
  3. gif动图怎么制作?怎么把视频做成gif?
  4. 关于Java调用.NET WCF和Webservice以及javaWebService通用的一种方法
  5. 2022.3《樊登将论语》
  6. 2PSK调制解调实验
  7. 要成为一名考古学者要具备什么
  8. Ubuntu环境下下载pulp遇到的问题解决
  9. 刘一男词汇课(从shift到string):“重复是记忆之母,理解是记忆之父。“
  10. matlab实现rgb转ycgcr以及rgb转hsi