2014-01-08 5 views
1

Я пытаюсь создать пользовательскую форму с помощью объекта Path в Android, и у меня возникает странная проблема.
То, что я пытаюсь добиться изображен на картинке нижеРисовать и заполнить пользовательскую форму

enter image description here

Вот код, я использую, чтобы рисовать и заполнить форму:

public class BallView extends RelativeLayout { 
    .... 
    protected void onDraw(Canvas canvas) { 
     ... 
     PaintArc(canvas); 
    } 

    private void PaintArc(Canvas canvas) { 
    Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); 
    p.setAntiAlias(true); 
    p.setStyle(Paint.Style.FILL_AND_STROKE); 
    p.setStrokeWidth(2); 
    p.setColor(Color.RED); 


    RectF oval = new RectF(20, 20, getWidth() - 20, getHeight() - 20); 
    RectF oval2 = new RectF(0, 0, getWidth(), getHeight()); 
    Path path = new Path(); 
    path.setFillType(Path.FillType.EVEN_ODD); 

    path.addArc(oval, 0, 180); 
    path.addArc(oval2, 0, 180); 

    float y=20+oval.height()/2; 
    float x=20; 
    path.moveTo(x,y); 
    path.lineTo(x - 20, y); 

    x=oval.width()+20; 
    path.moveTo(x,y); 
    path.lineTo(x+20,y); 


    path.close(); 

    canvas.drawPath(path, p); 
    } 
} 

Фактический результат, Я получаю выглядит так:

enter image description here

Результирующий форма без наполнения выглядит так:

enter image description here

Можете ли вы сказать мне, что я делаю неправильно?

+0

почему так сложный? вы можете делать то, что хотите, с одним Path.addArc – pskink

+0

Я думал о том, чтобы сделать фигуру только из одной дуги и увеличить размер линии, но я просто экспериментирую и пытаюсь понять структуру. Я хочу знать, как заполнить пользовательскую форму, созданную с использованием объекта Path. – Andrei

+1

ОК, я вижу, может быть, попробуйте arcTo вместо addArc? – pskink

ответ

4

попробовать это:

class MyView extends View { 

    private Path mPath; 
    private Paint mPaint; 
    private RectF mOval; 

    public MyView(Context context) { 
     super(context); 
     mPath = new Path(); 
     mPaint = new Paint(); 
     mPaint.setColor(0xffff0000); 
     mOval = new RectF(); 
    } 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     int dx = w/4; 
     mOval.set(0, 0, w, w); 
     mPath.reset(); 
     mPath.moveTo(0, w/2f); 
     mPath.arcTo(mOval, 180, 180); 
     mPath.rLineTo(-dx, 0); 
     mOval.inset(dx, dx); 
     mPath.addArc(mOval, 0, -180); 
     mPath.rLineTo(-dx, 0); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.drawColor(0xffffffff); 

     mPaint.setStyle(Style.FILL); 
     canvas.drawPath(mPath, mPaint); 

     canvas.translate(0, getWidth()/2); 
     mPaint.setStyle(Style.STROKE); 
     canvas.drawPath(mPath, mPaint); 
    } 
} 
+0

Эй, пскин. Спасибо за ответ и образец. Кажется, теперь он счастлив, но я действительно не понимаю, почему. Насколько я вижу, формы, созданные двумя образцами кода, закрыты, и они должны быть заполнены одинаково. По какой-то причине ваш образец работает, а у меня нет. Я постараюсь копать еще немного и вернуться, если найду что-нибудь. – Andrei

+0

@ Аndrei было ли это чем-то связанным с упорядочением вершин? Просто любопытно. – Trejkaz

0
- I have just edited my answer  
    and i add below code 

RectF oval3 = новый RectF (10, 20, GetWidth() - 10, GetHeight() - 10);

/** * Теперь проверить этот вывод кода кажется, что ваша мысль */

private void PaintArc(Canvas canvas) { 
      Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); 
     p.setAntiAlias(true); 
     p.setStyle(Paint.Style.STROKE); 
     p.setStrokeWidth(2); 
     p.setColor(Color.RED); 

     Paint p1 = new Paint(Paint.ANTI_ALIAS_FLAG); 
     p1.setAntiAlias(true); 
     p1.setStyle(Paint.Style.STROKE); 
     p1.setStrokeWidth(10); 
     p1.setColor(Color.RED); 

    RectF oval = new RectF(20, 20, getWidth() - 20, getHeight() - 20); 
    RectF oval2 = new RectF(0, 0, getWidth(), getHeight()); 
    RectF oval3 = new RectF(10, 20, getWidth() - 10, getHeight() - 10); 

    Path path = new Path(); 
    path.setFillType(Path.FillType.EVEN_ODD); 

    path.addArc(oval, 0, 180); 
    path.addArc(oval2, 0, 180); 
    path.addArc(oval3, 0, 180); 


    float y = 20 + oval.height()/2; 
    float x = 20; 
    path.moveTo(x, y); 
    path.lineTo(x - 20, y); 

    x = oval.width() + 20; 
    path.moveTo(x, y); 
    path.lineTo(x + 20, y); 

    path.close(); 
    canvas.drawArc(oval3, 0, 180, false, p1); 

    canvas.drawPath(path, p); 
} 

enter image description here

+0

Hi Max. Спасибо за ваш ответ. К сожалению, это мне не поможет. Изменив стиль на ход, я получу результат в третьем изображении. То, что я хочу, является результатом первого изображения (которое было сделано в краске) ​​ – Andrei

+0

Hi Max. Спасибо за образец и объяснения. К сожалению, это еще не отвечает на мой вопрос. Изображение, которое я отправил, возможно, не было лучшим примером. Я хочу заполнить эту форму, я не хочу белых границ. Как я уже говорил в pskink, я знаю, что мог бы сделать эту кривую, используя стиль штриха с большей толщиной, но я хочу заполнить пользовательскую форму, созданную объектом Path. Я хотел знать, возможно ли это, и если да, то что не так с моим подходом. – Andrei

Смежные вопросы