外部クラスで画面サイズを決定し、手書きキャプチャ ビューのストローク幅を調整して適切にスケーリングするには、どのような方法が最適でしょうか?
外部ライブラリに、この 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 をインポートします。 public class SignatureCanvas extends View { プライベートファイナルフロート STROKE_WIDTH = 8f; プライベート 最終ブール値 ANTI_ALIAS = true; private final int DEFAULT_PEN_COLOUR = 0xFF000000; プライベート パス drawPath; プライベート ペイント drawPaint; プライベート ペイント canvasPaint; プライベート int paintColour = DEFAULT_PEN_COLOUR; プライベート キャンバス drawCanvas; プライベート ビットマップ canvasBitmap; /* * コンストラクター */ // コード内のメイン コンストラクター // public SignatureCanvas(コンテキスト コンテキスト) { スーパー(コンテキスト); setupDrawing(); } // UI レイアウト ツールで使用するコンストラクター - カスタム ビュー public SignatureCanvas(Context context, AttributeSet attributeSet){ スーパー (コンテキスト、attributeSet); setupDrawing(); } /* * メソッド */ プライベートボイド setupDrawing(){ drawPath = 新しいパス(); drawPaint = new Paint(); // 描画の初期色を設定 drawPaint.setColor(ペイントカラー); // パスを設定 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); } public void clearCanvas(){ drawCanvas.drawColor(0, PorterDuff.Mode.CLEAR); 無効にする(); } public Bitmap saveSignature(){ return Bitmap.createBitmap(canvasBitmap); } /* * (非 Javadoc) * @see android.view.View#onSizeChanged(int, int, int, int) */ @オーバーライド protected void 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); } @オーバーライド protected void onDraw(キャンバス キャンバス){ // ビューを描画 canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint); canvas.drawPath(drawPath, drawPaint); } @オーバーライド public boolean onTouchEvent(モーションイベントイベント){ // ユーザーのタッチを検出 float touchX = event.getX(); float touchY = event.getY(); スイッチ(event.getAction()){ ケース MotionEvent.ACTION_DOWN: drawPath.moveTo(touchX, touchY); 壊す; ケース MotionEvent.ACTION_MOVE: drawPath.lineTo(touchX, touchY); 壊す; ケース MotionEvent.ACTION_UP: drawCanvas.drawPath(drawPath, drawPaint); drawPath.reset(); 壊す; デフォルト: false を返します。 } 無効にする(); true を返します。 } }