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

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

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

Как сохранить состояние нарисованного изображения при повороте экрана? - Программирование Android

02.04.2016, 19:22. Просмотров 185. Ответов 0
Метки нет (Все метки)

Добрый вечер! Такая проблема - имеется кастомный View, на котором можно рисовать и который хостится в главной активити. При повороте экрана в горизонтальное положение весь рисунок пропадает( подскажите, пожалуйста.
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
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
public class DrawingView extends View {
 
    //drawing path
    private Path drawPath;
    //drawing and canvas paint
    private Paint drawPaint, canvasPaint;
    //initial color
    private int paintColor = 0xFF660000, paintAlpha = 255;
    //canvas
    private Canvas drawCanvas;
 
    //canvas bitmap
    private Bitmap canvasBitmap;
    //brush sizes
    private float brushSize, lastBrushSize;
    //erase flag
    private boolean erase=false;
 
 
    public DrawingView(Context context, AttributeSet attrs){
        super(context, attrs);
 
        setupDrawing();
 
    }
 
    //setup drawing
    private void setupDrawing(){
        //prepare for drawing and setup paint stroke properties
 
        brushSize = getResources().getInteger(R.integer.small_size);
        lastBrushSize = brushSize;
        drawPath = new Path();
        drawPaint = new Paint();
        drawPaint.setColor(paintColor);
        drawPaint.setAntiAlias(true);
        drawPaint.setStrokeWidth(brushSize);
        drawPaint.setStyle(Paint.Style.STROKE);
        drawPaint.setStrokeJoin(Paint.Join.ROUND);
        drawPaint.setStrokeCap(Paint.Cap.ROUND);
        canvasPaint = new Paint(Paint.DITHER_FLAG);
    }
 
    //size assigned to view
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
 
        if (canvasBitmap == null){
            canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        } else{
            Bitmap temporary = Bitmap.createScaledBitmap(canvasBitmap, w, h, true);
            canvasBitmap = temporary;
        }
        drawCanvas = new Canvas(canvasBitmap);
 
    }
 
    //draw the view - will be called after touch event
    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
        canvas.drawPath(drawPath, drawPaint);
    }
 
    //register user touches as drawing action
    @Override
    public boolean onTouchEvent(MotionEvent event) {
 
        getParent().requestDisallowInterceptTouchEvent(true);
        //respond to down, move and up events
        switch (event.getAction()) {
 
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
            case MotionEvent.ACTION_UP:
                performTouchEvent(event);
 
        }
        //redraw
        invalidate();
        eventList.add(MotionEvent.obtain(event));
        return true;
 
    }
 
    private void performTouchEvent(MotionEvent event) {
        float touchX = event.getX();
        float touchY = event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                drawPath.moveTo(touchX, touchY);
                break;
            case MotionEvent.ACTION_MOVE:
                drawPath.lineTo(touchX, touchY);
                break;
            case MotionEvent.ACTION_UP:
                drawPath.lineTo(touchX, touchY);
                drawCanvas.drawPath(drawPath, drawPaint);
                drawPath.reset();
                break;
        }
        invalidate();
        eventList.add(MotionEvent.obtain(event));
    }
 
    //update color
    public void setColor(String newColor){
        invalidate();
        //check whether color value or pattern name
        if(newColor.startsWith("#")){
            paintColor = Color.parseColor(newColor);
            drawPaint.setColor(paintColor);
            drawPaint.setShader(null);
        }
        else{
            //pattern
            int patternID = getResources().getIdentifier(
                    newColor, "drawable", "com.example.navigationdrawerproject");
            //decode
            Bitmap patternBMP = BitmapFactory.decodeResource(getResources(), patternID);
            //create shader
            BitmapShader patternBMPshader = new BitmapShader(patternBMP,
                    Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
            //color and shader
            drawPaint.setColor(0xFFFFFFFF);
            drawPaint.setShader(patternBMPshader);
        }
    }
 
    //set brush size
    public void setBrushSize(float newSize){
        float pixelAmount = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                newSize, getResources().getDisplayMetrics());
        brushSize=pixelAmount;
        drawPaint.setStrokeWidth(brushSize);
    }
 
    //get and set last brush size
    public void setLastBrushSize(float lastSize){
        lastBrushSize=lastSize;
    }
    public float getLastBrushSize(){
        return lastBrushSize;
    }
 
    //set erase true or false
    public void setErase(boolean isErase){
        erase=isErase;
        if(erase)  {
            drawPaint.setColor(Color.WHITE);//set the color to white
        }
        else drawPaint.setColor(paintColor); //if erase is set to false, it will use the previous color.
    }
 
    //start new drawing
    public void startNew(){
        drawCanvas.drawColor(0, PorterDuff.Mode.CLEAR);
        invalidate();
    }
 
    //return current alpha
    public int getPaintAlpha(){
        return Math.round((float)paintAlpha/255*100);
    }
 
    //set alpha
    public void setPaintAlpha(int newAlpha){
        paintAlpha=Math.round((float)newAlpha/100*255);
        drawPaint.setColor(paintColor);
        drawPaint.setAlpha(paintAlpha);
    }
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2016, 19:22     Как сохранить состояние нарисованного изображения при повороте экрана?
Посмотрите здесь:
Как сохранить состояние хронометра при повороте экрана? Android
Android Сохранить imageview при повороте экрана
При повороте экрана, сохранить 3 объекта(фрагменты) и потом восстановить их Android
Как сохранить все данные при повороте Android
Как при повороте экрана показывать видео дальше, а не сначала Android
Android Ошибка при повороте экрана
Android Непонятное поведение при повороте экрана
При повороте экрана выпадает ошибка Android
Сохранение объекта при повороте экрана Android
Android Запрет выполнения onCreate при повороте экрана
Анимация при повороте экрана - в своем приложении Android
Сохранить, восстановить данные при повороте (Фрагмент, Поток) Android

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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