2013-05-20 24 views
8

Sto lavorando a un'app per Android in cui ci sono circa 6 pulsanti sullo schermo (che riproducono un video corrispondente quando viene premuto). Ecco un mockup di quello che l'applicazione si presenta come:I pulsanti si muovono automaticamente sullo schermo

Android App

voglio i pulsanti per automaticamente (e casualmente) si muovono intorno allo schermo. Dovrebbero farlo in modo indipendente, nel senso che possono passare davanti (o dietro) altri pulsanti - non hanno bisogno di incontrarsi o qualcosa del genere. Idealmente, sarebbe bello se i pulsanti potessero effettivamente spostarsi leggermente dalla tela (come si vede nell'immagine sopra con il pulsante che si trova dietro la barra delle azioni), ma questo non è essenziale.

Come farei per far muovere i pulsanti in questo modo?

+0

Hai capito? Come hai fatto? –

risposta

4

Credo che sia necessario utilizzare ViewPropertyAnimator. Consultare this per i dettagli chiari su come andare oltre. Il percorso che dovresti dare a una vista dovrebbe essere casuale ogni volta. Chiaramente controlla anche lo this per le cose che devi fare attenzione.

Un estratto dalle guide API:

Per esempio, se animato un button to move across the screen, il pulsante disegna in modo corretto, ma la posizione attuale in cui è possibile fare clic sul pulsante non cambia, in modo da avere per implementare la tua logica per gestire questo.

+0

Ti dispiace fornire un esempio? Grazie mille. Mi è piaciuto –

1

È possibile aggiungere tutti i pulsanti in un RelativeLayout e modificare il margine per posizionare il movimento del pulsante.
inizializzazione della posizione utilizzando il codice qui sotto:

Button button = new Button(); 
    params = new RelativeLayout.LayoutParams(btnHeight, 
          btnWidth); 
    params.leftMargin = leftMargin; 
    params.topMargin = topMargin; 
    rootview.addView(button, params); 

Per spostare il pulsante, è possibile utilizzare TranslateAnimation

5

Recentemente, ho giocato con animazioni e tentato il simile. Ecco la classe. Rimbalza praticamente in tutto il vista padre (che è possibile modificare la matematica di andare oltre)

package com.example.animationtests.view; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.drawable.BitmapDrawable; 
import android.graphics.drawable.Drawable; 
import android.util.AttributeSet; 
import android.view.View; 
import android.widget.ImageView; 

public class BouncingImageView extends ImageView { 

    private View mParent; 

    public BouncingImageView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public BouncingImageView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public BouncingImageView(Context context) { 
     super(context); 
    } 

    @Override 
    protected void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     mParent = (View) getParent(); 
     getHandler().post(mRunnable); 
    } 

    @Override 
    protected void onDetachedFromWindow() { 
     getHandler().removeCallbacks(mRunnable); 
     super.onDetachedFromWindow(); 
    } 

    private final Runnable mRunnable = new Runnable() { 
     private static final int DIRECTION_POSITIVE = 1; 
     private static final int DIRECTION_NEGATIVE = -1; 
     private static final int ANIMATION_STEPS = 1; 
     private int mHorizontalDirection = DIRECTION_POSITIVE; 
     private int mVerticalDirection = DIRECTION_NEGATIVE; 

     public boolean mStarted = false; 

     @Override 
     public void run() { 
      if (mParent == null) { 
       return; 
      } 

      final float width = getMeasuredWidth(); 
      final float height = getMeasuredHeight(); 
      final float parentWidth = mParent.getMeasuredWidth(); 
      final float parentHeight = mParent.getMeasuredHeight(); 
      float x = getX(); 
      float y = getY(); 

      if (!mStarted) { 
       /*** 
       * Randomize initial position 
       */ 
       x = (float) Math.random() * (parentWidth - width); 
       y = (float) Math.random() * (parentHeight - height); 
       mHorizontalDirection = ((int) x % 2 == 0) ? DIRECTION_NEGATIVE : DIRECTION_POSITIVE; 
       mVerticalDirection = ((int) y % 2 == 0) ? DIRECTION_NEGATIVE : DIRECTION_POSITIVE; 
       mStarted = true; 
      } else { 
       if (mHorizontalDirection == DIRECTION_NEGATIVE) { 
        x -= ANIMATION_STEPS; 
       } else { 
        x += ANIMATION_STEPS; 
       } 

       if (mVerticalDirection == DIRECTION_NEGATIVE) { 
        y -= ANIMATION_STEPS; 
       } else { 
        y += ANIMATION_STEPS; 
       } 

       if (x - (width/3) < 0) { 
        mHorizontalDirection = DIRECTION_POSITIVE; 
       } else if (x + (width/3) > (parentWidth - width)) { 
        mHorizontalDirection = DIRECTION_NEGATIVE; 
       } 

       if (y - (height/3) < 0) { 
        mVerticalDirection = DIRECTION_POSITIVE; 
       } else if (y + (width/3) > (parentHeight - height)) { 
        mVerticalDirection = DIRECTION_NEGATIVE; 
       } 
      } 

      setX(x); 
      setY(y); 

      getHandler().post(this); 
     } 
    }; 
} 

Usage:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".BouncingCircles" > 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="300dp" 
     android:layout_alignParentBottom="true" > 

     <com.example.animationtests.view.BouncingImageView 
      android:layout_width="50dp" 
      android:layout_height="50dp" 
      android:src="@drawable/light_dino" /> 

     <com.example.animationtests.view.BouncingImageView 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:src="@drawable/light_dino" /> 

     <com.example.animationtests.view.BouncingImageView 
      android:layout_width="70dp" 
      android:layout_height="70dp" 
      android:src="@drawable/light_dino" /> 

     <com.example.animationtests.view.BouncingImageView 
      android:layout_width="90dp" 
      android:layout_height="90dp" 
      android:src="@drawable/light_dino" /> 
    </RelativeLayout> 

</RelativeLayout> 
0

Prova questa

ObjectAnimator mover = ObjectAnimator.ofFloat(aniView, 
       "translationX", -500f, 0f); 
      mover.setDuration(2000); 

insieme questa animazione al pulsante

Problemi correlati