2011-01-23 3 views
5

Tengo un FrameLayout que contiene un SurfaceView subclasificado y un ImageView. Quiero hacer un TranslateAnimation en ImageView. La única forma en que puedo hacer que funcione es agregar una Vista vacía a FrameLayout. De lo contrario, ImageView se recorta (hasta los límites de la posición de ImageView al comienzo de la animación) durante la animación.¿Por qué las animaciones de la vista a veces se recortan?

Tengo curiosidad por saber por qué la vista de hermanos vacía permite que la imagen de ImageView se anime correctamente. La línea que lo hace funcionar está marcada con un comentario en el código a continuación.

public class Test5 extends Activity { 
    private static final String TAG = "Test5"; 
    private MySurfaceView mMSV; 
    private ImageView mRectView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mMSV = new MySurfaceView(this); 

     mRectView = new ImageView(this); 
     ShapeDrawable sd = new ShapeDrawable(new RectShape()); 
     sd.getPaint().setColor(Color.RED); 
     sd.setIntrinsicWidth(300); 
     sd.setIntrinsicHeight(100); 
     mRectView.setImageDrawable(sd); 

     FrameLayout frameLayout = new FrameLayout(this); 
     frameLayout.addView(mMSV); 
     frameLayout.addView(mRectView, new FrameLayout.LayoutParams(
       FrameLayout.LayoutParams.WRAP_CONTENT, 
       FrameLayout.LayoutParams.WRAP_CONTENT)); 

     // I don't know why the following line prevents clipping during 
     // animation. It simply adds a vacuous View. 
     frameLayout.addView(new View(this)); 

     setContentView(frameLayout); 
    } // onCreate 

    public class MySurfaceView extends SurfaceView implements 
      SurfaceHolder.Callback { 

     public MySurfaceView(Context context) { 
      super(context); 
      getHolder().addCallback(this); 
     } 

     @Override 
     public void surfaceCreated(SurfaceHolder holder) { 
      Canvas can = mMSV.getHolder().lockCanvas(); 
      can.drawColor(Color.GRAY); 
      mMSV.getHolder().unlockCanvasAndPost(can); 
     } 

     @Override 
     public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, 
       int arg3) { 
     } 

     @Override 
     public void surfaceDestroyed(SurfaceHolder holder) { 
     } 

     @Override 
     public boolean onTouchEvent(MotionEvent ev) { 
      if (ev.getAction() == MotionEvent.ACTION_UP) { 
       Log.v(TAG, String.format("ACTION_UP, w=%d, h=%d", mRectView 
         .getWidth(), mRectView.getHeight())); 
       Animation an = new TranslateAnimation(0f, 200f, 0f, 200f); 
       // Animation an = new RotateAnimation(0f, 90f); 
       an.setStartOffset(200); 
       an.setDuration(1000); 
       mRectView.startAnimation(an); 
      } 
      return true; 
     } 
    } // MySurfaceView 
} // Test5 

Respuesta

4

Esto es interesante ... supongo que el tamaño de la FrameLayout se cambia cuando se añade una vista vacua. El diseño de su marco no llena al padre, me pregunto si usted cambia los parámetros de diseño para llenar al padre, ¿qué pasaría?

que simplifica el código para esto:

FrameLayout frameLayout = new FrameLayout(this); 

    frameLayout.addView(mMSV); 
    frameLayout.addView(mRectView, 50, 50); 
    frameLayout.addView(new View(this)); //expands frame layout 

Parece que el propio tamaño FrameLayout igual a la última vista del niño añadido. Si configura addView (new View (this)) antes de agregar un rectángulo, se reduce a 50 x 50 y se recorta la animación. Supongo que addView (nueva Vista (esto)); expande FrameLayout a la pantalla completa.

+0

Agregar LayoutParams para llenar el elemento primario en la llamada 'setContentView' no cambia nada. – Bill

+0

Por cierto, cambiar el SurfaceView a una vista hace que el problema desaparezca. – Bill

+0

La forma dibujable se puede dibujar en el lienzo o en la vista de superficie. En su aplicación, lo está agregando como una vista en la parte superior de SurfaceView en lugar de dibujarlo, por lo que no está realmente utilizando su SurfaceView, simplemente utilizándolo para detectar el toque y comenzar la animación. Compruebe en el desarrollador de Android cómo están utilizando shapeDrawable: http://developer.android.com/guide/topics/graphics/2d-graphics.html#shape-drawable – Lumis

2

No sé cómo te diste cuenta, pero a mí también me funcionó. Acababa de cambiar a usar SurfaceView y noté que las animaciones se recortaban. Agregar una vista vacía detuvo el recorte.

1

el truco fue establecer setClipChildren para el diseño que incluía la vista.

Cuestiones relacionadas