2011-01-23 23 views
5

Tôi có FrameLayout chứa SurfaceView được phân lớp và một ImageView. Tôi muốn làm một TranslateAnimation trên ImageView. Cách duy nhất tôi có thể làm cho nó hoạt động là thêm một khung nhìn trống rỗng vào FrameLayout. Nếu không, ImageView sẽ bị cắt bớt (các giới hạn của vị trí của ImageView khi bắt đầu hoạt ảnh) trong khi hoạt ảnh.Tại sao các hoạt ảnh Xem đôi khi bị cắt bớt?

Tôi tò mò muốn biết tại sao Chế độ xem anh chị em trống cho phép ImageView hoạt ảnh chính xác. Dòng làm cho nó hoạt động được đánh dấu bằng một chú thích trong đoạn mã dưới đây.

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 

Trả lời

4

này là thú vị ... Tôi đoán rằng kích thước của FrameLayout được thay đổi khi một cái nhìn ngớ ngẩn được thêm vào. Bố trí khung của bạn không điền vào phụ huynh, tôi tự hỏi nếu bạn thay đổi các tham số bố trí để điền vào phụ huynh, những gì sẽ xảy ra?

tôi đơn giản hóa mã của bạn như thế này:

FrameLayout frameLayout = new FrameLayout(this); 

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

Có vẻ như rằng kích thước FrameLayout bản thân bằng cái nhìn con cuối cùng nói thêm. Nếu bạn đặt addView (new View (this)) trước khi thêm một hình chữ nhật thì nó sẽ giảm xuống còn 50 x 50 và hoạt ảnh được cắt bớt. Tôi cho rằng addView (new View (this)); mở rộng FrameLayout ra toàn màn hình.

+0

Thêm bố cụcParams để điền phụ huynh trong lệnh gọi 'setContentView' không thay đổi bất kỳ điều gì. – Bill

+0

BTW, việc thay đổi SurfaceView thành Chế độ xem khiến cho sự cố không còn nữa. – Bill

+0

Có thể vẽ hình dạng có thể vẽ trên Canvas hoặc Chế độ xem bề mặt. Trong ứng dụng của bạn, bạn đang thêm nó như một cái nhìn trên đỉnh SurfaceView thay vì vẽ nó, vì vậy bạn không thực sự sử dụng SurfaceView của bạn, chỉ cần sử dụng nó để phát hiện cảm ứng và bắt đầu hoạt hình. Kiểm tra về nhà phát triển Android cách họ đang sử dụng shapeDrawable: http://developer.android.com/guide/topics/graphics/2d-graphics.html#shape-drawable – Lumis

2

Tôi không biết làm thế nào bạn đã tìm ra điều đó, nhưng nó dường như cũng làm việc cho tôi. Tôi vừa chuyển sang sử dụng SurfaceView, và nhận thấy rằng các hình động đã bị cắt bớt. Việc thêm Chế độ xem trống sẽ dừng quá trình cắt.

1

mẹo đã được đặt setClipChọn trẻ ở bố cục kèm theo chế độ xem.

Các vấn đề liên quan