【移動應用開發(fā)技術(shù)】Android如何實現(xiàn)電影院選座效果_第1頁
【移動應用開發(fā)技術(shù)】Android如何實現(xiàn)電影院選座效果_第2頁
【移動應用開發(fā)技術(shù)】Android如何實現(xiàn)電影院選座效果_第3頁
【移動應用開發(fā)技術(shù)】Android如何實現(xiàn)電影院選座效果_第4頁
【移動應用開發(fā)技術(shù)】Android如何實現(xiàn)電影院選座效果_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

【移動應用開發(fā)技術(shù)】Android如何實現(xiàn)電影院選座效果

這篇文章將為大家詳細講解有關Android如何實現(xiàn)電影院選座效果,在下覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。具體內(nèi)容如下這是一個簡單的電影院選座效果,實現(xiàn)該效果大致分為三步:1.自定義view進行繪制;2.手勢縮放效果的實現(xiàn);3.手勢觸摸被選和未被選效果的實現(xiàn);先來看第一步,效果的繪制;public

class

MoveSeatView

extends

View

{

private

final

boolean

DBG

=

false;

private

Paint

paint

=

new

Paint();

private

Matrix

matrix

=

new

Matrix();

private

Matrix

tempMatrix

=

new

Matrix();

//座位水平間距

private

int

spacing;

//座位垂直間距

private

int

verSpacing;

//行號寬度

private

int

numberWidth;

//行數(shù)

private

int

row;

//列數(shù)

private

int

column;

//可選座位的圖片

private

Bitmap

seatBitmap;

//選中時座位的圖片

private

Bitmap

checkedSeatBitmap;

private

int

lastX;

private

int

lastY;

//整個座位圖的寬度

private

int

seatBitmapWidth;

private

int

seatBitmapHeight;

private

float

screenHeight;

//屏幕的最小寬度

private

int

defaultScreenWidth;

//標識是否正在縮放

private

boolean

isScaling;

private

float

scaleX,

scaleY;

//是否是第一次縮放

private

boolean

firstScale

=

true;

private

boolean

isOnClick;

private

int

downX,

downY;

private

boolean

pointer;

//用于存儲已經(jīng)選在好的座位

public

ArrayList<Point>

list;

/**

*

默認的座位圖片的寬度,如果使用的自己的座位的圖片比這個尺寸大或者小,會縮放到這個大小

*/

private

float

defaultImgW

=

40;

private

float

defaultImgH

=

34;

/**

*

座位圖片的寬度

*/

private

int

seatWidth

=

40;

/**

*

座位圖片的高度

*/

private

int

seatHeight

=

34;

private

float

zoom;

float

xScalel

=

1;

float

yScalel

=

1;

public

MoveSeatView(Context

context)

{

this(context,

null);

}

public

MoveSeatView(Context

context,

AttributeSet

attrs)

{

this(context,

attrs,

0);

}

public

MoveSeatView(Context

context,

AttributeSet

attrs,

int

defStyleAttr)

{

super(context,

attrs,

defStyleAttr);

}

private

void

init()

{

spacing

=

(int)

dip2px(5);

verSpacing

=

(int)

dip2px(10);

defaultScreenWidth

=

(int)

dip2px(80);

seatBitmap

=

BitmapFactory.decodeResource(getResources(),

R.drawable.seat_default);

xScalel

=

defaultImgW

/

seatBitmap.getWidth();

yScalel

=

defaultImgH

/

seatBitmap.getHeight();

checkedSeatBitmap

=

BitmapFactory.decodeResource(getResources(),

R.drawable.seat_green);

seatBitmapWidth

=

(int)

(column

*

seatBitmap.getWidth()

*

xScalel

+

(column

-

1)

*

spacing);

seatBitmapHeight

=

(int)

(row

*

seatBitmap.getHeight()

*

yScalel

+

(row

-

1)

*

verSpacing);

paint.setColor(Color.RED);

numberWidth

=

(int)

dip2px(20);

screenHeight

=

dip2px(20);

list

=

new

ArrayList<>();

matrix.postTranslate(numberWidth

+

spacing,

screenHeight

+

1

+

verSpacing);

}

}上面這些都是一些初始化動作,接下來在onDraw方法中進行繪制;@Override

