2011-01-23 5 views
5

У меня есть 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 

ответ

4

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

Я упростил свой код на этот:

FrameLayout frameLayout = new FrameLayout(this); 

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

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

+0

Добавление LayoutParams для заполнения родительского элемента в вызове 'setContentView' ничего не меняет. – Bill

+0

BTW, изменение SurfaceView на вид приводит к тому, что проблема уходит. – Bill

+0

Выбираемая форма может быть нарисована на холсте или на поверхности. В своем приложении вы добавляете его как представление поверх SurfaceView вместо его рисования, поэтому вы не используете SurfaceView, просто используя его для обнаружения касания и начала анимации. Проверьте разработчика android, как они используют shapeDrawable: http://developer.android.com/guide/topics/graphics/2d-graphics.html#shape-drawable – Lumis

2

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

1

трюк устанавливал setClipChildren в формат , который закрывал представление.

Смежные вопросы