2016-09-17 59 views
1

我正在創建一個允許用戶在表面上繪製的Android應用程序。不幸的是,我的應用程序中畫布的最大圖像大小是我手機上的1000 x 1500像素,並根據設備尺寸縮放,但不會更大。如何繪製比我的屏幕尺寸大的畫布?

我的目標是允許用戶在應用程序繪製的,但爲了使附圖被包含在各種大的畫布,諸如例如一個是4032 X 3264像素。我怎樣才能覆蓋設備的最大畫布尺寸的位圖,我想繪製?繪圖過程是否應該在服務器上進行,並且渲染圖像是否應該實時顯示在客戶端上?或者,我可以以某種方式使畫布大於屏幕,初始化圖像的完全縮小視圖並允許用戶滾動,放大/縮小等,同時還可以繪製?

我已爲公衆要點到我這裏創建上下文類:

https://gist.github.com/santafebound/57f45c636e69c53b1df79302b8946099

簡單地改變生成的圖像效果的大小以下錯誤:

09-17 11:29:03.718 4490-4490/com.elgami.customizer E/AndroidRuntime: FATAL EXCEPTION: main 

Process: com.elgami.customizer, PID: 4490 
    java.lang.OutOfMemoryError: Failed to allocate a 52641804 byte allocation with 16777216 free bytes and 44MB until OOM 
     at dalvik.system.VMRuntime.newNonMovableArray(Native Method) 
     at android.graphics.Bitmap.nativeCreate(Native Method) 
     at android.graphics.Bitmap.createBitmap(Bitmap.java:831) 
     at android.graphics.Bitmap.createBitmap(Bitmap.java:808) 
     at android.graphics.Bitmap.createBitmap(Bitmap.java:775) 
     at com.elgami.customizer.MainActivity.SetupTemplate(MainActivity.java:451) 
     at com.elgami.customizer.MainActivity.SetupTemplate(MainActivity.java:434) 
     at com.elgami.customizer.MainActivity$1.onPageScrollStateChanged(MainActivity.java:289) 
     at android.support.v4.view.ViewPager.dispatchOnScrollStateChanged(ViewPager.java:1944) 
     at android.support.v4.view.ViewPager.setScrollState(ViewPager.java:497) 
     at android.support.v4.view.ViewPager.onInterceptTouchEvent(ViewPager.java:2119) 
     at com.elgami.views.ExtendedViewPager.onInterceptTouchEvent(ExtendedViewPager.java:44) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2108) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197) 
     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553) 
     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197) 
     at com.android.internal.policy.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2403) 
     at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1737) 
     at android.app.Activity.dispatchTouchEvent(Activity.java:2771) 
     at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:63) 
     at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:63) 
     at com.android.internal.policy.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2364) 
     at android.view.View.dispatchPointerEvent(View.java:9520) 
     at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4230) 
     at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4096) 
     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642) 
     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695) 
     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661) 
     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3787) 
     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3669) 
     at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3844) 
     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642) 
     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695) 
     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661) 
     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3669) 
     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642) 
     at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5922) 
     at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5896) 
     at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5857) 
     at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6025) 
     at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) 
     at android.os.MessageQueue.nativePollOnce(Native Method) 
     at andr 
+0

試試這個庫。這可能會有所幫助。 https://github.com/square/picasso – Vyacheslav

+0

它只是數學的問題。被稱爲獲得設備資源,然後做一些百分比基計算。 – Enzokie

回答

-1

嘗試繼承Canvas並使用固定的MeasureSpec鎖定您想要的尺寸:

private static final int fixedWidthMeasureSpec 
     = View.MeasureSpec.makeMeasureSpec(4032, View.MeasureSpec.EXACTLY); 

private static final int fixedHeightMeasureSpec 
     = View.MeasureSpec.makeMeasureSpec(3264, View.MeasureSpec.EXACTLY); 

// ... 

@Override 
protected void onMeasure(int widthMS, int heightMS) { 
    super.onMeasure(fixedWidthMeasureSpec, fixedHeightMeasureSpec); 
}