Android ImageView de mise à l'Échelle et la traduction de problème

Je suis le développement d'une application android (API 19 4.4) et je rencontre quelques problèmes avec ImageViews.
J'ai une SurfaceView, dans lequel j'ai ajouter dynamiquement des ImageViews qui je veux réagir aux événements tactiles.
Jusqu'à présent, j'ai réussi à faire l'ImageView déplacer et évoluer en douceur mais j'ai une fâcheuse comportement.

Quand je l'échelle de l'image à une certaine limite (je dirais la moitié de la taille d'origine) et j'ai essayer de le déplacer, le tremblement de l'image.
Après une brève analyse, il semble que c'est la commutation de sa position symétriquement autour du doigt un point sur l'écran, le cumul de la distance, et finalement on perd de vue (tout ce qui arrive très vite ( < 1).
Je pense que je suis absent quelque chose avec la valeur relative de l'événement tactile de l'ImageView/SurfaceView, mais je suis assez noob et je suis coincé...

Voici mon code

public class MyImageView extends ImageView {
private ScaleGestureDetector mScaleDetector ;
private static final int MAX_SIZE = 1024;
private static final String TAG = "MyImageView";
PointF DownPT = new PointF(); //Record Mouse Position When Pressed Down
PointF StartPT = new PointF(); //Record Start Position of 'img'
public MyImageView(Context context) {
super(context);
mScaleDetector = new ScaleGestureDetector(context,new MySimpleOnScaleGestureListener());
setBackgroundColor(Color.RED);
setScaleType(ScaleType.MATRIX);
setAdjustViewBounds(true);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
lp.setMargins(-MAX_SIZE, -MAX_SIZE, -MAX_SIZE, -MAX_SIZE);
this.setLayoutParams(lp);
this.setX(MAX_SIZE);
this.setY(MAX_SIZE);
}
int firstPointerID;
boolean inScaling=false;
@Override
public boolean onTouchEvent(MotionEvent event) {
//get pointer index from the event object
int pointerIndex = event.getActionIndex();
//get pointer ID
int pointerId = event.getPointerId(pointerIndex);
//First send event to scale detector to find out, if it's a scale
boolean res = mScaleDetector.onTouchEvent(event);
if (!mScaleDetector.isInProgress()) {
int eid = event.getAction();
switch (eid & MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_MOVE :
if(pointerId == firstPointerID) {
PointF mv = new PointF( (int)(event.getX() - DownPT.x), (int)( event.getY() - DownPT.y));
this.setX((int)(StartPT.x+mv.x));
this.setY((int)(StartPT.y+mv.y));
StartPT = new PointF( this.getX(), this.getY() );
}
break;
case MotionEvent.ACTION_DOWN : {
firstPointerID = pointerId;
DownPT.x = (int) event.getX();
DownPT.y = (int) event.getY();
StartPT = new PointF( this.getX(), this.getY() );
break;
}
case MotionEvent.ACTION_POINTER_DOWN: {
break;
}
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_CANCEL: {
firstPointerID = -1;
break;
}
default :
break;
}
return true;
}
return true;
}
public boolean onScaling(ScaleGestureDetector detector) {
this.setScaleX(this.getScaleX()*detector.getScaleFactor());
this.setScaleY(this.getScaleY()*detector.getScaleFactor());
invalidate();
return true;
}
private class MySimpleOnScaleGestureListener extends SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
return onScaling(detector);
}
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
Log.d(TAG, "onScaleBegin");
return true;
}
@Override
public void onScaleEnd(ScaleGestureDetector arg0) {
Log.d(TAG, "onScaleEnd");
}
}

}

J'ai aussi un autre questions sur les rotations. Comment devrais-je mettre en œuvre cette?
Pourrais-je utiliser le ScalegestureDetector d'une certaine façon ou ai-je à faire de ce travaux en vue d'événement tactile? Je voudrais être en mesure à l'échelle et faire pivoter dans le même geste (et de passer dans l'autre).

Merci de m'aider, je voudrais vraiment l'apprécier!

Désolé pour mon anglais

  • pourquoi utilisez-vous une ImageView avec SurfaceView et ne pas attirer votre image Bitmap directement?
  • Si je dessine des bitmaps directement, comment puis-je déplacer, redimensionner, faire pivoter avec le doigt? (J'ai peut-douzaine de points de vue différents dans ma surface de vues que je veux gérer individuellement avec le geste)
  • l'utilisation d'une Matrice (toile.drawBitmap(Bitmap, de la Matrice, de la Peinture de))
  • Je voulais dire : Comment puis-je détecter sur lequel bitmap mes doigts sont en interaction ?
  • voir comment je l'ai fait dans un de mes projet github.com/pskink/PatchworkDrawable/blob/master/... dans la méthode getLayersAt()
  • Je vous remercie pour votre code, mais : -est-il recommandé de ne pas utiliser Imageview? Il semble beaucoup plus compliqué que mon code et je ne vois pas comment vous pouvez faire de votre image bitmap de suivre simplement votre doigt pour déplacer ou redimensionner, faire pivoter lorsque vous pincer.
  • compliqué? tout ce que vous devez faire est de mettre à l'échelle/translation/rotation de la Matrice, rien de plus, simple, clair et évident, d'ailleurs à l'aide de la Matrice, vous pouvez appliquer un srd Animations sur le Bitmap: vous avez juste besoin d'une dizaine de lignes de code
  • Je sais comment dessiner ou mettre à l'échelle une image bitmap. Je ne sais pas comment détecter le toucher de l'événement, qui est pourquoi j'utilise l'affichage de l'image ( chacune ont un onsettouchlistener) affecter :stackoverflow.com/questions/3120124/...
  • avez-vous vu getLayersAt() je menrioned avant? vous avez besoin d'une inversion de la Matrice et de l'appel mapPoint sur elle, c'est tout
  • Oui, mais ce n'est pas m'aider ici :(. Veuillez faire une réponse détaillée sur le POURQUOI (parce que je suis OK avec l'utilisation de l'imageview et obtenu aucun problème de performance) que je devrais utiliser image personnalisée à la place de la coutume ImageView et COMMENT je pourrais le faire dans la gestion des événements tactiles aspect ou de répondre à ma question qui est pourquoi j'ai une bizarrerie comportement après la mise à l'échelle vers le bas d'une imageview.. Merci à vous
  • ok, donc j'ai écrit ~80 lignes d'un code ad hoc: voir ma réponse
  • ooops, semble que j'ai oublié d'ajouter la réponse, c'est corrigé
  • voir ma mise à jour, j'espère maintenant que son évident pourquoi utiliser une Matrice et direct dessin Bitmap au lieu de ImageView
  • Je vous remercie pour votre temps. Je vais étude / essayer ça ce soir.

InformationsquelleAutor Tifoo | 2014-02-07