App

- Main Page
- Related Pages
- Namespaces
- Classes
- Files

- Class List
- Class Index
- Class Hierarchy
- Class Members

Classes | Public Member Functions | Private Attributes | List of all members
mhr.appandroid.displayer.BitmapDisplayer Class Reference

Třída pro asynchronní vykreslování bitmapy na daný SurfaceView. More...

Inheritance diagram for mhr.appandroid.displayer.BitmapDisplayer:

## Classes
class | Lock
| Třída, na které se provádí synchronizace. More...

## Public Member Functions
| BitmapDisplayer (SurfaceView sv)
| Výchozí konstruktor.
int | translateCoordX (float x)
| Přeloží obrazovkovou souřadnici na souřadnici v bitmapě.
int | translateCoordY (float y)
| Přeloží obrazovkovou souřadnici na souřadnici v bitmapě.
SurfaceView | getSurfaceView ()
| Vrací SurfaceView, na který se vykresluje.
void | setInput (Bitmap bitmap)
| Nastaví vstupní bitmapu a zadá požadavek na překreslení.
void | setInput (PDBitmap bitmap)
| Pošle požadavek na nastavení vstupních dat.
void | redraw ()
| Pošle požadavek na překreslení.
void | setPosition (float leftOffset, float topOffset)
| Nastaví pozici vykreslované bitmapy a zadá požadavek na překreslení.
void | movePositionBy (float dx, float dy)
| Posune pozici vykreslované bitmapy o daná delta a zadá požadavek na překreslení.
void | setZoom (double zoom)
| Nastaví zvětšení vykreslované bitmapy a zadá požadavek na překreslení. Pokud je zoom <= 0, je akce ignorována.
void | adjustZoom (double factor, float focusX, float focusY)
| Upraví hodnotu zoomu tak, že ji vynásobí daným faktorem.
void | adjustZoom (double factor)
| Upraví hodnotu zoomu tak, že ji vynásobý zadaným factorem.
void | centerAndResetZoom ()
| Nastaví zoom na 1 a vycentruje obraz.
void | centerAndFit ()
| Vycentruje obraz a nastaví zoom tak, aby byl vidět celý obraz;.
void | surfaceCreated (SurfaceHolder holder)
| Callback volaný při vytvoření SurfaceView.
void | surfaceChanged (SurfaceHolder holder, int format, int width, int height)
| Callback volaný v okamžiku, kdy kanvas dostane rozměry.
void | surfaceDestroyed (SurfaceHolder holder)
| Callback při zničení povrchu.
void | run ()

## Private Attributes
Lock | lock = null
| Slouží k nastavování flagů k vláknu a pro synchronizaci místo neefektivního synchronized(this)
Thread | thread = null
| Vlákno, které provádí vykreslování.
SurfaceView | sv = null
| SurfaceView, na který se vykresluje.
int | outputWidth = -1
| Šířka výstupního kavasu, na který se vykresluje.
int | outputHeight = -1
| Výška výstupního kavasu, na který se vykresluje.
Bitmap | data = null
| Aktuální bitmapa, která se vykresluje.
int | dataWidth = -1
| Šířka bitmapy, která se vykresluje.
int | dataHeight = -1
| Výška bitmapy, která se vykresluje.
Bitmap | newData = null
| Bitmapa, která čeká ve frontě na to, aby byla nastavena jako ta, která se bude vykreslovat.
double | zoom = 1
| Zvětšení vykreslované bitmapy.
float | leftUserOffset
| Posunutí vykreslované bitmapy na kanvase, bráno v souřadnicích SurfaceView, tedy odpovídá posunutí již zvětšené bitmapy.
float | topUserOffset
| Posunutí vykreslované bitmapy na kanvase, bráno v souřadnicích SurfaceView, tedy odpovídá posunutí již zvětšené bitmapy.

## Detailed Description

Třída pro asynchronní vykreslování bitmapy na daný SurfaceView.

Definition at line 20 of file BitmapDisplayer.java.

## Constructor & Destructor Documentation

mhr.appandroid.displayer.BitmapDisplayer.BitmapDisplayer | ( | SurfaceView | sv | ) |
| inline

