سؤال

أرغب في تطبيق الرسوم المتحركة المتتالية (على سبيل المثال Scaleanimation) على صورة ImageView التي تعرض صورة مورد. يتم تشغيل الرسوم المتحركة بواسطة زر. على سبيل المثال ، أود توسيع صورة بشكل تدريجي على كل زر.

لقد قمت بتعيين fillafter = "true" على الرسوم المتحركة. ومع ذلك ، تبدأ جميع الرسوم المتحركة من الحالة الأصلية لـ ImageView. يبدو كما لو أن ImageView يعيد تعيين حالتها والرسوم المتحركة دائمًا ما تكون هي نفسها ، بدلاً من البدء من الحالة النهائية للرسوم المتحركة السابقة.

ما الخطأ الذي افعله؟

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button button = (Button)findViewById(R.id.Button01);
    button.setOnClickListener(new OnClickListener() {

        public void onClick(View arg0) {
            animate();

        }});
}

private void animate() {
    ImageView imageView = (ImageView) findViewById(R.id.ImageView01);

    ScaleAnimation scale = new ScaleAnimation((float)1.0, (float)1.5, (float)1.0, (float)1.5);
    scale.setFillAfter(true);
    scale.setDuration(500);
    imageView.startAnimation(scale); 
}
هل كانت مفيدة؟

المحلول

يبدو كما لو أن ImageView يعيد تعيين حالتها والرسوم المتحركة دائمًا ما تكون هي نفسها ، بدلاً من البدء من الحالة النهائية للرسوم المتحركة السابقة.

على وجه التحديد! أنا متأكد من أن هناك فائدة ل fillAfter="true", ، لكنني لم أحسب هذه النقطة حتى الآن.

ما عليك القيام به هو إعداد AnimationListener على كل Animation من الأهمية ، وافعل شيئًا في المستمع onAnimationEnd() لاستمرار الحالة النهائية للرسوم المتحركة الخاصة بك. لم ألعب مع ScaleAnimation لذلك لست متأكدًا تمامًا من طريقة "الاستمرار في الحالة النهائية". إذا كان هذا AlphaAnimation, الذهاب من 1.0 ل 0.0, ، سوف تصنع القطعة INVISIBLE أو GONE في onAnimationEnd(), ، علي سبيل المثال.

نصائح أخرى

لقد واجهت نفس المشكلة وأنشأت الكود التالي لاستخدام الرسوم المتحركة المختلفة بسهولة. إنه يدعم فقط مستويات الترجمة و alpha في الوقت الحالي لأنني لم أستخدم التحجيم ، ولكن يمكن تمديده بسهولة لدعم المزيد من الميزات.

أقوم بإعادة ضبط التمرير والرؤية قبل البدء في الرسوم المتحركة ، لكن هذا فقط لأنني بحاجة إلى الرسوم المتحركة/إيقافها.

و "Deend" Boolean موجود لتجنب تدفق المكدس على العودة (Scrollto يدعو onanimationend لسبب غامض ...)

private void setViewPos(View view, Animation anim, long time){
    // Get the transformation
    Transformation trans = new Transformation();
    anim.getTransformation(time, trans);

    // Get the matrix values
    float[] values = new float[9];
    Matrix m = trans.getMatrix();
    m.getValues(values);

    // Get the position and apply the scroll
    final float x = values[Matrix.MTRANS_X];
    final float y = values[Matrix.MTRANS_Y];
    view.scrollTo(-(int)x, -(int)y);

    // Show/hide depending on final alpha level
    if (trans.getAlpha() > 0.5){
        view.setVisibility(VISIBLE);
    } else {
        view.setVisibility(INVISIBLE);       
    }
}

private void applyAnimation(final View view, final Animation anim){
    view.scrollTo(0, 0);
    view.setVisibility(VISIBLE);

    anim.setAnimationListener(new AnimationListener(){
        private boolean doEnd = true;

        @Override
        public void onAnimationEnd(Animation animation) {
            if (doEnd){
                doEnd = false;
                setViewPos(view, animation, anim.getStartTime() + anim.getDuration());
            }
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }

        @Override
        public void onAnimationStart(Animation animation) {
        }

    });

    view.startAnimation(anim);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top