Как я могу нарисовать на холсте больше размеров моего экрана?
Я создаю приложение для 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
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);
}