Výchozí konstruktor.

Parameters

  sv | SurfaceView, na který se bude vykreslovat

Definition at line 68 of file BitmapDisplayer.java.

{
this.sv = sv;
sv.getHolder().addCallback(this);
this.lock = new Lock();
}

## Member Function Documentation

void mhr.appandroid.displayer.BitmapDisplayer.adjustZoom | ( | double | factor,
|  | float | focusX,
|  | float | focusY
| ) |  |
| inline

Upraví hodnotu zoomu tak, že ji vynásobí daným faktorem.

Upraví hodnotu zoomu tak, že ji vynásobý zadaným factorem a zadá požadavek na překreslení. Pokud je factor <= 0, je akce ignorována, za centrum zoomu se považují zadané souřadnice.

Parameters

  factor |
  focusX |
  focusY |

Definition at line 203 of file BitmapDisplayer.java.

{
if (factor <= 0) { return; }
synchronized (this.lock) {
this.zoom *= factor;
this.leftUserOffset -= (factor - 1) * (focusX - leftUserOffset);
this.topUserOffset -= (factor - 1) * (focusY - topUserOffset);
lock.POSITIONING_CHANGED = true;
lock.REDRAW_FLAG = true;
lock.notifyAll();
}
}

void mhr.appandroid.displayer.BitmapDisplayer.adjustZoom | ( | double | factor | ) |
| inline

Upraví hodnotu zoomu tak, že ji vynásobý zadaným factorem.

Upraví hodnotu zoomu tak, že ji vynásobý zadaným factorem a zadá požadavek na překreslení. Pokud je factor <= 0, je akce ignorována, za centrum zoomu se považuje střed canvasu.

Parameters

  factor |

Definition at line 221 of file BitmapDisplayer.java.

{
adjustZoom(factor, outputWidth / 2.0f, outputHeight / 2.0f);
}

void mhr.appandroid.displayer.BitmapDisplayer.centerAndFit | ( |  | ) |
| inline

Vycentruje obraz a nastaví zoom tak, aby byl vidět celý obraz;.

Definition at line 242 of file BitmapDisplayer.java.

{
synchronized (this.lock) {
double zx = outputWidth / (double)dataWidth;
double zy = outputHeight / (double)dataHeight;
if (zx > zy) {
zoom = zy;
leftUserOffset = (int) ((outputWidth - zoom * dataWidth) / 2);
topUserOffset = 0;
} else {
zoom = zx;
leftUserOffset = 0;
topUserOffset = (int) ((outputHeight - zoom * dataHeight) / 2);
}
lock.POSITIONING_CHANGED = true;
lock.REDRAW_FLAG = true;
lock.notifyAll();
}
}

void mhr.appandroid.displayer.BitmapDisplayer.centerAndResetZoom | ( |  | ) |
| inline

Nastaví zoom na 1 a vycentruje obraz.

Definition at line 228 of file BitmapDisplayer.java.

{
synchronized (this.lock) {
this.zoom = 1;
this.leftUserOffset = (outputWidth - dataWidth) / 2;
this.topUserOffset = (outputHeight - dataHeight) / 2;
lock.POSITIONING_CHANGED = true;
lock.REDRAW_FLAG = true;
lock.notifyAll();
}
}

SurfaceView mhr.appandroid.displayer.BitmapDisplayer.getSurfaceView | ( |  | ) |
| inline

Vrací SurfaceView, na který se vykresluje.

Definition at line 107 of file BitmapDisplayer.java.

{
return sv;
}

void mhr.appandroid.displayer.BitmapDisplayer.movePositionBy | ( | float | dx,
|  | float | dy
| ) |  |
| inline

Posune pozici vykreslované bitmapy o daná delta a zadá požadavek na překreslení.

Posune pozici vykreslované bitmapy o daná delta a zadá požadavek na překreslení. Pozice je v souřadnicích SurfaceVIew, tedy se aplikuje až na zvětšenou, zmenšenou bitmapu.

Parameters

  dx | Posunutí v horizontálním směru.
  dy | Posunutí ve vertikálním směru.

