Autore Topic: Spostare ImageView con la classe Matrix  (Letto 290 volte)

Offline Marco12

  • Nuovo arrivato
  • *
  • Post: 1
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G2
  • Sistema operativo:
    Windows 7
Spostare ImageView con la classe Matrix
« il: 16 Settembre 2015, 20:08:56 CEST »
0
Salve, sono nuovo, è il mio primo topic. Spiego subito il problema riscontrato.
Ho un Relative Layout su cui è applicato uno sfondo (background)
Codice (XML): [Seleziona]
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent"
   android:layout_height="fill_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin"
   tools:context="com.example.firstproject.xxxxxxx.xxxxxxx"
   android:id="@+id/layout1"
   android:background="@drawable/sfondo">

All'interno di questo layout posiziono una ImageView, facciamo sia una palla da calcio
Codice (XML): [Seleziona]
<ImageView android:id="@+id/palla"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:contentDescription="palla"
       android:src="@drawable/palla"
       android:focusable="false"
       android:adjustViewBounds="false"
       android:scaleType="matrix"
       >

Adesso io voglio spostare questa palla quando si mantiene premuto su di essa e si trascina verso un'altra posizione. Al rilascio la palla rimane a destinazione. Per farlo ho utilizzato un'istanza della classe Matrix.

Codice (Java): [Seleziona]
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_crea);

        ImageView Palla;
        Palla = (ImageView) findViewById(R.id.palla);

        Palla.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
               
                switch (event.getAction())
                {

                    case MotionEvent.ACTION_DOWN:

                    case MotionEvent.ACTION_MOVE:
                        float eventX = event.getX();
                        float eventY = event.getY();

                        Matrix matrix = new Matrix();
                        matrix.reset();
                        matrix.postTranslate(Math.round(eventX), Math.round(eventY));
                        ImageView imageView = (ImageView) v;
                        imageView.setScaleType(ImageView.ScaleType.MATRIX);
                        imageView.setImageMatrix(matrix);

                    case MotionEvent.ACTION_UP:
                        return true;

                }
                return false;
            }
        });

Dato che la ImageView viene convertita in View dal metodo onTouch ho dovuto rieffettuare il cast all'inverso, per utilizzare alcuni metodi.
Codice (Java): [Seleziona]
ImageView imageView = (ImageView) v;
imageView.setScaleType(ImageView.ScaleType.MATRIX);
imageView.setImageMatrix(matrix);

Tutto questo codice funziona, faccio il test sul mio dispositivo android, senza emulatore. Il problema sta nel fatto che l'immagine (la drawable) all'interno della ImageView si va a nascondere quando viene spostata oltre i bordi, come se si spostasse soltanto la drawable e non tutta la ImageView.
Ho apportato le seguenti modifiche alla imageview e tutto sembra funzionare se non fosse per il fatto che ovunque mantengo premuto (anche su un punto vuoto) e poi trascino, la palla si muove. Dato che devo aggiungere altre immagini che si muovono per conto loro, questo non va bene.

Codice (XML): [Seleziona]
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"

Infatti con questo codice i bordi della imageview vengono estesi a tutta la schermata e la drawable rimane con le sue dimensioni reali. L'ho notato nella modalità design di Android Studio. Sto utilizzando API 23.
Sto cercando da 5 ore sul web ma non trovo niente. Vi ringrazio se potete aiutarmi.




Post unito: 16 Settembre 2015, 21:48:41 CEST
Penso di aver risolto. L'imageview completa si muove, compresa la drawable. Se provo a muovere da un punto vuoto non succede nulla. Ho preso spunto da questo topic, "Posizionare dinamicamente un'ImageView - Android Developers Italia, ma ho usato metodi diversi.
Cito la risposta che mi ha aiutato ad arrivare alla soluzione del problema.

ImageView eredita dalla classe padre "View" ed essa ha un metodo per fare esattamente quello che chiedi ;-) View | Android Developers
Per sapere bene di cosa si tratta e come usarlo, leggi nella descrizione della classe, alla sezione intitolata "Layout", circa all'inizio. Sono a conoscenza di questo metodo perché l'ho usato personalmente per il mio progetto: quello che facevo era muovere proprio un'ImageView all'interno di un LinearLayout a seconda di come si inclinava il telefono, basandomi sui segnali degli accelerometri. In base a questi segnali infatti calcolavo la posizione della pallina nello schermo e poi la settavo proprio con questo metodo.

Spero di essere stato utile, buon lavoro! :D

Tutto quello che occorre fare è eliminare la parte relativa all'istanza Matrix e inserire al suo posto il codice seguente:

Codice (Java): [Seleziona]
imageView.offsetLeftAndRight(Math.round(eventX));
imageView.offsetTopAndBottom(Math.round(eventY));

Ciao a tutti. Ci vediamo presto  ;-)
« Ultima modifica: 16 Settembre 2015, 21:48:42 CEST da Marco12, Reason: Merged DoublePost »