App
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:
mhr.appcore.interfaces.PDDisplayer

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
svSurfaceView, 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.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;
} else {
zoom = zx;
}
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;
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
dxPosunutí v horizontálním směru.
dyPosunutí 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.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;
}
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);
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);
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);
}
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
bitmapNová 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
bitmapNová 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
leftOffsetOdsazení z leva.
topOffsetOdsazení z vrchu.

Definition at line 154 of file BitmapDisplayer.java.

{
synchronized (this.lock) {
this.leftUserOffset = (int) (leftOffset);
this.topUserOffset = (int) (topOffset);
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
zoomNová hodnota zvětšení.

Definition at line 185 of file BitmapDisplayer.java.

{
if (zoom <= 0) { return; }
synchronized (this.lock) {
this.zoom = zoom;
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: