Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 08.02.2016
Сообщений: 98

Почему не отрисовывается картинка?

14.02.2016, 11:45. Показов 1094. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал класс, наследующий ViewSurface MainView. Написал метод onDraw, в котором поле заливается белым цветом, и вызывается метод draw спрайта.
Создал класс с bitmap'ом для спрайтовой анимации. Написал для него метод draw. Вызываю его, как написал выше, в методе onDraw класса MainView.
Написал класс потока для отрисовки MainThread. Cловом, всё, как в книжках учат.

Но!.. Если вызываю из потока метод MainView.onDraw, то поле окрашивается белым цветом и bitmap выводится нормально. Что, как мне кажется, некорректно, да и Android Studio подчёркивает этот вызов как "подозрительный". Оно, в общем-то, и логично: вызывать нужно метод draw, а не событие onDraw.
Если же в потоке вызываю метод MainView.draw, то рисунок не выводится, вернее, не выводится вообще ничего - чёрное поле. Хотя, событие onDraw генерится - точка останова отрабатывается - и вызывается метод отрисовки спрайта.
В чём может быть дело?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.02.2016, 11:45
Ответы с готовыми решениями:

Почему переворачивается картинка из галереи?
Получаю картинку из галереи и вывожу её в ImageView. В Андроиде 4 она переворачивается на 90 градусов, а в Андроид 6 она нормальная. ...

Почему картинка рисуется увеличенной
Добрый день. Пытаюсь нарисовать png картинку на экране. Картинка рисуется но гиганская. Bitmap bm =...

Qt с++ картинка постоянно отрисовывается
Ребята помогите пожалуйста, картинки один раз перемешивались и орисовывались и всё... а у меня эти действии повторяются каждый раз когда я...

2
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
14.02.2016, 16:25
код где?
0
0 / 0 / 0
Регистрация: 08.02.2016
Сообщений: 98
14.02.2016, 18:20  [ТС]
Да, конечно, вот код:

MainView.java
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
public class MainView extends SurfaceView implements SurfaceHolder.Callback {
 
    private MainThread mMainThread;
    private Hero mHero;
 
    public MainView(Context context) {
        super(context);
        init(null, 0);
    }
 
    private void init(AttributeSet attrs, int defStyle) {
        // добавляем этот класс, как содержащий функцию обратного вызова
        // для взаимодействия с событиями
        getHolder().addCallback(this);
 
        mHero = new Hero(
                BitmapFactory.decodeResource(getResources(), R.drawable.moving_Hero)
                , 10, 50// начальное положение
                , 80, 80// ширина и высота спрайта
                , 25, 12);// FPS и число кадров в анимации
 
        // делаем MainView.focusable, чтобы оно могло обрабатывать события
        setFocusable(true);
 
        // создаём основной поток
        mMainThread = new MainThread(this);
    }
 
    public void update(){
        mHero.update();
    }
 
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(Color.WHITE);
 
        mHero.draw(canvas);
////////////////////
        // TODO: consider storing these as member variables to reduce
        // allocations per draw cycle.
        int paddingLeft = getPaddingLeft();
        int paddingTop = getPaddingTop();
        int paddingRight = getPaddingRight();
        int paddingBottom = getPaddingBottom();
 
        int contentWidth = getWidth() - paddingLeft - paddingRight;
        int contentHeight = getHeight() - paddingTop - paddingBottom;
        ////////////////////////
        canvas.restore();
    }
 
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        Canvas canvas = null;
        SurfaceHolder surfaceHolder = getHolder();
        mMainThread.setRunning(true);
        mMainThread.start();
        try {
            // получаем объект Canvas и выполняем отрисовку
            canvas = surfaceHolder.lockCanvas();
            synchronized (surfaceHolder) {
                canvas.drawColor(Color.WHITE);
                mHero.draw(canvas);
            }
        } finally {
            if (canvas != null) {
                // отрисовка выполнена. выводим результат на экран
                surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }
    }
 
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        //mMainThread.setRunning(false);
    }
 
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
    //посылаем потоку команду на закрытие и дожидаемся,
    //пока поток не будет закрыт.
        boolean retry = true;
        while (retry) {
            try {
                    mMainThread.join();
                    retry = false;
            } catch (InterruptedException e) {
                 // пытаемся снова остановить поток thread
            }
        }
   }
}
MainThread.java
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
public class MainThread extends Thread {
    // признак того, что игра запущена
    private boolean running;
    private MainView mMainView;
    private SurfaceHolder mSurfaceHolder;
 
    MainThread(MainView mMainView) {
        // вызываем базовый конструктор
        super();
 
        // настраиваем члены класса
        this.mMainView = mMainView;
        mSurfaceHolder = mMainView.getHolder();
    }
 
    public void setRunning(boolean running){
        this.running = running;
    }
 
