在外部类中确定屏幕尺寸然后调整手写捕获视图的笔画宽度以使其缩放良好的最佳方法是什么?
我在外部库中有这个 SignatureCanvas.java 类。如您所见,我已将笔划宽度设置为一个常数,这很有效(这没什么奇怪的!)。但是,由于我一直在各种设备和仿真器(不同屏幕尺寸)上进行测试,笔画宽度不会转换为任何类型的引擎盖下的像素->倾斜(这是可以理解的!)。因此,在较旧/较小的屏幕尺寸上,这个 8 的笔画宽度实际上看起来像 14,并且签名变得不可读。
我进行了一些头脑风暴,并提出了概括屏幕分辨率并为每个“括号”(可以这么说)设置默认笔画宽度的想法,并在需要时应用它。但是,这似乎有点垃圾,我想知道以前是否有人遇到过这种困境以及您是如何解决的?
该类在这里纯粹是为了演示目的,代码本身没有任何问题。
包 com.goosesys.gooselib.Views;
导入android.content.Context;
导入android.graphics.Bitmap;
导入android.graphics.Canvas;
导入android.graphics.Paint;
导入android.graphics.Path;
导入 android.graphics.PorterDuff;
导入android.util.AttributeSet;
导入 android.view.MotionEvent;
导入android.view.View;
公共类 SignatureCanvas 扩展视图 {
私人最终浮动 STROKE_WIDTH = 8f;
私有最终布尔值 ANTI_ALIAS = true;
私人最终int DEFAULT_PEN_COLOUR = 0xFF000000;
私有路径drawPath;
私人油漆drawPaint;
私人画布画布;
私人intpaintColour = DEFAULT_PEN_COLOUR;
私人画布drawCanvas;
私有位图画布位图;
/*
* 构造函数
*/
// 主要代码内构造函数 //
公共签名画布(上下文上下文){
超级(上下文);
设置绘图();
}
// UI 布局工具中使用的构造函数 - 自定义视图
public SignatureCanvas(上下文上下文,AttributeSet attributeSet){
超级(上下文,属性集);
设置绘图();
}
/*
* 方法
*/
私人无效 setupDrawing(){
绘制路径 = 新路径();
drawPaint = new Paint();
// 设置绘图的初始颜色
drawPaint.setColor(paintColour);
//设置路径
drawPaint.setAntiAlias(ANTI_ALIAS);
drawPaint.setStrokeWidth(STROKE_WIDTH);
drawPaint.setStyle(Paint.Style.STROKE);
drawPaint.setStrokeJoin(Paint.Join.ROUND);
drawPaint.setStrokeCap(Paint.Cap.ROUND);
// 最后创建一个新的画布绘制对象
canvasPaint = new Paint(Paint.DITHER_FLAG);
}
公共无效clearCanvas(){
drawCanvas.drawColor(0, PorterDuff.Mode.CLEAR);
无效();
}
公共位图 saveSignature(){
返回 Bitmap.createBitmap(canvasBitmap);
}
/*
*(非 Javadoc)
* @see android.view.View#onSizeChanged(int, int, int, int)
*/
@覆盖
受保护的无效 onSizeChanged(int w,int h,int oldw,int oldh){
super.onSizeChanged(w, h, oldw, oldh);
// 查看给定大小
canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
drawCanvas = new Canvas(canvasBitmap);
}
@覆盖
受保护的无效onDraw(帆布画布){
// 绘制视图
canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
canvas.drawPath(drawPath, drawPaint);
}
@覆盖
公共布尔 onTouchEvent(MotionEvent 事件){
// 检测用户触摸
浮动 touchX = event.getX();
浮动 touchY = event.getY();
开关(事件.getAction()){
案例 MotionEvent.ACTION_DOWN:
drawPath.moveTo(touchX, touchY);
休息;
案例 MotionEvent.ACTION_MOVE:
drawPath.lineTo(touchX, touchY);
休息;
案例 MotionEvent.ACTION_UP:
drawCanvas.drawPath(drawPath, drawPaint);
drawPath.reset();
休息;
默认:
返回假;
}
无效();
返回真;
}
}