1

このビューの中心に円を描くカスタム ビューを作成しようとしています (位置は常に固定されています)。この円のスケールをピンチ ジェスチャを使用して実装したいと考えています (ScaleGestureDetector を使用しました)。

カスタム レイアウトの中央に円を描くことはできましたが、ピンチ ジェスチャを使用して正しくスケーリングする機能を実装できません。

どうすればそれができるかヒントを教えてください。

前もって感謝します!!

カスタム イメージ ビュー

更新:これは私の現在のコードです。テストすると、ピンチすると円が移動することがわかります。円が常にビューの中心に留まるようにします。

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;

public class CoasterView extends View {
private static float MIN_ZOOM = 0;
private static float MAX_ZOOM = 5f;

private static float RADIO = 100f;


private float scaleFactor = 1.f;
private ScaleGestureDetector detector;


Paint paint;

public CoasterView(Context paramContext) {
    super(paramContext);
    detector = new ScaleGestureDetector(paramContext, new ScaleListener());

    init();
}

public CoasterView(Context paramContext, AttributeSet paramAttributeSet) {
    super(paramContext, paramAttributeSet);
    detector = new ScaleGestureDetector(getContext(), new ScaleListener());

    init();
}

public CoasterView(Context paramContext, AttributeSet paramAttributeSet, int paramInt) {
    super(paramContext, paramAttributeSet, paramInt);
    detector = new ScaleGestureDetector(getContext(), new ScaleListener());

    init();
}

private void init() {
    this.paint = new Paint();
    this.paint.setColor(-16711936);
    this.paint.setStrokeWidth(40.0F);
    this.paint.setStyle(Paint.Style.FILL);
}

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

    canvas.save();
    canvas.scale(scaleFactor, scaleFactor);
    canvas.drawCircle(getWidth() / 2, getHeight() / 2, RADIO, paint);
    canvas.restore();

}




@Override
public boolean onTouchEvent(MotionEvent event) {
    detector.onTouchEvent(event);

    invalidate();
    return true;

}

private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
    @Override
    public boolean onScale(ScaleGestureDetector detector) {

        scaleFactor *= detector.getScaleFactor();
        scaleFactor = Math.max(MIN_ZOOM, Math.min(scaleFactor, MAX_ZOOM));
        invalidate();
        return true;
    }
}
}
4

2 に答える 2

1

キャンバス全体をスケーリングしています。描画された円の半径にのみスケーリングを適用するのが最善です。

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.save();
    //canvas.scale(scaleFactor, scaleFactor);
    canvas.drawCircle(getWidth() / 2, getHeight() / 2, RADIO * scaleFactor, paint);
    canvas.restore();
}

キャンバス全体を拡大縮小したい場合 (キャンバスに画像など他のものを描画する場合...)、円を中心に戻す必要があります。

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.save();
    canvas.scale(scaleFactor, scaleFactor);
    canvas.drawCircle(getWidth() / 2 / scaleFactor, getHeight() / 2 / scaleFactor, RADIO, paint);
    canvas.restore();
}
于 2013-09-29T15:56:35.037 に答える
0

ScaleGestureDetector.getScaleFactor() を使用して、スケール レートを取得し、円の新しい半径を計算して、描画を無効にすることができます。

于 2013-09-28T02:54:18.047 に答える