    @Override public void run(){
        Canvas canvas;
        while(running){
            canvas = null;
            // пытаемся заблокировать canvas
            // для изменение картинки на поверхности
            try{
                canvas = mSurfaceHolder.lockCanvas();
                synchronized(mSurfaceHolder){
                    // здесь будет обновляться состояние игры
                    // и формироваться кадр для вывода на экран
                    this.mMainView.draw(canvas);//Вызываем метод для рисования
                    sleep(10);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally{
                // в случае ошибки, плоскость не перешла в
                //требуемое состояние
                if(canvas!= null){
                    mSurfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
        }
    }
}
Hero.java
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import android.app.ActionBar;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.AttributeSet;
 
// режимы движения героя
enum HeroMode {
    UNDEFINED,      // не опредён
    STEP,           // шаг
    RUN,            // бег
    JUMP_UP,        // начало прыжка
    JUMP_FLY,       // полёт в прыжке
    JUMP_DOWN,      // окончание прыжка
    FALL_BACK,      // падаение назад
    FALL_FORWARD    // падение вперёд
}
 
public class Hero {
    private static final String TAG = Hero.class.getSimpleName();
 
    private Bitmap mBitmap;     // Картинка с анимационной последовательностью
    private Rect mSourceRect;   // Прямоугольная область в bitmap, которую нужно нарисовать
    private Rect mDestRect;     // Прямоугольная область в bitmap, которую нужно нарисовать
    private int mFramesCnt;     // Число кадров в анимации
    private int mCurrentFrameNo;// Текущий кадр
    private long frameTicker;   // время обновления последнего кадра
    private int framePeriod;    // сколько миллисекунд должно пройти перед сменой кадра (1000/fps)
 
    private HeroMode mHeroMode = HeroMode.STEP;
 
    private int mSpriteWidth;// ширина спрайта (одного кадра)
    private int mSpriteHeight;// высота спрайта
 
    private int mX;// X координата спрайта (верхний левый угол картинки)
    private int mY;// Y координата спрайта (верхний левый угол картинки)
 
    public Hero(Context context, AttributeSet attrs) {}
 
    public Hero(Bitmap bitmap, int x, int y, int width, int height, int fps, int frameCount) {
        ActionBar.LayoutParams layoutParams = new ActionBar.LayoutParams(175, 105);
        this.mBitmap = bitmap;
        this.mX = x;
        this.mY = y;
        mCurrentFrameNo = 0;
        mFramesCnt = frameCount;
        mSpriteWidth = width;
        mSpriteHeight = height;
        mSourceRect = new Rect(0, 0, mSpriteWidth, mSpriteHeight);
        framePeriod = 1000 / fps;
        frameTicker = 0l;
    }
 
    public void draw(Canvas canvas) {
        //комманда вывода рисунка на экран.
        canvas.drawBitmap(mBitmap, mSourceRect, mDestRect, null);
    }
 
    public void update() {
        mCurrentFrameNo++;
 
        switch (mHeroMode) {
            case STEP: {
                // TODO: отобразить героя, идущего шагом
            }
            break;
            case RUN: {
                // TODO: отобразить бегущего героя
            }
            break;
            case JUMP_UP: {
                // TODO: отобразить начало прыжка
            }
            break;
            case JUMP_FLY:
            {
                // TODO отобразить героя в полёте
            }
            break;
            case JUMP_DOWN:{
                // TODO: отобразить спускающегося героя
            }
            break;
            case FALL_BACK:{
                // TODO: отобразить героя, падающего назад
            }
            break;
            case FALL_FORWARD:{
                // TODO: отобразить героя, падающего вперёд
            }
            break;
            default: {
                // TODO отобразить стоящего героя
            }
        }
    }
}
}
P.S. Это, пока, только заготовки. Хотелось для начала попробовать анимацию в Android.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.02.2016, 18:20
Помогаю со студенческими работами здесь

Почему не перерисовывается картинка
Почему картинка не перерисовывается после нажатия на кнопку, если ее ложить в ScrollAreaGadget, но рисуется если убрать ScrollAreaGadget. ...

Почему пропадает картинка
Здравствуйте! Подскажите, пожалуйста, почему когда у меня программа запущена и я ничего не делаю то через минуты две картинка пропадает...

Почему картинка искажена?
Не пойму в чем проблема. почему картинка искаженна. задача лежит в том, что все картинки нужно перевести в 24-битный формат, чтобы...

Почему не сдвигается картинка в Бутстрапе?
Здравствуйте! Подскажите пожалуйста, почему не сдвигается картинка на предполагаемые 2 колонки? Где я ошиблась? Прикладываю код и...

Почему не устанавливается фоновая картинка?
Не устанавливается фоновая картинка только цвет подскажите в чем дело #menu>ul>li/* стили для пунктов меню*/ { ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru