2015-11-09 22 views
5

Tôi đang tạo một bản dựng Android tùy chỉnh, trong đó Dịch vụ của tôi thêm Chế độ xem trên đầu mỗi ứng dụng. Sử dụng mã sau:Hoạt ảnh Android Window cùng với Chế độ xem

WindowManager mWM = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE); 
LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(); 
mParams = new WindowManager.LayoutParams(
       WindowManager.LayoutParams.TYPE_PHONE, 
       WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
       PixelFormat.TRANSLUCENT); 
mParams.height = 117; 
mParams.width = 366; 
View myView = inflater.inflate(R.layout.myView,null); 
mWM.addView(myView, mParams); 

Tôi có thể thêm chế độ xem thành công. Tôi đang làm hiển thị chế độ xem bằng cách sử dụng

PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 300); 
ObjectAnimator.ofPropertyValuesHolder(myView, pvhX).start(); 

Tôi thấy chế độ xem hoạt ảnh, nhưng không phải cửa sổ. Cửa sổ trong suốt nơi chế độ xem được sử dụng, không hoạt ảnh. Đây là hành vi tương tự như được mô tả trong Android Property Animation

Một bất lợi khác của hệ thống hoạt ảnh là nó chỉ sửa đổi nơi Chế độ xem được vẽ chứ không phải chính Chế độ xem thực tế. Ví dụ: nếu bạn làm động một nút để di chuyển trên màn hình, nút vẽ chính xác, nhưng vị trí thực tế nơi bạn có thể nhấp vào nút không thay đổi, vì vậy bạn phải triển khai logic của riêng mình để xử lý việc này.

Làm cách nào để tạo hoạt ảnh cho cửa sổ cùng với chế độ xem?

Cảm ơn

+0

không 'bố trí myView' của bạn trông như thế nào? – tachyonflux

Trả lời

1

Bạn có thể làm cho cửa sổ của bạn lấp đầy toàn bộ màn hình bằng cách xóa chiều cao và chiều rộng khỏi tham số cửa sổ. Nếu bạn muốn kiểm soát kích thước chế độ xem, hãy đặt kích thước trong bố cục thay thế.


Nếu không, bạn có thể sử dụng một ValueAnimator và liên tục gọi WindowManager 's updateViewLayout:

ValueAnimator va = ValueAnimator.ofInt(mParams.x, 300); 
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
    public void onAnimationUpdate(ValueAnimator animation) { 
     Integer value = (Integer) animation.getAnimatedValue(); 
     mParams.x = value.intValue(); 
     mWM.updateViewLayout(myView, mParams); 
    } 
}); 
2

Bạn có hai lựa chọn để đạt được điều này (giữ thông tin phản hồi liên lạc của người dùng chặt chẽ với View' s vị trí) :

  1. Tạo thùng chứa trong suốt (giống như FrameLayout) đủ lớn để chứa View cộng với độ lệch hoạt ảnh của nó (trong trường hợp của bạn có chiều cao là 366 + 300 px). Bằng cách này, bạn sẽ thêm vùng chứa vào Window, trong khi View vẫn nằm trong vùng chứa và có thể được làm động/traslated.

  2. Di chuyển vị trí tuyệt đối của Chế độ xem của bạn trên màn hình, tạo một loại hoạt ảnh tùy chỉnh; bạn chỉ cần đặt giá trị mParams.x động bằng cách sử dụng ValueAnimator hoặc, nếu bạn muốn bounciness nhiều hơn, sử dụng hiệu ứng mùa xuân thông qua thư viện Rebound. Tôi đề nghị bạn cuối cùng, nó thực sự ưa thích!

Dưới đây là một (chưa được kiểm tra) ví dụ sử dụng Rebound:

SpringSystem springSystem = SpringSystem.create(); 
Spring spring = springSystem.createSpring(); 
final int originalPos = mParams.x; 
final int offset = 300; 
spring.addListener(new SimpleSpringListener() { 

    @Override 
    public void onSpringUpdate(Spring spring) { 
    float value = (float) spring.getCurrentValue(); 
    mParams.x = originalPos + ((int) value*offset) 
    mWM.updateViewLayout(myView, mParams); 
    } 
}); 
spring.setEndValue(1); 

Hãy nhớ rằng bạn cần phải thêm tuyên bố biên dịch của Rebound trong phụ thuộc của bạn đầu tiên:

// Gradle dependency on Rebound 
dependencies { 
    compile 'com.facebook.rebound:rebound:0.3.8' 
} 
1

Hãy thử này xin vui lòng:

WindowManager mWM = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE); 
LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(); 
mParams = new WindowManager.LayoutParams(
       WindowManager.LayoutParams.MATCH_PARENT, 
       WindowManager.LayoutParams.MATCH_PARENT, 
       WindowManager.LayoutParams.TYPE_PHONE, 
       WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
       PixelFormat.TRANSLUCENT); 
mParams.gravity = Gravity.TOP | Gravity.LEFT; 
mParams.x = 0; 
mParams.y = 0; 

View myView = inflater.inflate(R.layout.myView,null); 
LinearLayout parent = new LinearLayout(context); 
parent.addView(myView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 
mWM.addView(parent, mParams); 

Và giữ Animate MyView như bạn đã làm

PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 300); 
ObjectAnimator.ofPropertyValuesHolder(myView, pvhX).start(); 

Thông báo cho Thiết lập độ rộng & chiều cao của tầm nhìn trong file XML của bạn - R.layout.myView

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