2015-05-19 15 views
13

Tôi đã thử nghiệm với Drawable tại đây và tìm thấy điều tôi không thể giải thích và hy vọng ai đó có thể giúp tôi.Hành vi khác nhau cho FillType.EVEN_ODD khi thêm một CornerPathEffect?

Tại sao thêm một CornerPathEffect đến Paint dường như “phá vỡ” (?) Các EVEN_ODDFillType?

Để cụ thể hơn, tôi đã thử nghiệm lớp this HexagonDrawable. Đây là những gì tôi nhận được:

Hard corners, outlined, expected behavior.

Tuy nhiên, nếu tôi đặt một CornerPathEffect đến Paint, như hình dưới đây (constructor) ...

public HexagonDrawable(int color) { 
    paint.setColor(color); 
    paint.setPathEffect(new CornerPathEffect(6)); // added 
    hexagon.setFillType(Path.FillType.EVEN_ODD); 
} 

... đây là những gì tôi nhận được :

Rounded corners, outline effect disappears, unexpected behavior?

góc tròn, vâng, nhưng không xuất hiện vạch (lẻ/chẵn/lẻ). Ai đó có thể giải thích tại sao?

Trả lời

5

Lớp HexagonDrawable đó vẽ hai hình lục giác khác nhau, xếp chồng lên nhau. Tôi không biết nếu bạn cần nó để được như vậy, nhưng tôi nghĩ rằng cách tốt nhất để đạt được kết quả tương tự là sử dụng một Paint với Stroke phong cách.

Để làm như vậy, bạn cần phải loại bỏ các con đường hình lục giác thứ hai và giảm kích thước của hình lục giác (vì vậy quan điểm sẽ không cắt nó):

public void computeHex(Rect bounds) { 

    final int width = bounds.width(); 
    final int height = bounds.height(); 
    // We need to decrease the hexagon's size, so the view won't cut our stroke 
    final int size = Math.min(width - (strokeWidth/2), height - (strokeWidth/2)); 
    final int centerX = bounds.left + (width/2); 
    final int centerY = bounds.top + (height/2); 

    hexagon.reset(); 
    hexagon.addPath(createHexagon(size, centerX, centerY)); 
    // Remove the second path 
    // hexagon.addPath(createHexagon((int) (size * .8f), centerX, centerY)); 
} 

Và thêm hiệu ứng Stroke để sơn:

private int strokeWidth; 

public HexagonDrawable(int color, int strokeWidth) {   
    this.strokeWidth = strokeWidth; 

    paint.setColor(color); 

    // Add Stroke style and width 
    paint.setStyle(Paint.Style.STROKE); 
    paint.setStrokeWidth(strokeWidth); 

    // You can add these other attributes if you need to 
    // paint.setDither(true); 
    // paint.setStrokeJoin(Paint.Join.ROUND); 
    // paint.setStrokeCap(Paint.Cap.ROUND); 

    // Remove the fill type, you won't need anymore 
    // hexagon.setFillType(Path.FillType.EVEN_ODD); 

    // Finally add the Path Effect 
    paint.setPathEffect(new CornerPathEffect(30.0f)); 
} 

Điều đó sẽ tạo ra hiệu ứng rất giống với những gì bạn đang tìm kiếm.

Hy vọng điều đó sẽ hữu ích! ;)

Chỉnh sửa: Tôi quên cảnh báo bạn rằng chiều rộng Đột quỵ không được lớn hơn bán kính của CornerPathEffect, nếu không nó sẽ bị cắt.

+0

Thực tế, câu trả lời của bạn thực sự là hoàn hảo và đạt được chính xác những gì tôi muốn sử dụng trong trường hợp này. Bạn cũng thêm các chi tiết bổ sung mà tôi đã bỏ lỡ (cách vẽ được vẽ tương ứng với đường dẫn, các ràng buộc của chiều rộng nét đến bán kính, v.v.). Tuy nhiên, tôi đã đặt câu hỏi theo một cách cụ thể, rất cụ thể bởi vì tôi thực sự muốn _learn_ và hiểu hành vi của EVEN_ODD và các dòng đóng, đó là lý do tại sao tôi đã thử nghiệm với lớp đó để bắt đầu). Nhưng, tất nhiên, sự giúp đỡ của bạn được đánh giá cao! – davidcesarino

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