Canvas - zoom avant, déplacement et mise à l'échelle sur Android

Je suis actuellement à la mise en œuvre d'une fonction draw sur une webview image (l'éléphant ci-dessous). Je n'ai pas de problème de dessin sur elle, mais la fonction de zoom n'certains des trucs funky (2ème image ci-dessous) sur le dessin. Quand je zoom, le dessin n'a pas de zoom, mais plutôt les changements. Dessin au zoom ne fonctionne pas. Mon code est ci-dessous:

Canvas - zoom avant, déplacement et mise à l'échelle sur Android

Canvas - zoom avant, déplacement et mise à l'échelle sur Android

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.save();
    canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
    canvas.drawPath(drawPath, drawPaint);
    canvas.scale(mScaleFactor, mScaleFactor);
    canvas.restore();
    clipBounds = canvas.getClipBounds();
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    mScaleDetector.onTouchEvent(event);
    float touchX = event.getX() / mScaleFactor + clipBounds.left;
    float touchY = event.getY() / mScaleFactor + clipBounds.top;
    if (Deal.on)
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                drawPath.moveTo(touchX, touchY);
                break;
            case MotionEvent.ACTION_MOVE:
                drawPath.lineTo(touchX, touchY);
                break;
            case MotionEvent.ACTION_UP:
                drawCanvas.drawPath(drawPath, drawPaint);
                drawPath.reset();
                break;
            default:
                return false;
    }
    else {
        super.onTouchEvent(event);
    }
    invalidate();
    return true;
}

public class ScaleGestureListener extends SimpleOnScaleGestureListener {
    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        mScaleFactor *= detector.getScaleFactor();

        //Don't let the object get too small or too large.
        mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));

        invalidate();

        return true;
    }
}

Modifier: j'ai réussi à obtenir de la toile à redessiner avec le zoom à l'aide de la GestureDetector du facteur d'échelle. En outre, j'ai un interrupteur qui permet de basculer de dessin pour zoomer/webview contrôles. Un problème que je rencontre est que le double tap sur WebView ne déclenchent pas le onScale geste. Ce qui signifie que la toile n'a pas redessiner et se décale sur le zoom.

J'ai besoin d'implémenter une fonctionnalité qui détecte combien le facteur d'échelle est affectée par la double appuyez sur zoom. Si quelqu'un peut proposer une solution pour que. Voici le code de mise à jour:

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
clipBounds = canvas.getClipBounds();
canvas.save();
drawPaint.setStrokeWidth(8/mScaleFactor);
canvas.scale(mScaleFactor, mScaleFactor, 0, 0);
canvas.drawPath(drawPath, drawPaint);
canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
canvas.restore();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
pointerCount = event.getPointerCount();
mScaleDetector.onTouchEvent(event);
float touchX = (event.getX() + clipBounds.left) / mScaleFactor;
float touchY = (event.getY() + clipBounds.top) / mScaleFactor;
if (Deal.on){
if (event.getPointerCount() > 1){
return false;
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
drawPath.moveTo(touchX, touchY);
break;
case MotionEvent.ACTION_MOVE:
drawPath.lineTo(touchX, touchY);
break;
case MotionEvent.ACTION_UP:
drawCanvas.drawPath(drawPath, drawPaint);
drawPath.reset();
break;
default:
return false;
}
}
else {
super.onTouchEvent(event);
}
invalidate();
return true;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//Try for a width based on our minimum
int minw = getPaddingLeft() + getPaddingRight() + getSuggestedMinimumWidth();
int w = resolveSizeAndState(minw, widthMeasureSpec, 1);
//int minh = MeasureSpec.getSize(w) - (int)mTextWidth + getPaddingBottom() + getPaddingTop();
int h = resolveSizeAndState(MeasureSpec.getSize(w), heightMeasureSpec, 0);
setMeasuredDimension(w, h);
}
public class ScaleGestureListener extends SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
//Don't let the object get too small or too large.
if(Deal.on == false) {
mScaleFactor *= detector.getScaleFactor();
mScaleFactor = Math.max(1f, Math.min(mScaleFactor, 20.0f));
}
invalidate();
return true;
}
}

source d'informationauteur ono