簡體   English   中英

如何在大於屏幕尺寸的畫布上繪畫?

[英]How can I draw on a canvas larger than my screen's dimensions?

我正在創建一個允許用戶在表面上繪制的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

嘗試對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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM