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
Agregar LayoutParams para llenar el elemento primario en la llamada 'setContentView' no cambia nada. – Bill
Por cierto, cambiar el SurfaceView a una vista hace que el problema desaparezca. – Bill
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