С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

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

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

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

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

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

2
Pablito
2534 / 2013 / 627
Регистрация: 12.05.2014
Сообщений: 7,068
Завершенные тесты: 1
14.02.2016, 16:25 #2
код где?
0
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.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2016, 18:20
Привет! Вот еще темы с ответами:

Почему не отображается картинка на canvas? - HTML5 Canvas
Извините, я пока чайник, не знал, куда написать, написал сюда. Помогите, почему не отображается картинка? <HTML> ...

Почему не отображаются картинка из базы а ie - PHP
Не отображаются картинки из базы, в остальных браузерах все нормально

Почему картинка движется медленнее курсора? - JavaScript
Здравствуйте. Вот код: http://learn.javascript.ru/play/MWXqnc В данном примере картинка движется медленнее курсора и дергается. Скажите...

Почему картинка в меню получается неоднородной? - HTML, CSS
почему картинка в меню получается неоднородной #menu/*стили для меню*/ { position:relative;/* Относительное...


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

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

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