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

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

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

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

02.04.2016, 19:22. Просмотров 224. Ответов 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);
    }
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2016, 19:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как сохранить состояние нарисованного изображения при повороте экрана? (Программирование Android):

Как сохранить состояние хронометра при повороте экрана? - Программирование Android
в программе запускается хронометр Chronometer chronometer = (Chronometer) findViewById(R.id.chronometer); chronometer.start(); ...

Сохранить состояние презентера при пересоздании (повороте) активити - Программирование Android
Вот у презентера можно реализовать метод onDetach() в котором он обнуляет ссылку на активити то есть как бы на View(при пересоздании...

Сохранить imageview при повороте экрана - Программирование Android
Доброго времени суток. При повороте екрана нужно сохранить imageView. Знаю что нужно использовать onSaveInstanceState() и ...

При повороте экрана, сохранить 3 объекта(фрагменты) и потом восстановить их - Программирование Android
Инициализируются 3 таба так вот (код). Подскажите, как сохранить на них ссылки и потом обрабно достать при поворотах экрана ? Tab1...

Как сохранить все данные при повороте - Программирование Android
При повороте нужно сохранить все данные activity. Как это делают и делают ли?

Как при повороте экрана показывать видео дальше, а не сначала - Программирование Android
В общем, когда поворачивается экран видео воспроизводится сначала. Как я понял, при повороте view элементы с id сохраняются, хотя если...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2016, 19:22
Привет! Вот еще темы с ответами:

Ошибка при повороте экрана - Программирование Android
Доброго времени суток, пишу по следующему вопросу: Начал изучать программирование под андроид и создал простое приложение побаловаться....

Сохранение объекта при повороте экрана - Программирование Android
здравствуйте,читаю в доках,что метод onRetainNonConfigurationInstance () устарел и надо пользоваться Fragment.setRetainInstance(true) даже...

Непонятное поведение при повороте экрана - Программирование Android
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listpick); ...

При повороте экрана выпадает ошибка - Программирование Android
Доброе утро товарищи. Пытаюсь протестить аппку на реальном устройстве. Подключил через шнурок, устанавливает нормально. При запуске...


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

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

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