1

すでに約1週間、次の問題が発生しています。ユーザーの画面上で再スケーリングして「移動」できるようにしたい画像を描画しています。これを実現するために、ImageViewとMatrixを使用しました。これはうまく機能します。

ただし、現在、背景画像の上にいくつかの長方形を描画することを探しています。これらの長方形は、背景画像と一緒に再スケーリングおよび変換する必要があります...私たちが抱えている問題は、形状を作成し、次のコードを使用してペイントすると、画像の左上部分に次のように描画されることです。ユーザーの画面全体が実際の寸法の一部として解釈された場合...?

私のカスタムImageView

public class EnvironmentView extends ImageView {
Matrix matrix;

// We can be in one of these 3 states
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
int mode = NONE;

// Remember some things for zooming
PointF last = new PointF();
PointF start = new PointF();
float minScale = 1f;
float maxScale = 3f;
float[] m;

int viewWidth, viewHeight;
static final int CLICK = 3;
float saveScale = 1f;
protected float origWidth, origHeight;
int oldMeasuredWidth, oldMeasuredHeight;

public static boolean EDIT_RISKYZONE = false;
static boolean SAVE = false;
ScaleGestureDetector mScaleDetector;

Context context;

@Override
protected void onDraw(Canvas canvas){
    super.onDraw(canvas);

    Paint paint = new Paint();

    paint.setColor(Color.RED);
    paint.setStrokeWidth(3);
    paint.setAlpha(80);

    float left = 0;
    float top = 0;
    float right = getWidth();
    float down = getHeight();
    RectF origRect = new RectF(left, top, right, down);

    matrix.mapRect(origRect);
    canvas.drawRect(origRect, paint);



}

public EnvironmentView(Context context) {
    super(context);
    sharedConstructing(context);
}

public EnvironmentView(Context context, AttributeSet attrs) {
    super(context, attrs);
    sharedConstructing(context);
}

private void sharedConstructing(Context context) {
    super.setClickable(true);
    this.context = context;
    matrix = new Matrix();
    m = new float[9];
    setImageMatrix(matrix);
    setScaleType(ScaleType.MATRIX);
}

public void setMaxZoom(float x) {
    maxScale = x;
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    viewWidth = MeasureSpec.getSize(widthMeasureSpec);
    viewHeight = MeasureSpec.getSize(heightMeasureSpec);

    //
    // Rescales image on rotation
    //
    if (oldMeasuredHeight == viewWidth && oldMeasuredHeight == viewHeight
            || viewWidth == 0 || viewHeight == 0)
        return;
    oldMeasuredHeight = viewHeight;
    oldMeasuredWidth = viewWidth;

    if (saveScale == 1) {
        //Fit to screen.
        float scale;

        Drawable drawable = getDrawable();
        if (drawable == null || drawable.getIntrinsicWidth() == 0 || drawable.getIntrinsicHeight() == 0)
            return;
        int bmWidth = drawable.getIntrinsicWidth();
        int bmHeight = drawable.getIntrinsicHeight();

        Log.d("bmSize", "bmWidth: " + bmWidth + " bmHeight : " + bmHeight);

        float scaleX = (float) viewWidth / (float) bmWidth;
        float scaleY = (float) viewHeight / (float) bmHeight;
        scale = Math.min(scaleX, scaleY);
        matrix.setScale(scale, scale);

        // Center the image
        float redundantYSpace = (float) viewHeight - (scale * (float) bmHeight);
        float redundantXSpace = (float) viewWidth - (scale * (float) bmWidth);
        redundantYSpace /= (float) 2;
        redundantXSpace /= (float) 2;

        matrix.postTranslate(redundantXSpace, redundantYSpace);

        origWidth = viewWidth - 2 * redundantXSpace;
        origHeight = viewHeight - 2 * redundantYSpace;
        setImageMatrix(matrix);
    }
}
}

画面出力

以下は、ユーザーが画面の中央に長方形を描いた後に画面に表示されるもののスクリーンショットです。これらは、画面の幅と高さの約3/4であると想定されています。

ご協力ありがとうございました !

4

1 に答える 1

1

画像は原点(左上-0,0)から開始する必要があります。長方形は、画面の中央から幅の半分、高さの半分から開始する必要があります。

int x = (widthOfScreen - widthOfRect)/2;
int y = (heightOfScreen - heightOfRect)/2;

したがって、別のマトリックスが必要だと思います。最初に2番目のマトリックスを変換して、長方形が画面の中央に配置されるようにします。次に、他のマトリックスに行うのと同じ操作を適用します。他の行列操作が適用される前にこれを実行してみて(つまり、すべてコメントアウトして)、長方形が正しい場所に配置されることを確認してください。次に、正しい場合は、スケーリングはOKです。

于 2013-02-25T10:38:13.470 に答える