Definition at line 171 of file BitmapDisplayer.java.

{
synchronized (this.lock) {
this.leftUserOffset += (int) (dx);
this.topUserOffset += (int) (dy);
lock.POSITIONING_CHANGED = true;
lock.REDRAW_FLAG = true;
lock.notifyAll();
}
}

void mhr.appandroid.displayer.BitmapDisplayer.redraw | ( |  | ) |
| inline

Pošle požadavek na překreslení.

Implements mhr.appcore.interfaces.PDDisplayer.

Definition at line 140 of file BitmapDisplayer.java.

{
synchronized (this.lock) {
this.lock.REDRAW_FLAG = true;
this.lock.notifyAll();
}
}

void mhr.appandroid.displayer.BitmapDisplayer.run | ( |  | ) |
| inline

Definition at line 303 of file BitmapDisplayer.java.

{
SurfaceHolder sh = this.sv.getHolder();
Canvas c = null;
Paint p = new Paint();
p.setFlags(Paint.DITHER_FLAG);
p.setFilterBitmap(true);
Rect src = null;
Rect dst = null;
while (true) { // vykreslujeme stále
synchronized (this.lock) {
while (true) {
// if-else určuje prioritu vykonávání
if (this.lock.EXIT_FLAG) {
return; // ukončení běhu kvůli nastavené EXIT_FLAG
}
if (this.lock.CHANGE_INPUT_FLAG) {
this.data = this.newData;
this.dataWidth = this.data.getWidth();
this.dataHeight = this.data.getHeight();
this.lock.CHANGE_INPUT_FLAG = false;
this.lock.INPUT_READY_FLAG = true;
this.lock.POSITIONING_CHANGED = true;
}
if (this.lock.POSITIONING_CHANGED && this.lock.INPUT_READY_FLAG) {
double st, sl, sb, sr;
double dt, dl, db, dr;
if (leftUserOffset < 0) {
sl = (-leftUserOffset) / zoom;
sr = Math.min(((outputWidth - leftUserOffset) / zoom), dataWidth);
dl = 0;
dr = Math.min(outputWidth, ((dataWidth * zoom)) + leftUserOffset);
} else {
sl = 0;
sr = Math.min( ((outputWidth - leftUserOffset) / zoom), dataWidth);
dl = leftUserOffset;
dr = Math.min(outputWidth, (dataWidth * zoom) + leftUserOffset);
}
if (topUserOffset < 0) {
st = (-topUserOffset / zoom);
sb = Math.min(((outputHeight - topUserOffset)/zoom), dataHeight);
dt = 0;
db = Math.min(outputHeight, (dataHeight * zoom) + topUserOffset);
} else {
st = 0;
sb = Math.min(((outputHeight - topUserOffset)/zoom), dataHeight);
dt = topUserOffset;
db = Math.min(outputHeight, (dataHeight * zoom) + topUserOffset);
}
dst = new Rect((int)dl, (int)dt, (int)dr, (int)db);
src = new Rect((int)sl, (int)st, (int)sr, (int)sb);
lock.POSITIONING_CHANGED = false;
}
if (this.lock.REDRAW_FLAG && this.lock.OUTPUT_READY_FLAG && this.lock.INPUT_READY_FLAG) {
break; // vyskočíme a kreslíme
}
try {
this.lock.BUSY_FLAG = false;
this.lock.wait(); // žádné požadavky na toto vlákno
} catch (InterruptedException e) {
return;
}
this.lock.BUSY_FLAG = true;
}
this.lock.REDRAW_FLAG = false;
}
while (true) { // Následující kód je okopírovaný z literatury a celkem možné, že není korektní vzhledem k nekonečný smyčce
if (!sh.getSurface().isValid()) {
continue;
}
c = sh.lockCanvas();
c.drawColor(0xFF000000); // přemazání, jinak zůstávají na Canvasu předchozí obrazy (a to i 5 překreslení staré), toto by mohlo být nastavitelné..
c.drawBitmap(data, src, dst, p);
sh.unlockCanvasAndPost(c);
break;
}
}
}

void mhr.appandroid.displayer.BitmapDisplayer.setInput | ( | Bitmap | bitmap | ) |
| inline

