2017-10-11 9 views
0

J'ai un problème avec le déplacement d'un bitmap. Le bitmap est plus grand que l'écran. code xml:android - Mouvement de bitmap invalide

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/lay_mapa" 
    android:clipChildren="false" > 

      <ImageView 
       android:id="@+id/iv_mapa_swiata" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:src="@drawable/mapa_swiata" 
       android:scaleType="center" 
       android:padding="0dp" 
       android:paddingBottom="0dp" 
       android:paddingLeft="0dp" 
       android:paddingRight="0dp" 
       android:paddingTop="0dp"/> 

</RelativeLayout> 

code dans le fichier java:

int xCoOrdinate; 
int yCoOrdinate; 
ImageView mapa_swiata; 

Sur onCreate:

mapa_swiata.setOnTouchListener(this); 
public boolean onTouch(View v, MotionEvent event) { 

     switch (event.getAction() & MotionEvent.ACTION_MASK) { 
      case MotionEvent.ACTION_DOWN: 

       xCoOrdinate = (int) (v.getX() - event.getRawX()); 
       yCoOrdinate = (int) (v.getY() - event.getRawY()); 

       break; 

     case MotionEvent.ACTION_MOVE: 

       v.animate().x(event.getRawX() + xCoOrdinate).y(event.getRawY() + yCoOrdinate).setDuration(0).start(); 
       break; 
     } 

     return true; 

     } 

L'image se déplace d'une manière assez imprévisible. Ceci est illustré par le film suivant: https://youtu.be/BJyQjNmj-J4

Répondre

0

Par expérience, le traitement de ces types de problèmes est une grande douleur lorsque vous faites une vue personnalisée. Je recommande d'utiliser une bibliothèque prête à l'emploi comme: https://github.com/chrisbanes/PhotoView

Ils ont résolu la plupart des problèmes que vous rencontrerez déjà.

Cependant, revenons au code. Vous revenez vrai pour tous les événements. Cela peut potentiellement laisser la vue dans un état étrange, en particulier avec les événements ACTION_UP marqués comme consommés.

Quelque chose comme cela peut fonctionner:

public boolean onTouch(View v, MotionEvent event) { 
    switch (event.getAction() & MotionEvent.ACTION_MASK) { 
    case MotionEvent.ACTION_DOWN: 
     xCoOrdinate = (int) (v.getX() - event.getRawX()); 
     yCoOrdinate = (int) (v.getY() - event.getRawY()); 
     return true; 
    case MotionEvent.ACTION_MOVE: 
     v.animate().x(event.getRawX() + xCoOrdinate).y(event.getRawY() + yCoOrdinate).setDuration(0).start(); 
     return true; 
    default: 
     return false; 
    } 
} 

Mise à jour:

Ok, voici quelques autres pensées. Perdre l'animation. Je ne sais pas si c'est ce qui se passe. Vous pouvez définir la traduction de la vue en utilisant: setTranslationX() et setTranslationY() et les événements du capteur tactile devraient suffire à lui donner une sensation de douceur. Essayez le FrameLayout en tant que parent. Il n'est pas nécessaire ici d'utiliser RelativeLayout.

En outre, je recommande de laisser les valeurs de coordonnées flottantes car elles sont toujours nécessaires pour ce type. Enregistre avoir à changer la précision du nombre.

+0

Modifié. Malheureusement, le comportement est le même. –

+0

Ajout d'un couple d'idées pour voir si elles fonctionnent – pablisco

+0

Est-ce que vous (ou n'importe qui) connaissez une bibliothèque qui fait défiler et zoomer pas l'image mais layoyts (dans cette mise en page sera plus d'éléments clickabke). –