类似于Android中的SVG非缩放笔划?
我有一张画布,它来自Picture beginRecording()方法类似于Android中的SVG非缩放笔划?,android,graphics,svg,android-canvas,stroke,Android,Graphics,Svg,Android Canvas,Stroke,我有一张画布,它来自Picture beginRecording()方法 我在画布中录制内容,然后调用endRecording() 我希望能够记录在画布缩放后不会缩放的笔划。 我在绘画课上看不到那样的东西。您可以设置行程宽度(浮动宽度),但: -如果w==0,则具有与我想要的功能类似的功能,但仅使用1px -如果w!=0,画布缩放也意味着笔划缩放 有什么想法吗?这是一个愚蠢的答案: 在w=0的相邻位置绘制X次笔划。您可能需要在自定义SVG对象中跟踪宽度。缩放对象时,可以找到新宽度与初始大小之间的
我在画布中录制内容,然后调用endRecording()
我希望能够记录在画布缩放后不会缩放的笔划。
我在绘画课上看不到那样的东西。您可以设置行程宽度(浮动宽度),但:
-如果w==0,则具有与我想要的功能类似的功能,但仅使用1px
-如果w!=0,画布缩放也意味着笔划缩放
有什么想法吗?这是一个愚蠢的答案:
在w=0的相邻位置绘制X次笔划。您可能需要在自定义SVG对象中跟踪宽度。缩放对象时,可以找到新宽度与初始大小之间的比率,并将其乘以初始笔划宽度。它不必是宽度,很可能是高度或对角线。这取决于对象的缩放方式 或者,您可以查看这是否已经满足了您的要求:
从当前变换矩阵中提取比例,并使用其倒数来设置笔划宽度。因为解决方案包括扩展一个类,我将发布详细信息。我没有对它进行过广泛的测试,只是在我需要的环境中进行了测试。
我想从动作列表中获得一张可绘制的图片,如Picture.recording()的工作方式。
幸运的是,路径对象可以记录动作,然后我们可以将它们绘制到画布中。
不幸的是,通过canvas.drawPath()绘制它不提供无缩放笔划功能。
感谢@Andrew给出的提示,我将Shape扩展为类似于PathShape,但在onResize()中使用了一些不同的逻辑
这可以在ShapeDrawable中使用,这是一种通过调用Shape resize(float w,float h)方法已经考虑了边界大小调整的Drawable。有人能理解这里的问题吗?我已经编辑了这个问题,希望你现在能理解我。AFAIK svg android不提供此功能。我编辑了这个问题,因为我想你不明白,因为我不够精确。对想到的第一个解决方案是重写Canvas的drawLine函数,这比重写所有基本形状类都要容易。或者,你可以尝试画一个路径形状来代替直线,它应该按照你想要的方式缩放。谢谢,我会看一下这个。我会告诉你它是否解决了我的问题,这样你就可以编辑答案,我会检查它是否正确。请这样做。我现在对此很好奇。当我使用图片记录这是不可能的,所有的都应用到画布及其内容上。看看我的新方法。谢谢
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;
}
}