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
Trả lời
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.
Để 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
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
đã làm việc cho tôi. +1 – dac2009
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? –
cố gắng để thiết lập
android:clipChildren="false"
đến xem mẹ
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
Vui lòng xem http://stackoverflow.com/questions/32735119/draw-outside-the-bounds-of-an-android-canvas –
@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ả. –
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 đề :-)
Làm cách nào để bắt đầu 'newRect'? –
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. –
Tôi đã thử điều đó, nhưng nó không hoạt động. –
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"
và android:clipToPadding="false"
trong cha mẹ của bạn ViewGroup
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