确定签名捕获笔画宽度的屏幕尺寸的最佳方法?

Posted

技术标签:

【中文标题】确定签名捕获笔画宽度的屏幕尺寸的最佳方法?【英文标题】:Best way to determine screen dimensions for signature capture stroke width? 【发布时间】:2013-11-11 16:20:10 【问题描述】:

在外部类中确定屏幕大小然后调整手写捕获视图的笔画宽度以使其缩放良好的最佳方法是什么?

我在外部库中有这个 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(); 休息; 默认: 返回假; 无效(); 返回真;

【问题讨论】:

【参考方案1】:
public static int convertDpsToPixels(Context context, int dps) 
    // http://developer.android.com/guide/practices/screens_support.html

    // Convert the dps to pixels
    final float scale = context.getResources().getDisplayMetrics().density;
    final float dpsFloat = dps;
    return (int) (dpsFloat * scale + 0.5f);


【讨论】:

以上是关于确定签名捕获笔画宽度的屏幕尺寸的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

确定多个 android 屏幕尺寸/密度的图像尺寸

响应式布局概念

如何更改VirtualBox默认的最大屏幕尺寸

如何更改VirtualBox默认的最大屏幕尺寸

如何更改VirtualBox默认的最大屏幕尺寸

有没有办法使用几何阅读器将我的 SwiftUI 图像的宽度定义为相对于屏幕尺寸?