Android: рисовать с разной шириной штриха

У меня есть собственный вид рисования, в котором я рисую линии на основе моего щелчка и координат перемещения. Этот настраиваемый вид добавляется к моей основной деятельности, где я могу изменить ширину обводки объекта рисования в пользовательском представлении. Я сохраняю текущую ширину штриха в статическом классе. В методе onDraw() я хочу перерисовать старые пути со старой шириной обводки, которую я могу рисовать с разной шириной, но это всегда текущая заданная ширина обводки.

Основная деятельность:

@Override
public void onItemSelected(AdapterView<?> parent, View view, int position,
        long id) {
    if (position == 0) {
        Memory.setStrokeWidth(10);   //Set stroke width in static class
    }
    if (position == 1) {
        Memory.setStrokeWidth(25);
    }
    if (position == 2) {
        Memory.setStrokeWidth(40);
    }


}

Пользовательский вид рисования:

private Paint paint;
private Path path;
private HashMap<Path, Float> strokeWidthMemory;

@Override
protected void onDraw(Canvas canvas) {

    paint.setStrokeWidth(Memory.getStrokeWidth());
    canvas.drawPath(path, paint);                           
    strokeWidthMemory.put(path, paint.getStrokeWidth());    //Save drawn path with stroke width in HashMap

    //Redraw old lines with stored stroke width
    for (Path p : strokeWidthMemory.keySet()) {
        paint.setStrokeWidth(strokeWidthMemory.get(p));
        canvas.drawPath(p, paint);
    }

}

@Override
public boolean onTouchEvent(MotionEvent event) {
    // Get the coordinates of the touch event.
    float eventX = event.getX();
    float eventY = event.getY();

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        // Set a new starting point
        path.moveTo(eventX, eventY);

        return true;
    case MotionEvent.ACTION_MOVE:
        // Connect the points
        path.lineTo(eventX, eventY);
        break;
    default:
        return false;
    }

    // Makes our view repaint and call onDraw
    invalidate();

    return true;
}

person Community    schedule 03.10.2014    source источник


Ответы (1)


добавьте ширину обводки в ACTION_MOVE, когда вы рисуете путь. Если вы добавляете ширину обводки в onDraw, то каждый раз, когда вы вызываете недействительную хэш-карту, обновляется текущее значение ширины обводки.

   private Paint paint;
    private Path path;
    private HashMap<Path, Float> strokeWidthMemory;

    @Override
    protected void onDraw(Canvas canvas) {

        paint.setStrokeWidth(Memory.getStrokeWidth());
        canvas.drawPath(path, paint);                           


        //Redraw old lines with stored stroke width
        for (Path p : strokeWidthMemory.keySet()) {
            paint.setStrokeWidth(strokeWidthMemory.get(p));
            canvas.drawPath(p, paint);
        }

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // Get the coordinates of the touch event.
        float eventX = event.getX();
        float eventY = event.getY();

        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            // Set a new starting point
            path.moveTo(eventX, eventY);

            return true;
        case MotionEvent.ACTION_MOVE:
            // Connect the points
            path.lineTo(eventX, eventY);
            strokeWidthMemory.put(path, paint.getStrokeWidth());    //Save drawn path with stroke width in HashMap
            break;
        default:
            return false;
        }

        // Makes our view repaint and call onDraw
        invalidate();

        return true;
    }

Взгляните на этот ответ для справки.

person Shaz    schedule 03.10.2014