Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类似于Android中的SVG非缩放笔划?_Android_Graphics_Svg_Android Canvas_Stroke - Fatal编程技术网

类似于Android中的SVG非缩放笔划?

类似于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对象中跟踪宽度。缩放对象时,可以找到新宽度与初始大小之间的

我有一张画布,它来自Picture beginRecording()方法
我在画布中录制内容,然后调用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;
    }

}