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:
@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
Vous devez vous connecter pour publier un commentaire.
J'ai mis en œuvre ce comportement, mais d'une manière légèrement différente. J'ai utilisé une matrice à traiter toutes les opérations de zoom et de défilement (et de la rotation, dans mon cas). Il en fait soigné code et fonctionne comme sur des roulettes. Je ne sais pas quelle est la cause de votre funky comportement, cependant.
Stocker une Matrice et d'un autre chemin que les membres de la classe:
Remplacer votre onScale:
dans onDraw; passez enregistrement de la toile, au lieu de:
Bon codage!
Une bonne façon d'accomplir tous les différents effets que vous essayez de le faire de manière très simple rend l'utilisation de la toile méthode
Cette méthode permettra de vous, de prendre l'ensemble de l'image source ou juste un petit échantillon (Rect src) et le projet comme vous le souhaitez (Rect de l'heure d'été) en faisant la mise à l'échelle /traduction de la matrice de calculs automatiquement pour vous comme montré dans l'exemple ci-dessous:
Cet exemple juste échelles /zoome sur l'ensemble de l'image...
Et cet exemple ne prend qu'un échantillon de l'image et l'affiche "intérieure de l'effet de zoom"
En faisant usage de ces src/dst objets que vous pouvez faire à peu près tout l'effet que vous voulez sur android, est une façon simple et vraiment puissant outil de
Espère que cette aide.
Ce qui concerne les!
Pouvez-vous essayer de dessiner les chemins qu'une seule fois, et de garder le zoom de la responsabilité de la toile elle-même