Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
DIMA_N
1 / 1 / 0
Регистрация: 21.10.2011
Сообщений: 116
#1

Теория по рисованию - Программирование Android

15.08.2015, 00:43. Просмотров 249. Ответов 2
Метки нет (Все метки)

Доброе время суток!

Хочу узнать подробнее о рисовании в андроиде.

Мне нужно отображения анимации 120 элементов по заданной траектории. Я пытался делать это в отдельном классе View и с помощью метода OnDraw, в начале я делал в нем расчет каждой точки, таким способом у меня начинало виснуть с 5 элементов.

Сегодня переписал немного код, теперь я в начале записываю значения всей траектории (это круг) в массив для каждого элемента, а потом идет вызов метода OnDraw и там уже беру значения из этого массива. Таким методом у меня начинает лагать примерно с 15 элементов, забыл добавить что рисуется не только шарик в заданной точке, а еще из 50 точек рисуется линии за этим шаром.

В итоге выходит что такой способ тоже не применим в таком количестве.

Причем выводя состояние ЦП мое приложение не много ест процессора, где-то 1/4. Этого я тоже понять не могу почему оно не пытается есть больше.

Мои методы решения этой проблемы.
  1. Попробовать вызывать метод OnDraw реже.
  2. Запись траектории в один массив, но мне кажется этим получиться только оперативку сэкономить и не как не изменятся зависания.

Хотел бы получить консультацию от более опытных программистов какие есть методы решения данной задачи. Может стоит использовать не OnDraw, может попробовать использования какого то движка
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2015, 00:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Теория по рисованию (Программирование Android):

помощь по рисованию мышью на QGraphicsScene - C++ Qt
Доброго времени суток! пожалуйста, можете кинуть кусочек кода, отвечающий за рисование мышью в Qt на QGraphicsScene! наверняка уже...

Поясните по таймеру и рисованию на форме - C#
Доброго времени суток. Пытаюсь реализовать модель математического маятника. Есть такой забавный класс: public class Solver { ...

Алгоритм функции по 3D рисованию детали - Lisp
Доброго всем времени суток! Задача следующая: Нарисовать деталь в 3D средствами Lisp: В связи с этим вопросы: 1. Как лучше...

Нужно доработать программу по рисованию - Assembler
Заранее говорю что в ассемблере очень плохо разбираюсь. Заранее всем спасибо . 1)Я так понимаю что написано для видеорежима 640*480 -...

Ищу программу по рисованию линий - Графические программы
Доброго времени суток! Есть ли такая программа, которая рисует линии, как на заставке рабочего стола в Windows Vista?? Пример:

Копаемся в коде по рисованию TGA картинок - C++
Я надеюсь это привлечет внимание и новичков и уже спецов Уже давно учу C++, но по книжкам это слишком не интересно и вот разбираю...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Горелый
70 / 44 / 11
Регистрация: 20.03.2014
Сообщений: 186
15.08.2015, 00:55 #2
Вью не предназначены для большой динамической графики. Тут уже нужно использовать OpenGLES
0
DIMA_N
1 / 1 / 0
Регистрация: 21.10.2011
Сообщений: 116
17.08.2015, 00:02  [ТС] #3
Цитата Сообщение от Горелый Посмотреть сообщение
Вью не предназначены для большой динамической графики. Тут уже нужно использовать OpenGLES
Спасибо смотрю про openGLES, попыталя поставить в свой проект возникает ошибка.

Я на 1/4 экран через xml вставляю класс View
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:baselineAligned="false">
 
 
 
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#bbf"
        android:layout_weight="1">
        
        .
        .
        .
       
    </ScrollView>
 
 
    <ru.dima_n.elem.Anim
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/game_view"
        android:layout_weight="2"
        android:onClick="OnClickAnim"
        android:background="#000"/>
 
</LinearLayout>
Пытаюсь повторить такое

Класс Mian
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package ru.dima_n.opengl;
 
import android.opengl.GLSurfaceView;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.view.WindowManager;
 
 
public class MainActivity extends ActionBarActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
Класс OpenGLES - пример с гугла
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package ru.dima_n.opengl;
 
/**
 * Created by dim90_000 on 15.08.2015.
 */
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.view.View;
 
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import java.util.Random;
 
public class nRender implements GLSurfaceView.Renderer 
{
    public nRender()
    {
 
    }
 
