2010-10-26 28 views
19

Tôi đang chuyển một ứng dụng được viết trong môi trường đồ họa cho phép vẽ xảy ra bên ngoài giới hạn của hình chữ nhật cắt. Bất kỳ cách nào để làm điều này trong Android?Tôi có thể vẽ ra ngoài giới hạn của một Canvas Android

+1

Chúng tôi không có ý tưởng những gì bạn đang nói về một ví dụ và một số Mã số – Falmarri

Trả lời

8

Bạn có thể vẽ nơi bạn thích, nhưng không có gì sẽ được lưu bên ngoài hình chữ nhật cắt.

40

Để vẽ ra ngoài giới hạn, bạn cần phải mở rộng clipRect của canvas.

Kiểm tra các phương thức clip quá tải Phương pháp quay vòng trên lớp Canvas.

Lưu ý - Bạn sẽ cần chỉ định hoạt động Vùng vì thao tác mặc định là INTERSECT. Vì vậy, một cái gì đó như thế này:

Rect newRect = canvas.getClipBounds(); 
newRect.inset(-5, -5) //make the rect larger 

canvas.clipRect (newRect, Region.Op.REPLACE); 
//happily draw outside the bound now 
+1

Nó không hoạt động chút nào. Tôi chỉ thay đổi kích cỡ canvas với tham số (-2000, -2000), sau đó dịch nó nhưng hình ảnh tôi vẽ vẫn bị cắt bớt. – tomrozb

+1

đã làm việc cho tôi. +1 – dac2009

+0

nhưng nếu bạn làm điều đó trên mọi 'onDraw (Canvas canvas)' thì bạn không làm cho máy tính làm được nhiều việc hơn? –

28

cố gắng để thiết lập

android:clipChildren="false" 

đến xem mẹ

+0

Tôi không biết về câu hỏi nhưng tôi muốn cảm ơn bạn đã giải quyết, vấn đề của tôi, mà tôi đang phải đối mặt. Cảm ơn bạn. Đây là những gì tôi đang tìm kiếm. – tannerjohn

+0

Vui lòng xem http://stackoverflow.com/questions/32735119/draw-outside-the-bounds-of-an-android-canvas –

+0

@MortezaRastgoo câu hỏi được liên kết (và câu trả lời) không trực tiếp dịch sang vấn đề này ở tất cả. –

1

Câu trả lời @numan đã gần như ok, vấn đề là phân bổ bộ nhớ với cách tiếp cận đó, vì vậy chúng tôi nên làm điều này, thay vào đó:

// in constructor/elsewhere 
Rect newRect = new Rect(); 

// in onDraw 
canvas.getClipBounds(newRect); 
newRect.inset(0, -20); //make the rect larger 
canvas.clipRect(newRect, Region.Op.REPLACE); 

Điều đó giải quyết được vấn đề :-)

+0

Làm cách nào để bắt đầu 'newRect'? –

+1

Ok, tôi đoán điểm ở đây là newRect được cấp phát một lần cho mỗi đối tượng init, thay vì phân bổ nó mỗi khi onDraw được gọi. –

+0

Tôi đã thử điều đó, nhưng nó không hoạt động. –

0

Nếu bạn muốn vẽ văn bản nằm ngoài giới hạn trong TextView, bạn nên làm điều này thay vì:

<TextView 
    ... 
    android:shadowColor="#01000000" 
    android:shadowDx="100" // out of right bound 
    android:shadowDy="0" 
    android:shadowRadius="1" 
.../> 

Nó không làm việc để sử dụng clipRect() như câu trả lời @ Numan vì TextView clip nó là rect riêng trong onDraw():

if (mShadowRadius != 0) { 
    clipLeft += Math.min(0, mShadowDx - mShadowRadius); 
    clipRight += Math.max(0, mShadowDx + mShadowRadius); 

    clipTop += Math.min(0, mShadowDy - mShadowRadius); 
    clipBottom += Math.max(0, mShadowDy + mShadowRadius); 
} 

canvas.clipRect(clipLeft, clipTop, clipRight, clipBottom); 

cuối cùng nhưng không kém, Đừng quên để thiết lập android:clipChildren="false"android:clipToPadding="false" trong cha mẹ của bạn ViewGroup

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