Поскольку решение включает расширение класса, я опубликую детали.Я не тестировал его всесторонне, но только в том контексте, в котором он мне был нужен.
Я хотел получить 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).