Nastaví vstupní bitmapu a zadá požadavek na překreslení.

Nastavení neproběhne okamžitě, nastavení provádí až vykreslovací vlákno. Pokud je bitmap null, je akce ignorována.

Bitmapa MUSÍ být platná, platnost bitmapy není testována, stejně tak jako na ní není prováděna synchronizace, aby jiné vlákna mohli přistupovat k jejím datům.

Stará bitmapa se nijak neuvolňuje, to je povinost třídy využívající BitmapDisplayer.

Parameters

  bitmap | Nová vykreslovaná bitmapa.

Definition at line 121 of file BitmapDisplayer.java.

{
if (bitmap == null) { return; }
synchronized (this.lock) {
this.newData = bitmap;
this.lock.CHANGE_INPUT_FLAG = true;
this.lock.REDRAW_FLAG = true;
this.lock.notifyAll();
}
}

void mhr.appandroid.displayer.BitmapDisplayer.setInput | ( | PDBitmap | bitmap | ) |
| inline

Pošle požadavek na nastavení vstupních dat.

Parameters

  bitmap | Nová vstupní data.

Implements mhr.appcore.interfaces.PDDisplayer.

Definition at line 132 of file BitmapDisplayer.java.

{
if (!(bitmap instanceof APDBitmap)) {
throw new IllegalArgumentException("Unsupported bitmap type");
}
setInput(((APDBitmap)bitmap).getBitmap());
}

void mhr.appandroid.displayer.BitmapDisplayer.setPosition | ( | float | leftOffset,
|  | float | topOffset
| ) |  |
| inline

Nastaví pozici vykreslované bitmapy a zadá požadavek na překreslení.

Nastaví pozici vykreslované bitmapy a zadá požadavek na překreslení. Pozice je v souřadnicích SurfaceVIew, tedy se aplikuje až na zvětšenou, zmenšenou bitmapu.

Parameters

  leftOffset | Odsazení z leva.
  topOffset | Odsazení z vrchu.

Definition at line 154 of file BitmapDisplayer.java.

{
synchronized (this.lock) {
this.leftUserOffset = (int) (leftOffset);
this.topUserOffset = (int) (topOffset);
lock.POSITIONING_CHANGED = true;
lock.REDRAW_FLAG = true;
lock.notifyAll();
}
}

void mhr.appandroid.displayer.BitmapDisplayer.setZoom | ( | double | zoom | ) |
| inline

Nastaví zvětšení vykreslované bitmapy a zadá požadavek na překreslení. Pokud je zoom <= 0, je akce ignorována.

Parameters

  zoom | Nová hodnota zvětšení.

Definition at line 185 of file BitmapDisplayer.java.

{
if (zoom <= 0) { return; }
synchronized (this.lock) {
this.zoom = zoom;
lock.POSITIONING_CHANGED = true;
lock.REDRAW_FLAG = true;
lock.notifyAll();
}
}

void mhr.appandroid.displayer.BitmapDisplayer.surfaceChanged | ( | SurfaceHolder | holder,
|  | int | format,
|  | int | width,
|  | int | height
| ) |  |
| inline

Callback volaný v okamžiku, kdy kanvas dostane rozměry.

Definition at line 271 of file BitmapDisplayer.java.

{
// Voláno v okamžiku, kdy Surface dostane rozměry, tedy až po vytvoření
this.outputWidth = width;
this.outputHeight = height;
synchronized (this.lock) {
this.lock.OUTPUT_READY_FLAG = true;
this.thread = new Thread(this);
this.lock.EXIT_FLAG = false;
this.thread.start();
}
}

void mhr.appandroid.displayer.BitmapDisplayer.surfaceCreated | ( | SurfaceHolder | holder | ) |
| inline

Callback volaný při vytvoření SurfaceView.

Definition at line 266 of file BitmapDisplayer.java.

{
// Voláno v okamžiku, kdy je Surface vytvořen
}

void mhr.appandroid.displayer.BitmapDisplayer.surfaceDestroyed | ( | SurfaceHolder | holder | ) |
| inline

