0

外部クラスで画面サイズを決定し、手書きキャプチャ ビューのストローク幅を調整して適切にスケーリングするには、どのような方法が最適でしょうか?

外部ライブラリに、この 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 を返します。
    }   
}
4

1 に答える 1

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);

}
于 2013-10-31T15:23:55.243 に答える