Почему анимации просмотра иногда обрезаются? - PullRequest
5 голосов
/ 23 января 2011

У меня есть FrameLayout, содержащий подклассный SurfaceView и ImageView. Я хочу сделать TranslateAnimation на ImageView. Единственный способ заставить его работать - добавить пустое представление в FrameLayout. В противном случае ImageView обрезается (до границ позиции ImageView в начале анимации) во время анимации.

Мне любопытно, почему пустой братский вид позволяет ImageView корректно анимировать. Строка, которая заставляет его работать, отмечена комментарием в коде ниже.

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

Ответы [ 3 ]

4 голосов
/ 23 января 2011

Это интересно ... Я думаю, что размер FrameLayout изменяется, когда добавляется пустое представление. Ваш фрейм-макет не заполняет родительский, интересно, если вы измените параметры макета, чтобы заполнить родительский, что произойдет?

Я упростил ваш код до этого:

    FrameLayout frameLayout = new FrameLayout(this); 

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

Кажется, что размер FrameLayout сам по себе равен последнему добавленному дочернему представлению. Если вы установите addView (новый вид (этот)) перед добавлением прямоугольника, то он уменьшится до 50 x 50, и анимация будет обрезана. Я предполагаю, что addView (новый вид (это)); расширяет FrameLayout на весь экран.

2 голосов
/ 16 мая 2011

Я не знаю, как вы поняли это, но, похоже, это сработало и для меня. Я только что переключился на использование SurfaceView и заметил, что анимация обрезается. Добавление пустого представления остановило отсечение.

1 голос
/ 15 марта 2014

хитрость заключалась в том, чтобы установить setClipChildren на макет, который закрывал вид.

...