外部クラスで画面サイズを決定し、手書きキャプチャ ビューのストローク幅を調整して適切にスケーリングするには、どのような方法が最適でしょうか?
外部ライブラリに、この 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 を返します。
}
}