Pregunta

Estoy tratando de aplicar una animación a escala a un rectángulo, usando el código no XML. Quiero que el rectángulo crezca más alto, bastante simple.

RectDrawableView - Crea un rectShape FormedRawable

public class RectDrawableView extends View {

Paint paint; 

public RectDrawableView(Context context) {
    super(context);
    paint = new Paint();
    paint.setColor(Color.parseColor("#aacfcce4"));
    paint.setStyle(Paint.Style.FILL);
}

protected void onDraw(Canvas canvas) {

    int x = 35;
    int y = 250;
    int width = 50;
    int height = 300;

    ShapeDrawable shapeDrawable = new ShapeDrawable(new RectShape());

    Rect rect = new Rect(x, y, x+width, y+height);
    shapeDrawable.setBounds(rect);
    shapeDrawable.getPaint().set(paint);
    shapeDrawable.draw(canvas);
}

}

Actividad: - Crea una nueva vista RectDrawable y se agrega al diseño. OnResume se activa una animación, lo que debería hacer que el rectángulo se crezca más alto.

public class RectActivity extends Activity {

final String TAG = "RectActivity";

TextView rect1;
RectDrawableView rectView;


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.basic);

    LinearLayout linear = (LinearLayout) findViewById(R.id.basicLayout);
    rectView = new RectDrawableView(this);
    linear.addView(rectView);
}

@Override
public void onResume() {
    super.onResume();
    RunAnimations();
}


private void RunAnimations() {


    Animation rectAnim1 = new ScaleAnimation(1, 1, 1, 1.3f, ScaleAnimation.RELATIVE_TO_SELF, 0,
            ScaleAnimation.RELATIVE_TO_SELF, 1);
    rectAnim1.setFillBefore(false);
    rectAnim1.setFillAfter(true);
    rectAnim1.setStartOffset(500);
    rectAnim1.setDuration(500);

    rectView.startAnimation(rectAnim1);

}
}

Basic.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/basicLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:orientation="vertical">

</LinearLayout>

Resultado: el RECT está creciendo más alto, bueno, pero la ubicación del RECT también está cambiando, mala. Todo el rectángulo se coloca más alto en la pantalla.

Cuando uso este mismo código de animación exacto, pero aplíquelo a una vista text en lugar de una forma de poder, todo está bien.

He recorrido todos los artículos relacionados en So, pero todavía estoy luchando con este. Cualquier ayuda será apreciada, gracias.

¿Fue útil?

Solución

Código completo, había cambiado la altura del rectángulo.

public class RectActivity extends Activity {

final String TAG = "RectActivity";

TextView rect1;
RectDrawableView rectView;


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.basic);

    LinearLayout linear = (LinearLayout) findViewById(R.id.rectangle);
    rectView = new RectDrawableView(this);
    linear.addView(rectView);
    Button sbutton = (Button)findViewById(R.id.sbutton);
    sbutton.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v) {
            RectActivity.this.RunAnimations();
        }   
    });
    Button tbutton = (Button)findViewById(R.id.tbutton);
    tbutton.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v) {
            RectActivity.this.runTranslateAnimation();
        }   
    });

}

@Override
public void onResume() {
    super.onResume();
    RunAnimations();
}


private void RunAnimations() {
    Animation rectAnim1 = new ScaleAnimation(1, 1, 1, 1.3f, 
                   ScaleAnimation.RELATIVE_TO_SELF, 0,
            ScaleAnimation.ABSOLUTE, 250);

    rectAnim1.setFillBefore(false);
    rectAnim1.setFillAfter(true);
    rectAnim1.setStartOffset(500);
    rectAnim1.setDuration(500);
    rectView.startAnimation(rectAnim1);

}
private void runTranslateAnimation() {

    float x = rectView.getX();
    float y = rectView.getY();

    TranslateAnimation trans = new TranslateAnimation(0, 0, 0, (90));
    trans.setFillAfter(true);
    trans.setStartOffset(500);
    trans.setDuration(500);
    rectView.startAnimation(trans);
}
}

public class RectDrawableView extends View {

Paint paint; 
Rect rect;

public RectDrawableView(Context context) {
    super(context);
    paint = new Paint();
    paint.setColor(Color.parseColor("#aacfcce4"));
    paint.setStyle(Paint.Style.FILL);
}

protected void onDraw(Canvas canvas) {

    int x = 50;
    int y = 150;
    int width = 50;
    int height = 100;

    ShapeDrawable shapeDrawable = new ShapeDrawable(new RectShape());

    rect = new Rect(x, y, x+width, y+height);
    shapeDrawable.setBounds(rect);
    shapeDrawable.getPaint().set(paint);
    shapeDrawable.draw(canvas);
}
}

Otros consejos

Prueba este código. Mantener el pivotYType como absoluto con valor 550 ( y + height )

 Animation rectAnim1 = new ScaleAnimation(1, 1, 1, 1.3f, 
                                ScaleAnimation.RELATIVE_TO_SELF, 0,
                                ScaleAnimation.ABSOLUTE, 550);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top