protected

void

onDraw(Canvas

canvas)

{

if

(row

<=

0

||

column

<=

0)

{

return;

}

drawSeat(canvas);

super.onDraw(canvas);

}具體的繪制邏輯實在drawSeat(),方法中實現(xiàn)的;/**

*

繪制

*

*

@param

canvas

*/

private

void

drawSeat(Canvas

canvas)

{

zoom

=

getMatrixScaleX();

float

translateX

=

getTranslateX();

float

translateY

=

getTranslateY();

float

scaleX

=

zoom;

float

scaleY

=

zoom;

for

(int

i

=

0;

i

<

row;

i++)

{

float

top

=

i

*

seatBitmap.getHeight()

*

yScalel

*

scaleY

+

i

*

verSpacing

*

scaleY

+

translateY;

float

bottom

=

top

+

seatBitmap.getHeight()

*

yScalel

*

scaleY;

for

(int

j

=

0;

j

<

column;

j++)

{

float

left

=

j

*

seatBitmap.getWidth()

*

xScalel

*

scaleX

+

j

*

spacing

*

xScalel

*

scaleX

+

translateX;

float

right

=

left

+

seatBitmap.getWidth()

*

xScalel

*

scaleX;

tempMatrix.setTranslate(left,

top);

tempMatrix.postScale(xScalel,

yScalel,

left,

top);

tempMatrix.postScale(scaleX,

scaleY,

left,

top);

if

(isHave(i,

j))

{

//繪制被選

canvas.drawBitmap(checkedSeatBitmap,

tempMatrix,

paint);

//繪制文字

drawText(canvas,

i,

j,

top,

left);

}

else

{

//繪制普通

canvas.drawBitmap(seatBitmap,

tempMatrix,

paint);

}

}

}

}主要是計算繪制的位置,矩陣的縮放,根據(jù)是否被選進行繪制不同的效果;/**

*

繪制文字

*

*

@param

canvas

*

@param

row

*

@param

column

*

@param

top

*

@param

left

*/

private

void

drawText(Canvas

canvas,

int

row,

int

column,

float

top,

float

left)

{

String

txt

=

(row

+

1)

+

"排";

String

txt1

=

(column

+

1)

+

"座";

//實例化文字畫筆

TextPaint

txtPaint

=

new

TextPaint(Paint.ANTI_ALIAS_FLAG);

txtPaint.setColor(Color.WHITE);

//設置字體樣式

txtPaint.setTypeface(Typeface.DEFAULT_BOLD);

float

seatHeight

=

this.seatHeight

*

getMatrixScaleX();

float

seatWidth

=

this.seatWidth

*

getMatrixScaleX();

txtPaint.setTextSize(seatHeight

/

3);

//獲取中間線

float

center

=

seatHeight

/

2;

float

txtWidth

=

txtPaint.measureText(txt);

float

startX

=

left

+

seatWidth

/

2

-

txtWidth

/

2;

//只繪制一行文字

if

(txt1

==

null)

{

canvas.drawText(txt,

startX,

getBaseLine(txtPaint,

top,

top

+

seatHeight),

txtPaint);

}

else

{

canvas.drawText(txt,

startX,

getBaseLine(txtPaint,

top,

top

+

center),

txtPaint);

canvas.drawText(txt1,

startX,

getBaseLine(txtPaint,

top

+

center,

top

+

center

+

seatHeight

/

2),

txtPaint);

}

if

(DBG)

{

Log.d("drawTest",

"top"

+

top);

}

}這里是使用TextPaint畫筆進行文字的繪制,在繪制文字的時候要注意基準線;/**

*

獲取基準線

*

@param

p

*

@param

top

*

@param

bottom

*

@return

*/

private

float

getBaseLine(Paint

p,

float

top,

float

bottom)