    public void onDrawFrame(GL10 glUnused) { // Отрисовка кадра
 
        Random rnd = new Random();
 
        // Задаем случайный цвет и сводим с ума эпилептиков =)
        // Цвет задается в формате RGBA, от 0.0f до 1.0f.
        GLES20.glClearColor(((float)rnd.nextInt(2)/2.0f), ((float)rnd.nextInt(2)/2.0f), ((float)rnd.nextInt(2)/2.0f), 1.0f);
 
        GLES20.glClear( GLES20.GL_COLOR_BUFFER_BIT ); // Очищаем буффер цвета
    }
 
    public void onSurfaceChanged(GL10 glUnused, int width, int height) { // изменение поверхности, например изменение размера
 
        GLES20.glViewport(0, 0, width, height);
        // Устанавливаем положение и размер вьюпорта
        // вьюпорт устанавливаеться относительно поверхности ( OpenGLSurface ), в данном случае на весь экран.
        // замечу, что GLES20.glClear очищает всю поверхность, все зависимости от установки Viewport.
    }
 
    public void onSurfaceCreated(GL10 glUnused, EGLConfig config) { // вызываеться при создании поверхности
 
    }
}
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
 
    <ru.dima_n.opengl.nRender
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/game_view"
 
    />
 
</LinearLayout>
Ошибки что класс не является View, Подскажите как OpenGLES встроить так же как View?
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
08-16 23:58:53.149  14524-14524/ru.dima_n.opengl E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{ru.dima_n.opengl/ru.dima_n.opengl.MainActivity}: android.view.InflateException: Binary XML file line #8: Class is not a View ru.dima_n.opengl.nRender
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2266)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2316)
            at android.app.ActivityThread.access$600(ActivityThread.java:150)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1298)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:213)
            at android.app.ActivityThread.main(ActivityThread.java:5225)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:525)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: android.view.InflateException: Binary XML file line #8: Class is not a View ru.dima_n.opengl.nRender
            at android.view.LayoutInflater.createView(LayoutInflater.java:611)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
            at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:249)
            at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:106)
            at ru.dima_n.opengl.MainActivity.onCreate(MainActivity.java:21)
            at android.app.Activity.performCreate(Activity.java:5133)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2230)
************at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2316)
************at android.app.ActivityThread.access$600(ActivityThread.java:150)
************at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1298)
************at android.os.Handler.dispatchMessage(Handler.java:99)
************at android.os.Looper.loop(Looper.java:213)
************at android.app.ActivityThread.main(ActivityThread.java:5225)
************at java.lang.reflect.Method.invokeNative(Native Method)
************at java.lang.reflect.Method.invoke(Method.java:525)
************at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741)
************at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
************at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.ClassCastException: ru.dima_n.opengl.nRender cannot be cast to android.view.View
            at java.lang.Class.asSubclass(Class.java:1182)
            at android.view.LayoutInflater.createView(LayoutInflater.java:559)
************at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696)
************at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
************at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
************at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
************at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
************at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:249)
************at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:106)
************at ru.dima_n.opengl.MainActivity.onCreate(MainActivity.java:21)
************at android.app.Activity.performCreate(Activity.java:5133)
************at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
************at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2230)
************at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2316)
************at android.app.ActivityThread.access$600(ActivityThread.java:150)
************at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1298)
************at android.os.Handler.dispatchMessage(Handler.java:99)
************at android.os.Looper.loop(Looper.java:213)
************at android.app.ActivityThread.main(ActivityThread.java:5225)
************at java.lang.reflect.Method.invokeNative(Native Method)
************at java.lang.reflect.Method.invoke(Method.java:525)
************at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:741)
************at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
************at dalvik.system.NativeStart.main(Native Method)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2015, 00:02
Привет! Вот еще темы с ответами:

OpenGL пример по рисованию графика от 3-х переменных - Delphi
Здравствуйте! Дайте пожалуйста пример кода OpenGL, в котором рисуется трехмерный график от 3-х переменных. Заранее спасибо!

Цикл для программы по рисованию линий - OpenGL
Всем привет! Нужно в программе для рисования линий сделать цикл на 100 выполнений, чтобы можно было определить какой алгоритм быстрее...

Пишу игру танчики, нужен совет по рисованию мира - OpenGL
карта в основном состоять будет из кирпичей, разрушается &quot;строчками&quot;, блок из 4 строк, первое, что в голову приходит, это создать большую...

Только после нажатия кнопки можно приступить к рисованию - C++/CLI WinForms
Задача: пока не нажмете batton1 рисовать нельзя.. вот код.. тут при запуске программы можно уже рисовать.. нужно выполнить поставленную...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru