2011-11-14 22 views
3

我有一個來自圖片beginRecording()方法的畫布。
我在畫布上記錄東西,然後調用endRecording()。
我希望能夠記錄在畫布縮小後不會縮放的筆畫。
我在Paint類中看不到類似的東西。你可以setStrokeWidth(float w),但是:
- 如果w == 0,你有類似我想要的功能,但只有1px
- 如果w!= 0,畫布縮放也意味着筆畫縮放。
任何想法?類似於Android中的SVG非縮放筆畫?

+0

有人能夠理解這裏提出的問題嗎? – Pratik

+0

我編輯了這個問題,我希望你現在能理解我。 – mamuso

回答

0

這是一個愚蠢的答案:

畫筆劃爲W x次= 0彼此相鄰。

+0

我已經想過這是最後一顆子彈。 – mamuso

0

您可能需要跟蹤自定義SVG對象中的寬度。隨着對象縮放,您可以找到新寬度與初始大小之間的比率,並將其乘以您的初始筆觸寬度。它不一定是寬度,它可以是高度或對角線。這取決於你的對象如何縮放。

或者,你可以看到,如果這已經做你想要什麼:

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

+0

AFAIK svg-android不提供此功能。我編輯了這個問題,因爲我認爲你不明白,因爲我缺乏精確性。 – mamuso

+1

啊。是。想到的第一個解決方案是重寫Canvas的drawLine函數,這比覆蓋所有基本形狀類更容易。 或者,您可以嘗試繪製一個PathShape來代替線條,這應該按照您想要的方式進行縮放。 – Andrew

+0

謝謝,我會看看這個。我會告訴你它是否解決了我的問題,以便您可以編輯答案,並將其作爲正確的答案進行檢查。 – mamuso

2

提取從目前的變換矩陣的規模和使用的是逆來設置描邊寬度。

+0

當我使用圖片進行錄製時,這是不可能的,所有這些都應用於畫布及其內容。看到我的新方法。謝謝! – mamuso

0

由於解決方案包括擴展類,我會發布詳細信息。我沒有廣泛地測試它,但僅在我需要的環境中進行測試。
我想從Picture.recording()工作方式的動作列表中獲取Drawable。
幸運的是,Path對象可以記錄動作,然後我們可以將它們繪製到畫布上。
不幸的是通過canvas.drawPath()繪製它不提供無比例縮放筆畫功能。

所以由於由@Andrew給出的提示,我已經擴展形狀類似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使用,這是一個通過調用Shape resize(float w,float h)方法,可繪製的已調整大小的邊界。