Topic: Работаем с графикой. Основы

Обсуждаем статью Работаем с графикой. Основы

Re: Работаем с графикой. Основы

Сначала хочу сказать Спасибо за уроки. А теперь вопрос: в данном уроке вместо setContentView(R.layout.activity_main); вы использовали Draw2D draw2D = new Draw2D(this); а не смогли бы вы объяснить как отобразить элементы, которые находятся в activity_main.xml и одновременно отобразить рисунок, допустим в imageview.

Re: Работаем с графикой. Основы

В реальности такой подход не часто используется. Конкретно, в ImageView так не получится, у него нет нужных методов. В моем примере показана простейшая реализация View. Но к нему можно добавить дополнительные конструкторы и тогда класс Draw2D будет выглядеть как остальные компоненты и его можно будет разместить в разметке activity_main рядом с остальными кнопками и т.п. Это есть в других уроках на сайте.

Re: Работаем с графикой. Основы

Возник вопрос.
Если вместо разметки мы указываем экземпляр класса, то каким образом он выводит метод onDraw()? И что необходимо передавать как Canvas в главном метода MainActivity?

Re: Работаем с графикой. Основы

Экземпляр класса работает сам по себе и вызывает свой метод onDraw() автоматически, когда ему надо что-то отобразить на экране. И работать с Canvas нужно в самом объекте, а не в MainActivity.

Re: Работаем с графикой. Основы

Подскажите пожалуйста, в каком уроке рассматривается размещение класса Draw2D в разметке activity_main рядом с остальными кнопками.

Re: Работаем с графикой. Основы

Не помню, может и нет такого урока. Вам нужно определить конструктор с параметрами атрибутов и будет вам счастье.

Re: Работаем с графикой. Основы

Приветствую. Во-первых ОГРОМНАЯ благодарность за уроки и низкий поклон.
По поводу этого урока, пробовал сделать картинку зависимой от размера экрана.
Самое трудное оказалось попасть "лучиком" в солнышко smile
В результате пришел к выводу, что поворот лучше делать не относительно центра экрана mRect.exactCenter X/Y
, а относительно самого "солнышка" т.е.

        int radius = (screenWidth + screenHeight)/30;
        int sunX = screenWidth*7/8;
        int sunY = screenHeight*1/8;
        canvas.drawCircle(sunX, sunY, radius, mPaint);
...
        canvas.rotate(-45, sunX, sunY);

просто хотел поделиться smile

Re: Работаем с графикой. Основы

Александр, здравствуйте.
Поясните пожалуйста что значит "Щёлкаем правой кнопкой мыши на имени пакета"
в этом уроке http://developer.alexanderklimov.ru/and … epaint.php
Не могу понять куда всё-таки надо щёлкать(

Re: Работаем с графикой. Основы

Слева расположена структура вашего проекта. Когда вы создавали свой проект, то задавали имя пакету, например, com.example.hellokitty. Вот этот пакет и ищете в левой части.

Re: Работаем с графикой. Основы

Здравствуйте! Подскажите пожалуйста из за чего может происходить креш после метода canvas.restore();
но если заменить на обратный поворот canvas.rotate(+45, x + mRect.exactCenterX(), y + mRect.exactCenterY());
то все работает.

Re: Работаем с графикой. Основы

Нужно почитать сообщения об ошибках, там должно быть все описано.

Re: Работаем с графикой. Основы

> gekkelberryfin87: креш после метода canvas.restore();

Тоже столкнулся. Текст ошибки: "Underflow in restore - more restores than saves". Вылечил, добавив canvas.save() перед блоком о лучике солнца. Если поставить save прямо перед restore - ошибка тоже пропадет, но котик рисуется под углом, так же, как "лучик солнца".

Re: Работаем с графикой. Основы

Перепроверил, у меня такой ошибки не было. Но переписал немного пример, чтобы избежать подобной ошибки.

15 (edited by kykara4a 2018-01-16 19:22:25)

Re: Работаем с графикой. Основы

При запуске выдает ошибку. Скопировал Ваш исходный код, при запуске говорит:

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
 at com.example.serdechenko.simplepaint.draw2d.onDraw(draw2d.java:85)
 at android.view.View.draw(View.java:16217)
 at android.view.View.updateDisplayListIfDirty(View.java:15214)
 at android.view.View.draw(View.java:15987)
 at android.view.ViewGroup.drawChild(ViewGroup.java:3610)
 at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3400)
 at android.view.View.updateDisplayListIfDirty(View.java:15209)
 at android.view.View.draw(View.java:15987)
 at android.view.ViewGroup.drawChild(ViewGroup.java:3610)
 at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3400)
 at android.view.View.updateDisplayListIfDirty(View.java:15209)
 at android.view.View.draw(View.java:15987)
 at android.view.ViewGroup.drawChild(ViewGroup.java:3610)
 at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3400)
 at android.view.View.updateDisplayListIfDirty(View.java:15209)
 at android.view.View.draw(View.java:15987)
 at android.view.ViewGroup.drawChild(ViewGroup.java:3610)
 at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3400)
 at android.view.View.updateDisplayListIfDirty(View.java:15209)
 at android.view.View.draw(View.java:15987)
 at android.view.ViewGroup.drawChild(ViewGroup.java:3610)
 at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3400)
 at android.view.View.draw(View.java:16220)
 at com.android.internal.policy.PhoneWindow$DecorView.draw(PhoneWindow.java:2692)
 at android.view.View.updateDisplayListIfDirty(View.java:15214)
 at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:283)
 at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:289)
 at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:324)
 at android.view.ViewRootImpl.draw(ViewRootImpl.java:2651)
 at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2470)
 at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2103)
 at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1139)
 at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6064)
 at android.view.Choreographer$CallbackRecord.run(Choreographer.java:860)
 at android.view.Choreographer.doCallbacks(Choreographer.java:672)
 at android.view.Choreographer.doFrame(Choreographer.java:608)
 at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:846)
 at android.os.Handler.handleCallback(Handler.java:742)
 at android.os.Handler.dispatchMessage(Handler.java:95)
 at android.os.Looper.loop(Looper.java:157)
 at android.app.ActivityThread.main(ActivityThread.java:5571)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:745)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:635)

я так понимаю, что не нравится ему метод getweight. Заменил его на цифровое значение, ничего не изменилось. В чем может быть проблема?

Re: Работаем с графикой. Основы

Вам написали - нет такого объекта. Как-то странно вы копируете код.

Re: Работаем с графикой. Основы

Код копировал несколько раз, проверял все. Так же нашел ошибку в Activity_main: Custom view Draw2D is not using the 2- or 3-argument View constructors; XML attributes will not work . Но решение, предложенное в интернете, не помогло, да и, мне кажется, это не связанные проблемы. Я так понимаю, что нет объекта Bitmap, хотя он, по идее, импортируется из пакета. Не может быть, что пакет устарел? Либо может я что-то упустил из виду?