Callback při zničení povrchu.

Definition at line 284 of file BitmapDisplayer.java.

{
// Voláno těsně před tím, než je Surface zničen
synchronized (this.lock) {
this.lock.OUTPUT_READY_FLAG = false;
this.lock.EXIT_FLAG = true;
this.lock.notifyAll();
}
try {
this.thread.join();
} catch (InterruptedException e) {
// Čekání na ukončení přerušeno, pravděpodobně konec programu
}
this.thread = null;
}

int mhr.appandroid.displayer.BitmapDisplayer.translateCoordX | ( | float | x | ) |
| inline

Přeloží obrazovkovou souřadnici na souřadnici v bitmapě.

Parameters

  x |

Returns

Definition at line 87 of file BitmapDisplayer.java.

{
synchronized (this.lock) {
return (int)((x - leftUserOffset) / zoom);
}
}

int mhr.appandroid.displayer.BitmapDisplayer.translateCoordY | ( | float | y | ) |
| inline

Přeloží obrazovkovou souřadnici na souřadnici v bitmapě.

Parameters

  y |

Returns

Definition at line 98 of file BitmapDisplayer.java.

{
synchronized (this.lock) {
return (int)((y - topUserOffset) / zoom);
}
}

## Member Data Documentation

Bitmap mhr.appandroid.displayer.BitmapDisplayer.data = null
| private

Aktuální bitmapa, která se vykresluje.

Definition at line 51 of file BitmapDisplayer.java.

int mhr.appandroid.displayer.BitmapDisplayer.dataHeight = -1
| private

Výška bitmapy, která se vykresluje.

Definition at line 53 of file BitmapDisplayer.java.

int mhr.appandroid.displayer.BitmapDisplayer.dataWidth = -1
| private

Šířka bitmapy, která se vykresluje.

Definition at line 52 of file BitmapDisplayer.java.

float mhr.appandroid.displayer.BitmapDisplayer.leftUserOffset
| private

Posunutí vykreslované bitmapy na kanvase, bráno v souřadnicích SurfaceView, tedy odpovídá posunutí již zvětšené bitmapy.

Definition at line 57 of file BitmapDisplayer.java.

Lock mhr.appandroid.displayer.BitmapDisplayer.lock = null
| private

Slouží k nastavování flagů k vláknu a pro synchronizaci místo neefektivního synchronized(this)

Definition at line 46 of file BitmapDisplayer.java.

Bitmap mhr.appandroid.displayer.BitmapDisplayer.newData = null
| private

Bitmapa, která čeká ve frontě na to, aby byla nastavena jako ta, která se bude vykreslovat.

Definition at line 54 of file BitmapDisplayer.java.

int mhr.appandroid.displayer.BitmapDisplayer.outputHeight = -1
| private

Výška výstupního kavasu, na který se vykresluje.

Definition at line 50 of file BitmapDisplayer.java.

int mhr.appandroid.displayer.BitmapDisplayer.outputWidth = -1
| private

Šířka výstupního kavasu, na který se vykresluje.

Definition at line 49 of file BitmapDisplayer.java.

SurfaceView mhr.appandroid.displayer.BitmapDisplayer.sv = null
| private

SurfaceView, na který se vykresluje.

Definition at line 48 of file BitmapDisplayer.java.

Thread mhr.appandroid.displayer.BitmapDisplayer.thread = null
| private

Vlákno, které provádí vykreslování.

Definition at line 47 of file BitmapDisplayer.java.

float mhr.appandroid.displayer.BitmapDisplayer.topUserOffset
| private

Posunutí vykreslované bitmapy na kanvase, bráno v souřadnicích SurfaceView, tedy odpovídá posunutí již zvětšené bitmapy.

Definition at line 58 of file BitmapDisplayer.java.

double mhr.appandroid.displayer.BitmapDisplayer.zoom = 1
| private

Zvětšení vykreslované bitmapy.

Definition at line 56 of file BitmapDisplayer.java.

The documentation for this class was generated from the following file:

- /home/xxx/eclipse_workspaces/app/appandroid/src/mhr/appandroid/displayer/BitmapDisplayer.java