2011-07-05 35 views
16

Tôi đã tìm thấy cách change the opacity of a View, nhưng tôi cần phải thực sự làm tối một số View. Ý tưởng tốt nhất của tôi là đặt một hình chữ nhật màu đen trong suốt lên nó và sau đó từ từ tăng độ mờ đục của hình chữ nhật.lập trình làm tối một Chế độ xem android

Bạn có biết cách làm đẹp hơn không?

public class Page07AnimationView extends ParentPageAnimationView { 
    private final String TAG = this.getClass().getSimpleName(); 
    private ImageView overlay; 
    private int mAlpha = 0; 

    public Page07AnimationView(Context context) { 
     super(context); 
    } 

    public Page07AnimationView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    protected void init() 
    { 
     overlay = new ImageView(mContext); 
     overlay.setImageResource(R.drawable.black_background); 
     overlay.setAlpha(0); 
     overlay.setWillNotDraw(false); 
     // make the PageAniSurfaceView focusable so it can handle events 
     setFocusable(true); 
    } 

    protected void draw_bitmaps(Canvas canvas) 
    { 
     overlay.draw(canvas); 
     update_bitmaps(); 
     invalidate(); 
    } 

    public void update_bitmaps() 
    { 
     if(mAlpha < 250) 
     { 
      mAlpha += 10; 
      overlay.setAlpha(mAlpha); 
     } 
    } 
} 

Đoạn mã trên không làm những gì tôi đã hy vọng. Page07AnimationView được thêm vào một FrameLayout trên màn hình tôi cần phải làm tối. R.drawable.black_background trỏ đến hình ảnh png đen 787px x 492px.

Tôi đã thêm overlay.setWillNotDraw(false); nhưng không hiệu quả. Tôi đã thay đổi setAlpha(0) đầu tiên thành setAlpha(255) nhưng điều đó không giúp ích gì. Tôi đã xóa hoàn toàn các cuộc gọi setAlpha() nhưng không giúp được gì.

Kỹ thuật cơ bản này để thêm PageNNAnimationView đã hoạt động để vẽ Bitmaps, nhưng không được vẽ ImageView overlay. (Tôi sẽ sử dụng Bitmaps, nhưng họ dường như không có một thành phần alpha.)

Edit2: đây là phụ huynh của lớp trên:

public class ParentPageAnimationView extends View { 
    private final String TAG = this.getClass().getSimpleName(); 
    protected Context mContext; 

    public ParentPageAnimationView(Context context) { 
     super(context); 
     mContext = context; 
     init(); 
    } 

    public ParentPageAnimationView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mContext = context; 
     init(); 
    } 

    protected void init() 
    { 
    } 

    protected void draw_bitmaps(Canvas canvas) 
    { 
     // will be overridden by child classes 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     if(this.getVisibility() == View.VISIBLE) 
     { 
      if(canvas != null) 
      { 
       draw_bitmaps(canvas); 
      } 
     } 
    } 

    public void update_bitmaps() 
    { 
     // will be overridden by child classes 
    } 

    public void elementStarted(PageElement _pageElement) { 
     // Nothing in parent class 
    } 

    public void elementFinished(PageElement mElement) { 
     // Nothing in parent class 
    } 
} 
+0

Tôi xác nhận rằng draw_bitmaps và update_bitmaps đang được gọi là liên tục. –

Trả lời

10

Tôi thà làm điều đó theo cách ngược lại - Đặt một hình chữ nhật tối phía sau khung nhìn và thiết lập độ mờ của khung nhìn. Điều này giúp vẽ hình chữ nhật khi khung nhìn mờ đục 100%.

+0

đây là một ý tưởng gọn gàng! Tôi nghĩ rằng tôi đang bị ràng buộc để làm một cái gì đó "trên" Xem mặc dù, nhờ vào cách tôi đã bố trí của tôi đặt ra. Nhưng có bố cục hoạt ảnh * đằng sau * chúng có thể giải quyết một vấn đề khác; cảm ơn! –

+0

Khi chạy một hình động sau một khung nhìn mờ, nó có thể kích hoạt sơn lại toàn bộ màn hình. Bật "Hiển thị cập nhật màn hình" trong DevTools trong trình mô phỏng và xem những gì được sơn lại. – JBM

1

bạn có thể thử bằng cách sử dụng hình ảnh động Alpha như thế này (có lẽ vào hình chữ nhật):

Animation animation = new AlphaAnimation(0.0f, 1.0f); 
    animation.setDuration(350); 

Điều đó sẽ làm cho hình chữ nhật để dần dần trở nên đục hơn 350 giây ...

+2

Tôi nghĩ rằng khi anh ấy nói * đẹp hơn, anh ấy có nghĩa là "thích hợp hơn", không "dễ thương" hơn – JBM

