Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Модуль відміни

Читайте также:
  1. Аска? АСКА!!! – Закричал он, заставляя Модуль-01 двигаться вперед, готовый защищать ее от любого врага.
  2. ЗМІСТОВИЙ Модуль I
  3. Й модуль
  4. Модуль 1
  5. МОДУЛЬ 1
  6. Модуль 1. ОБЩАЯ ЧАСТЬ
  7. Модуль 1. Теоретические и экспериментальные основы социально-педагогической деятельности

Моділь відміни призначений для зберігання точок відкату, керування ними та виконання на малюнку дій повтору на відміни. Реазізований цей модуль в класі UndoProvider (лістинг 3.8.1).

public class UndoProvider {
Draw draw;
Bitmap image_tmp; //место, где хранится изображение между вызовами prepare и apply
Bitmap[] image;
int [] x;
int [] y;
int undoFailCounter =0;
int current = -1; //на какой точке отмены мы сейчас находимся -1 - текущий как бы
int cleanUpCounter =0; //счетчик попыток очистки памяти
int undoSize = -1; //временное значение для того, чтобы функция инициализации сработала

public UndoProvider(Draw d) {
draw = d;
init();
}
public void init() {
int newUndoSize = (Integer)Data. get (Data. undoSizeInt ());
if (newUndoSize!= undoSize) {
undoSize = newUndoSize;
image = new Bitmap[ undoSize ];
x = new int [ undoSize ];
y = new int [ undoSize ];
}
}
public void prepare() {
boolean cont= true;
while (cont) {
image_tmp =Bitmap. createBitmap (draw. bitmap);
cont= false;
}
public void apply(){
apply(0, bitmap. getHeight(), 0, bitmap. getWidth());
}
public void apply(int top, int bottom, int left, int right) {
if (image_tmp!= null && bottom <= image_tmp. getHeight() && right <= image_tmp. getWidth()
&& top >= 0 && left >= 0) {
//сдвиг массива
if (current ==-1) {
Bitmap tmp= image [ undoSize -1];
for (int i= undoSize -1; i>0; i--) {
image [i]= image [i-1];
x [i]= x [i-1];
y [i]= y [i-1];
}
image [0]=tmp;
}
else {
int to=0;
int from= current;
while (from< undoSize -1) {
image [to]= image [from];
x [to]= x [from];
y [to]= y [from];
from++;
to++;
}
for (int i=to; i< undoSize; i++)
image [i]= null;
current =-1;
Logger. log ("UndoProvider.apply", "Возврат в точку отсчета", false);
}
//запись
boolean cont= true;
while (cont) {
image [0]=Bitmap. createBitmap (image_tmp, left, top, (right-left), (bottom-top));
x [0]=left;
y [0]=top;
cont= false;
image_tmp = null;
}
} else {
if (image_tmp == null)
Logger. log ("Undo apply: ошибка - prepare() не был вызван.");
else
Logger. log ("Undo apply: ошибка - область сохранения выходит за рамки буфера.");
}
}
}
public void undo() {
int old_current= current;
if (current < undoSize -1 && image [ current +1]!= null) {
undoFailCounter =0;
current ++;
Logger. log ("UndoProvider.undo", "Отмена до ячейки " + String. valueOf (current), false);
Bitmap tmp= null;
boolean cont= true;
while (cont) {
tmp=Bitmap. createBitmap (draw. bitmap, x [ current ], y [ current ], image [ current ].getWidth(), image [ current ].getHeight());
cont= false;
}
if (tmp!= null) {
clearArea(x [ current ], y [ current ],
x [ current ] + image [ current ].getWidth(), y [ current ] + image [ current ].getHeight(),
draw. canvas); draw. canvas. drawBitmap(image [ current ], x [ current ], y [ current ], new Paint());
image [ current ]=tmp;
prepare();
draw. invalidate();
}
}
else {
Logger. log ("UndoProvider.undo", "Уже некуда отменять", false);

Logger. show (Data. tools. getResource(R.string. undoEnd));
}
}
public void redo() {
int old_current= current;
if (current >=0) {
Logger. log ("UndoProvider.redo", "Повтор ячейки " + String. valueOf (current), false);
Bitmap tmp= null;
boolean cont= true;
while (cont) {
tmp=Bitmap. createBitmap (draw. bitmap, x [ current ], y [ current ], image [ current ].getWidth(), image [ current ].getHeight());
cont= false;
}
if (tmp!= null) {
clearArea(x [ current ], y [ current ],
x [ current ] + image [ current ].getWidth(), y [ current ] + image [ current ].getHeight(),
draw. canvas);
draw. canvas. drawBitmap(image [ current ], x [ current ], y [ current ], new Paint());
image [ current ]=tmp;
prepare();
draw. invalidate();
current --;
}
}
else {
Logger. log ("UndoProvider.redo", Data. tools. getResource(R.string. redoEnd), false);
Logger. show (Data. tools. getResource(R.string. redoEnd));
}
}

Лістинг 3.8.1 Модуль відміни

 

Використання модуля передбачає, що перед внесенням змін на малюнок буде викликана функція prepare(), яка зберігає до себе в пам'ять копію стану малюнка до внесення змін. Після внесення змін викликається функція apply(), яка приймає координати області, в якій ці зміни були внесені. Функція вирізає з малюнка цю область, зберігає до масива цей фрагмент та координати місця, де він знаходився.

Для виконання відміни передбачена функція undo. Вона використовує масив з даними, а також, містить індекс поточного кроку відміни. Коли виконується відміна, індекс зміщується та з нього береться малюнок та координати, які відображаються на малюнку. Перед цим змінений фрагмент малюнка замінює старий фрагмент в комірці пам’яті. Якщо виконується повтор дії, новий малюнок з комірки пам’яті переходить знову на малюнок, а індекс зміщується назад.

 


Дата добавления: 2015-08-09; просмотров: 53 | Нарушение авторских прав


Читайте в этой же книге: Огляд програми «SketchBook Express» від Autodesk Inc. | Огляд програми «Рисование» від developer5 | Розроблення структури меню та інтерфейсу програми | Розроблення дизайну меню та елементів управління | Розроблення набору кольорів для палітри | Розроблення алгоритму згладжування кутів | Розроблення алгоритмів динамічного керування товщиною пензля | Розроблення алгоритмів зафарбовування | ОПИС ПРОГРАМНОГО ПРОДУКТУ | Меню жестів |
<== предыдущая страница | следующая страница ==>
Головне меню| Меню налаштувань

mybiblioteka.su - 2015-2024 год. (0.006 сек.)