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

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

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

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

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

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

Но!.. Если вызываю из потока метод MainView.onDraw, то поле окрашивается белым цветом и bitmap выводится нормально. Что, как мне кажется, некорректно, да и Android Studio подчёркивает этот вызов как "подозрительный". Оно, в общем-то, и логично: вызывать нужно метод draw, а не событие onDraw.
Если же в потоке вызываю метод MainView.draw, то рисунок не выводится, вернее, не выводится вообще ничего - чёрное поле. Хотя, событие onDraw генерится - точка останова отрабатывается - и вызывается метод отрисовки спрайта.
В чём может быть дело?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.02.2016, 11:45     Почему не отрисовывается картинка?
Посмотрите здесь:

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

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

Картинка - Программирование Android
Текст у меня в ресурсе string Хочу в текст выложить картинку как это сделать? Пример: Текст Текст Текст <Картинка> Текст Текст.

кнопка-картинка - Программирование Android
как сделать чтоб при нажатии на кнопку (кнопка-картинка ImageButton) через две секунды картинка этой кнопки менялась на другую, помогите...

Картинка в SQLite - Программирование Android
Всем привет! В программе используется SQLite БД. Заполняю ListView из нее, встал вопрос каким образом хранить и вставлять картинки. На...

Картинка в картинке - Программирование Android
Здравствуйте! Недавно увидела на планшете Explay функцию картинка в картинке. Конкретно на примере плеера (родного гугловского). Меня...

Не отображается картинка с устрйством - Программирование Android
Всё было нормально, но я что то наклацал в андроид студио, и теперь при открытии activity_main текст отображается, а design не хочет, что...

Картинка из SQLite в ListView - Программирование Android
Здравствуйте.Есть несколько вопросов. 1 Как отобразить картинки в ListView из SQLite.Если картинки храняться в папке drawable? 2...

Картинка становится некачественной - Программирование Android
Размер исходной картинки 96х96px через...

Картинка по ширине и не сжата - Программирование Android
Скажите пожалуйста. Загружаю картинки из интернета в listView и они конечно разного размера загружаются. Каким образом можно сделать так...

Не отображается картинка в эмуляторе - Программирование Android
Почему не выводится на экран картинка в эмуляторе?..причем на устройстве и в Эклипсе она отображается...в чем может быть дело?

Картинка в imageButton (setImageResource) - Программирование Android
Вопрос такой: В приложении имеется кнопка-картинка (imageButton) при нажатии которой меняется ее фон: public void...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Pablito
2419 / 1864 / 583
Регистрация: 12.05.2014
Сообщений: 6,604
Завершенные тесты: 1
14.02.2016, 16:25     Почему не отрисовывается картинка? #2
код где?
maxapet
0 / 0 / 0
Регистрация: 08.02.2016
Сообщений: 95
14.02.2016, 18:20  [ТС]     Почему не отрисовывается картинка? #3
Да, конечно, вот код:

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.
Yandex
Объявления
14.02.2016, 18:20     Почему не отрисовывается картинка?
Ответ Создать тему
Опции темы

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