Что-то вроде SVG non-scaling-stroke в Android? - PullRequest
4 голосов
/ 14 ноября 2011

У меня есть Canvas, полученный из метода Picture beginRecording ().
Я записываю вещи на холст, а затем вызываю endRecording ().
Я хотел бы иметь возможность записывать штрихи, которые не будут масштабироваться при последующем масштабировании холста.
Я не вижу ничего подобного в классе Paint.Вы можете установить StrokeWidth (float w), но:
- Если w == 0, у вас есть что-то похожее на желаемую функциональность, но только с 1px
- Если w! = 0, масштабирование холста также означает масштабирование штрихов.
Есть идеи?

Ответы [ 4 ]

2 голосов
/ 15 ноября 2011

Извлеките масштаб из текущей матрицы преобразования и используйте обратную величину, чтобы установить ширину штриха.

0 голосов
/ 15 ноября 2011

Поскольку решение включает расширение класса, я опубликую детали.Я не тестировал его всесторонне, но только в том контексте, в котором он мне был нужен.
Я хотел получить Drawable из списка действий, например, как работает Picture.recording ().
К счастью, объект Path может записыватьдействия, а затем мы можем нарисовать их в холст.
К сожалению, рисование его с помощью canvas.drawPath () не обеспечивает функциональность без масштабирования.

Так что благодаря данной подсказке@Andrew, я расширил Shape аналогично PathShape, но с некоторой другой логикой в ​​onResize ()

public class NonScalingStrokePathShape extends Shape{
    private Path    mPath;
    private float   mInitialWidth;
    private float   mInitialHeight;
    private float   mCurrentWidth;    
    private float   mCurrentHeight;    

    public NonScalingStrokePathShape(Path pPath, float pInitialWidth, float pInitialHeight) {
        mPath = pPath;
        mInitialWidth = pInitialWidth;
        mInitialHeight = pInitialHeight;
        mCurrentWidth = mInitialWidth;
        mCurrentHeight = mInitialHeight;
    }

    @Override
    public void draw(Canvas canvas, Paint paint) {
        canvas.drawPath(mPath,paint);
    }

    @Override
    protected void onResize(float width, float height) {
        Matrix matrix = new Matrix();
        matrix.setScale(width / mCurrentWidth, height / mCurrentHeight);
        mCurrentWidth = width;
        mCurrentHeight = height;
        mPath.transform(matrix);
    }

    @Override
    public NonScalingStrokePathShape clone() throws CloneNotSupportedException {
        NonScalingStrokePathShape shape = (NonScalingStrokePathShape) super.clone();
        shape.mPath = new Path(mPath);
        shape.mInitialHeight =  mInitialHeight;
        shape.mInitialWidth = mInitialWidth;
        shape.mCurrentWidth = mInitialWidth;
        shape.mCurrentHeight = mInitialHeight;
        return shape;
    }

}

Это можно использовать в ShapeDrawable, который является Drawable, который уже принимает границы, изменяя размер с помощьювызов метода изменения размера фигуры (float w, float h).

0 голосов
/ 14 ноября 2011

Возможно, вам потребуется отслеживать ширину в пользовательском объекте SVG. По мере масштабирования объекта вы можете найти соотношение между новой шириной и начальным размером и умножить его на исходную ширину обводки. Это не обязательно должна быть ширина, это может быть высота или диагональ. Это зависит от того, как масштабируется ваш объект.

Или вы можете увидеть, если это уже делает то, что вы хотите:

http://code.google.com/p/svg-android/

0 голосов
/ 14 ноября 2011

Это глупый ответ:

Нарисуйте свои удары X раз, когда w = 0 рядом друг с другом.

...