{

Paint.FontMetrics

fontMetrics

=

p.getFontMetrics();

int

baseLine

=

(int)

((bottom

+

top

-

fontMetrics.bottom

-

fontMetrics.top)

/

2);

return

baseLine;

}這樣大致的繪制做完成了,剩下的第二步和第三步都涉及到手勢觸摸,在onTouchEvent方法中去實現(xiàn)具體的邏輯;@Override

public

boolean

onTouchEvent(MotionEvent

event)

{

int

x

=

(int)

event.getX();

int

y

=

(int)

event.getY();

//手勢縮放

scaleGuestureDetector.onTouchEvent(event);

//手勢

gestureDetector.onTouchEvent(event);

//獲取當前操作的手指數(shù)量

int

pointerCount

=

event.getPointerCount();

if

(pointerCount

>

1)

{

//多手指操作

pointer

=

true;

}

switch

(event.getAction())

{

case

MotionEvent.ACTION_DOWN:

pointer

=

false;

downX

=

x;

downY

=

y;

invalidate();

break;

case

MotionEvent.ACTION_UP:

autoScale();

break;

case

MotionEvent.ACTION_MOVE:

if

(!isScaling

&&

!isOnClick)

{

int

downDX

=

Math.abs(x

-

downX);

int

downDY

=

Math.abs(y

-

downY);

if

((downDX

>

10

||

downDY

>

10)

&&

!pointer)

{

int

dx

=

x

-

lastX;

int

dy

=

y

-

lastY;

matrix.postTranslate(dx,

dy);

invalidate();

}

}

lastX

=

x;

lastY

=

y;

isOnClick

=

false;

break;

}

return

true;

}剛觸摸去選擇的時候會有個手勢縮放的效果,手勢縮放系統(tǒng)提供了ScaleGestureDetector類可以很容易的實現(xiàn),具體的邏輯系統(tǒng)都已經(jīng)處理好了,在對應的回調(diào)方法里面去實現(xiàn)就可以了;/**

*

手勢縮放

*/

ScaleGestureDetector

scaleGuestureDetector

=

new

ScaleGestureDetector(getContext(),

new

ScaleGestureDetector.OnScaleGestureListener()

{

@Override

public

boolean

onScale(ScaleGestureDetector

detector)

{

//正在縮放的時候回調(diào)

isScaling

=

true;

float

scaleFactor

=

detector.getScaleFactor();

if

(getMatrixScaleY()

*

scaleFactor

>

3)

{

scaleFactor

=

3

/

getMatrixScaleY();

}

if

(firstScale)

{

scaleX

=

detector.getCurrentSpanX();

scaleY

=

detector.getCurrentSpanY();

firstScale

=

false;

}

if

(getMatrixScaleY()

*

scaleFactor

<

0.5)

{

scaleFactor

=

0.5f

*

getMatrixScaleY();

}

matrix.postScale(scaleFactor,

scaleFactor,

scaleX,

scaleY);

invalidate();

return

true;

}

@Override

public

boolean

onScaleBegin(ScaleGestureDetector

detector)

{

//開始縮放的時候回調(diào)

return

false;

}

@Override

public

void

onScaleEnd(ScaleGestureDetector

detector)

{

//縮放完成回調(diào)

isScaling

=

false;

firstScale

=

true;

}

});其他的手勢操作系統(tǒng)還提供了GestureDetector類,可以使用GestureDetector來實現(xiàn)具體的效果;GestureDetector

gestureDetector

=

new

GestureDetector(getContext(),

new

GestureDetector.SimpleOnGestureListener()

{

@Override

public

boolean

onSingleTapConfirmed(MotionEvent

e)

{

int

x

=

(int)

e.getX();

int

y

=

(int)

e.getY();

for

(int

i

=

0;

i

<

row;

i++)

{

for

(int

j

=

0;

j

<

column;

j++)

{

int

tempX

=

(int)

((j

*

seatWidth

+

j

*

spacing)

*

getMatrixScaleX()

+

getTranslateX());

int

maxTempX

=

(int)

(tempX

+

seatWidth

*

ge

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論