腾讯面试--->绘制印章实现
2015-08-26 16:41
489 查看
问题:如何画出一个印章的图案?
1.印章实现类
public class CreateSeal {
private int roundWidth = 10; // 边框宽度
float padding = 50; // 文字所占角度
private String content;
private Canvas canvas;
private Paint paint;
private Bitmap bitmap;
private int centre;
private int radius;
/***
*
* @param width
* @param content
* @param bitmap
*/
public CreateSeal(int width, String content, Bitmap bitmap) {
this.roundWidth = width;
this.content = content;
this.bitmap = bitmap;
canvas = new Canvas(bitmap);
paint = new Paint();
}
private void getSeal() {
getRing();
drawStar();
drawText();
}
// 绘制圆环
private void getRing() {
centre = canvas.getWidth() / 2; // 获取圆心的x坐标
radius = (int) (centre - roundWidth / 2); // 圆环的半径
paint.setColor(Color.RED); // 设置圆环的颜色
paint.setStyle(Paint.Style.STROKE); // 设置空心
paint.setStrokeWidth(roundWidth); // 设置圆环的宽度
paint.setAntiAlias(true); // 消除锯齿
canvas.drawCircle(centre, centre, radius, paint); // 画出圆环
}
// 绘制五角星
private void drawStar() {
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;
// 左1
x2 = (float) (x - start_radius * Math.sin(r72));
y2 = (float) (y - start_radius * Math.cos(r72));
// 右1
x3 = (float) (x + start_radius * Math.sin(r72));
y3 = (float) (y - start_radius * Math.cos(r72));
// 左2
x4 = (float) (x - start_radius * Math.sin(r36));
y4 = (float) (y + start_radius * Math.cos(r36));
// 右2
x5 = (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 drawText() {
// 设置文字属性
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setTypeface(Typeface.DEFAULT_BOLD);
paint.setTextSize(radius / 5 + 5);
paint.setTextAlign(Align.CENTER);
// 圆弧文字所在矩形范围
RectF oval = new RectF(0, 0, 2 * radius, (float) (2 * radius));
// 第一个文字偏移角度,其中padding/2为文字间距
float firstrad = 90 + padding * (content.length()) / 4 - padding / 8;
for (int i = 0; i < content.length(); i++) {
Path path = new Path();
// 根据角度生成弧线路径
path.addArc(oval, -(firstrad - padding * i / 2), padding);
canvas.drawTextOnPath(String.valueOf(content.charAt(i)), path,
-(float) (radius / 3), (float) (radius / 3), paint);
}
}
public Bitmap getBitmap() {
getSeal();
return bitmap;
}
public int getRoundWidth() {
return roundWidth;
}
}
2.自己封装类
public class SealView extends CreateSeal {
public SealView(int width, String content, Bitmap bitmap) {
super(width, content, bitmap);
}
/***
* 绘制印章
*
* @param width
* 印章边框宽度
* @param content
* 印章内容
* @param diameter
* 印章直径
* @return 印章位图
*/
public static Bitmap DrawDeal(int width, String content, int diameter) {
Bitmap bitmap = Bitmap.createBitmap(diameter, diameter,
Config.ARGB_8888);
SealView s = new SealView(width, content, bitmap);
return s.getBitmap();
}
}
3.Android实现绘制
ImageView view = (ImageView) findViewById(R.id.imageView1);
view.setImageBitmap(SealView.DrawDeal(10, "上海曦日能源科技有限公司", 400));
4.效果呈现
920e
1.印章实现类
public class CreateSeal {
private int roundWidth = 10; // 边框宽度
float padding = 50; // 文字所占角度
private String content;
private Canvas canvas;
private Paint paint;
private Bitmap bitmap;
private int centre;
private int radius;
/***
*
* @param width
* @param content
* @param bitmap
*/
public CreateSeal(int width, String content, Bitmap bitmap) {
this.roundWidth = width;
this.content = content;
this.bitmap = bitmap;
canvas = new Canvas(bitmap);
paint = new Paint();
}
private void getSeal() {
getRing();
drawStar();
drawText();
}
// 绘制圆环
private void getRing() {
centre = canvas.getWidth() / 2; // 获取圆心的x坐标
radius = (int) (centre - roundWidth / 2); // 圆环的半径
paint.setColor(Color.RED); // 设置圆环的颜色
paint.setStyle(Paint.Style.STROKE); // 设置空心
paint.setStrokeWidth(roundWidth); // 设置圆环的宽度
paint.setAntiAlias(true); // 消除锯齿
canvas.drawCircle(centre, centre, radius, paint); // 画出圆环
}
// 绘制五角星
private void drawStar() {
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;
// 左1
x2 = (float) (x - start_radius * Math.sin(r72));
y2 = (float) (y - start_radius * Math.cos(r72));
// 右1
x3 = (float) (x + start_radius * Math.sin(r72));
y3 = (float) (y - start_radius * Math.cos(r72));
// 左2
x4 = (float) (x - start_radius * Math.sin(r36));
y4 = (float) (y + start_radius * Math.cos(r36));
// 右2
x5 = (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 drawText() {
// 设置文字属性
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setTypeface(Typeface.DEFAULT_BOLD);
paint.setTextSize(radius / 5 + 5);
paint.setTextAlign(Align.CENTER);
// 圆弧文字所在矩形范围
RectF oval = new RectF(0, 0, 2 * radius, (float) (2 * radius));
// 第一个文字偏移角度,其中padding/2为文字间距
float firstrad = 90 + padding * (content.length()) / 4 - padding / 8;
for (int i = 0; i < content.length(); i++) {
Path path = new Path();
// 根据角度生成弧线路径
path.addArc(oval, -(firstrad - padding * i / 2), padding);
canvas.drawTextOnPath(String.valueOf(content.charAt(i)), path,
-(float) (radius / 3), (float) (radius / 3), paint);
}
}
public Bitmap getBitmap() {
getSeal();
return bitmap;
}
public int getRoundWidth() {
return roundWidth;
}
}
2.自己封装类
public class SealView extends CreateSeal {
public SealView(int width, String content, Bitmap bitmap) {
super(width, content, bitmap);
}
/***
* 绘制印章
*
* @param width
* 印章边框宽度
* @param content
* 印章内容
* @param diameter
* 印章直径
* @return 印章位图
*/
public static Bitmap DrawDeal(int width, String content, int diameter) {
Bitmap bitmap = Bitmap.createBitmap(diameter, diameter,
Config.ARGB_8888);
SealView s = new SealView(width, content, bitmap);
return s.getBitmap();
}
}
3.Android实现绘制
ImageView view = (ImageView) findViewById(R.id.imageView1);
view.setImageBitmap(SealView.DrawDeal(10, "上海曦日能源科技有限公司", 400));
4.效果呈现
920e
相关文章推荐
- 机器学习算法面试—口述(6):数据的简化(PCA、SVD)
- 《招聘一个靠谱的iOS》面试题参考答案(下)
- 你应该认识的 12 位最有影响力的程序员
- 黑马程序员 多线程
- 面试题27二叉搜索树与双向链表
- Android程序员 ios开发之旅之遇见雨燕
- 自己来试着笔记(zhongjie)一下面试大题之一(String s = new String("xyz");创建了几个对象? )
- 四十条测试你是不是合格的PHP程序员
- 黑马程序员——Set接口
- 黑马程序员——List接口
- 黑马程序员——Java基础---泛型、集合框架工具类
- 失业七个月,面试六十家公司的深圳体验
- OC内存管理
- Android技术面试相关
- java面试总结
- 最老程序员创业开发实训2---采用MVC架构的应用Splash页面实现
- 推荐!国外程序员整理的Java资源大全
- 黑马程序员——java基础——Java中常用关键字解析
- 一个简单的排序面试题
- 腾讯后台服务器面试题总结