0

Bạn nên kiểm tra iPaulPro của trả lời trong this question. Bạn sẽ cần phải mở rộng ImageView và ghi đè phương thức onDraw().

Tùy thuộc vào những gì bạn định làm, câu trả lời của Alexandru Cristescu cũng hợp lệ nhưng bạn nên gọi setFillAter(true) để hoạt ảnh vẫn tồn tại sau khi hoàn tất.

2

Đây là cách tôi đã kết thúc. Điều quan trọng là sử dụng một Paint với bộ alpha của nó theo bất cứ thứ gì tôi muốn.

public class Page07AnimationView extends ParentPageAnimationView { 
    private final String TAG = this.getClass().getSimpleName(); 
    private Bitmap bitmap; 
    private BitmapDrawable drawable; 
    private ImageView overlay; 
    private int which = -1; 
    private long last_time; 
    private Page07State state; 
    private int mAlpha; 
    private int maxAlpha; 
    private Paint mPaint; 
    private int _alpha_step; 
    private int minAlpha; 

    public enum Page07State { 
     WAITING, DARKENING, DARKENED 
    } 

    public Page07AnimationView(Context context) { 
     super(context); 
    } 

    public Page07AnimationView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    protected void init() 
    { 
     minAlpha = 0; 
     mAlpha = minAlpha; 
     _alpha_step = 5; 
     maxAlpha = 255; 
     mPaint = new Paint(); 
     mPaint.setAlpha(minAlpha); 
     state = Page07State.WAITING; 
     overlay = new ImageView(mContext); 
     overlay.setImageResource(R.drawable.black_background); 
     drawable = (BitmapDrawable) overlay.getDrawable(); 
     bitmap = drawable.getBitmap(); 
     last_time = 0; 
    } 

    protected void draw_bitmaps(Canvas canvas) 
    { 
     if(state != Page07State.WAITING) 
     { 
      DebugLog.d(TAG, "drawing " + Integer.toString(which)); 
      canvas.drawBitmap(bitmap, 0, 0, mPaint); 
     } 
     update_bitmaps(); 
     invalidate(); 
    } 

    public void update_bitmaps() 
    { 
     if(state == Page07State.DARKENING) 
     { 
      if(mAlpha < maxAlpha) 
      { 
       if(System.currentTimeMillis() > last_time + 12) 
       { 
        last_time = System.currentTimeMillis(); 
        mAlpha += _alpha_step; 
        mPaint.setAlpha(mAlpha); 
       } 
      } 
      else 
      { 
       state = Page07State.DARKENED; 
      } 
     } 
    } 

    public void runAnimation() 
    { 
     state = Page07State.DARKENING; 
    } 
} 
28

Trong trường hợp của một ImageView, đây là một cách để đạt được nó:

imageView.setColorFilter(Color.rgb(123, 123, 123), android.graphics.PorterDuff.Mode.MULTIPLY); 
+0

, điều này sử dụng nhiều hay ít tài nguyên rồi đặt '.setAlpha ((float) 1.0)' (cho sdk 11 trở lên) hoặc '. setAlpha (100) '(cho sdk 11 trở xuống). Lý do tôi hỏi là vì im thiết lập Opacity để đạt được điều này, và nếu tôi chỉ có thể gọi đó và nếu nó tương thích hơn sẽ là tuyệt vời. –

+0

@AaronRussell tôi nghĩ rằng nếu bạn sử dụng setAlpha, thì tốt hơn, vì nó có thể là GPU được tối ưu hóa. tất nhiên, tôi có thể sai về điều này. điều tốt nhất nên là luôn sử dụng các hàm API mới nhất. –

6

tôi sẽ làm một cái gì đó như thế này:

view.getBackground().setColorFilter(color, PorterDuff.Mode.DARKEN); 

Sử dụng màu đen với một số alpha như 0x7f000000 cho một màu tối điển hình.

Nó ngắn gọn hơn và bạn cũng có thể làm tối các View với hoạt ảnh hoặc sự kiện cuộn chẳng hạn. Chỉ cần đặt Color.argb(alpha, 0, 0, 0) làm màu và hoạt ảnh alpha hoặc thay đổi nó dựa trên độ lệch cuộn.

2

Thêm vào câu trả lời android phát triển của:

imageView.setColorFilter(Color.rgb(123, 123, 123), android.graphics.PorterDuff.Mode.MULTIPLY); 

bạn có thể setColorFilter trên bất kỳ quan điểm như thế này:

GradientDrawable gd = (GradientDrawable) textView.getBackground(); 
gd.setColor(color); //you can also set BG color to a textview like this 
gd.setColorFilter(Color.rgb(123, 123, 123), android.graphics.PorterDuff.Mode.MULTIPLY); 
Các vấn đề liên quan