【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】ImageView如何在Android應(yīng)用中使用_第1頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】ImageView如何在Android應(yīng)用中使用_第2頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】ImageView如何在Android應(yīng)用中使用_第3頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】ImageView如何在Android應(yīng)用中使用_第4頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】ImageView如何在Android應(yīng)用中使用_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】ImageView如何在Android應(yīng)用中使用

這期內(nèi)容當(dāng)中在下將會(huì)給大家?guī)?lái)有關(guān)ImageView如何在Android應(yīng)用中使用,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。MatrixImageView類改改代碼了:public

class

MatrixImageView

extends

ImageView

{

private

static

final

int

MODE_NONE

=

190;

private

static

final

int

MODE_DRAG

=

468;

private

static

final

int

MODE_ZOOM

=

685;

private

int

mode;

private

float

startX,

startY;

private

float

midX,

midY;

private

Matrix

currMatrix,

savedMatrix;

private

float

preRotate,

rotate;

private

float

preSpacing;

private

GestureDetector

detector;

public

MatrixImageView(Context

context,

AttributeSet

attrs)

{

super(context,

attrs);

initView();

detector=new

GestureDetector(context,onGestureListener);

}

private

void

initView()

{

mode

=

MODE_NONE;

currMatrix

=

new

Matrix();

savedMatrix

=

new

Matrix();

DisplayMetrics

dm

=

getResources().getDisplayMetrics();

Bitmap

bitmap

=

BitmapFactory.decodeResource(getResources(),

R.mipmap.test);

bitmap

=

Bitmap.createScaledBitmap(bitmap,

dm.widthPixels,

dm.heightPixels,

true);

setImageBitmap(bitmap);

}

@Override

public

boolean

onTouchEvent(MotionEvent

event)

{

return

detector.onTouchEvent(event);

}

private

GestureDetector.SimpleOnGestureListener

onGestureListener=new

GestureDetector.SimpleOnGestureListener(){

@Override

public

boolean

onSingleTapUp(MotionEvent

e)

{

Log.e("TAG",

"====onSingleTapUp=====");

return

super.onSingleTapUp(e);

}

@Override

public

void

onLongPress(MotionEvent

e)

{

Log.e("TAG",

"====onLongPress=====");

super.onLongPress(e);

}

@Override

public

boolean

onScroll(MotionEvent

e1,

MotionEvent

e2,

float

distanceX,

float

distanceY)

{

Log.e("TAG",

"====onScroll=====");

Log.e("TAG",

"distanceX===>"+distanceX);

Log.e("TAG",

"distanceY===>"+distanceY);

return

super.onScroll(e1,

e2,

distanceX,

distanceY);

}

@Override

public

void

onShowPress(MotionEvent

e)

{

Log.e("TAG",

"====onShowPress=====");

super.onShowPress(e);

}

@Override

public

boolean

onDown(MotionEvent

e)

{

Log.e("TAG",

"====onDown=====");

return

true;

}

@Override

public

boolean

onDoubleTap(MotionEvent

e)

{

Log.e("TAG",

"====onDoubleTap=====");

return

super.onDoubleTap(e);

}

@Override

public

boolean

onDoubleTapEvent(MotionEvent

e)

{

Log.e("TAG",

"====onDoubleTapEvent=====");

return

super.onDoubleTapEvent(e);

}

@Override

public

boolean

onSingleTapConfirmed(MotionEvent

e)

{

Log.e("TAG",

"====onSingleTapConfirmed=====");

return

super.onSingleTapConfirmed(e);

}

@Override

public

boolean

onContextClick(MotionEvent

e)

{

Log.e("TAG",

"====onContextClick=====");

return

super.onContextClick(e);

}

@Override

public

boolean

onFling(MotionEvent

e1,

MotionEvent

e2,

float

velocityX,

float

velocityY)

{

Log.e("TAG",

"====onFling=====");

Log.e("TAG",

"velocityX===>"+velocityX);

Log.e("TAG",

"velocityY===>"+velocityY);

return

super.onFling(e1,

e2,

velocityX,

velocityY);

}

};

}首先我們?cè)跇?gòu)造方法中創(chuàng)建一個(gè)手勢(shì)監(jiān)測(cè)器的對(duì)象GestureDetector:public

MatrixImageView(Context

context,

AttributeSet

attrs)

{

super(context,

attrs);

initView();

detector=new

GestureDetector(context,onGestureListener);

}GestureDetector既然是監(jiān)聽(tīng)我們的手勢(shì)的工具類,那我們是不是得把我們得手勢(shì)交給它呢?是的??!于是我們?cè)趏nTouchEvent中把事件交給GestureDetector:

@Override

public

boolean

onTouchEvent(MotionEvent

event)

{

return

detector.onTouchEvent(event);

}那我們把事件交給了GestureDetector,GestureDetector處理完畢后我們?cè)趺粗滥??還記得我們創(chuàng)建GestureDetector對(duì)象的時(shí)候傳遞的參數(shù)嗎?detector=newGestureDetector(context,onGestureListener);我們傳遞給了GestureDetector一個(gè)onGestureListener對(duì)象,GestureDetector檢查完畢手勢(shì)后,會(huì)調(diào)用onGestureListener中的方法進(jìn)行回調(diào),我們只需要在onGestureListener對(duì)象的相應(yīng)方法中作出處理就可以了:private

GestureDetector.SimpleOnGestureListener

onGestureListener=new

GestureDetector.SimpleOnGestureListener(){

@Override

public

boolean

onSingleTapUp(MotionEvent

e)

{

Log.e(“TAG”,

“====onSingleTapUp=====”);

return

super.onSingleTapUp(e);

}

@Override

public

void

onLongPress(MotionEvent

e)

{

Log.e("TAG",

"====onLongPress=====");

super.onLongPress(e);

}

@Override

public

boolean

onScroll(MotionEvent

e1,

MotionEvent

e2,

float

distanceX,

float

distanceY)

{

Log.e("TAG",

"====onScroll=====");

Log.e("TAG",

"distanceX===>"+distanceX);

Log.e("TAG",

"distanceY===>"+distanceY);

return

super.onScroll(e1,

e2,

distanceX,

distanceY);

}

@Override

public

void

onShowPress(MotionEvent

e)

{

Log.e("TAG",

"====onShowPress=====");

super.onShowPress(e);

}

@Override

public

boolean

onDown(MotionEvent

e)

{

Log.e("TAG",

"====onDown=====");

return

super.onDown(e);

}

@Override

public

boolean

onDoubleTap(MotionEvent

e)

{

Log.e("TAG",

"====onDoubleTap=====");

return

super.onDoubleTap(e);

}

@Override

public

boolean

onDoubleTapEvent(MotionEvent

e)

{

Log.e("TAG",

"====onDoubleTapEvent=====");

return

super.onDoubleTapEvent(e);

}

@Override

public

boolean

onSingleTapConfirmed(MotionEvent

e)

{

Log.e("TAG",

"====onSingleTapConfirmed=====");

return

super.onSingleTapConfirmed(e);

}

@Override

public

boolean

onContextClick(MotionEvent

e)

{

Log.e("TAG",

"====onContextClick=====");

return

super.onContextClick(e);

}

@Override

public

boolean

onFling(MotionEvent

e1,

MotionEvent

e2,

float

velocityX,

float

velocityY)

{

Log.e("TAG",

"====onFling=====");

Log.e("TAG",

"velocityX===>"+velocityX);

Log.e("TAG",

"velocityY===>"+velocityY);

return

super.onFling(e1,

e2,

velocityX,

velocityY);

}

};我們先不管其中方法啥時(shí)候調(diào)用,我們先重寫它的所有方法,然后打上log,看看我們手指操作后相應(yīng)的回調(diào),于是我們運(yùn)行代碼:是的,沒(méi)錯(cuò)!就只是一張圖片,因?yàn)槲覀円仓皇秋@示了一張圖片:我們輕輕的點(diǎn)擊一下屏幕:03-0220:47:41.3671798-1798/com.leo.gestureimageviewE/TAG:====onDown=====03-0220:47:41.4661798-1798/com.leo.gestureimageviewE/TAG:====onShowPress=====03-0220:47:41.9671798-1798/com.leo.gestureimageviewE/TAG:====onLongPress=====輕輕的點(diǎn)擊一下屏幕:我們可以看到log執(zhí)行順序:onDown->onShowPress->onLongPress我們點(diǎn)擊屏幕按下,然后過(guò)一會(huì)再放開(kāi):03-0221:51:27.12117138-17138/com.leo.gestureimageviewE/TAG:====onDown=====03-0221:51:27.22217138-17138/com.leo.gestureimageviewE/TAG:====onShowPress=====03-0221:51:27.72217138-17138/com.leo.gestureimageviewE/TAG:====onLongPress=====我們滑動(dòng)一下手指:03-0221:51:27.12117138-17138/com.leo.gestureimageviewE/TAG:====onDown=====03-0221:51:27.22217138-17138/com.leo.gestureimageviewE/TAG:====onShowPress=====03-0221:51:27.72217138-17138/com.leo.gestureimageviewE/TAG:====onLongPress=====不管我們?cè)趺礃硬僮?,打印的log總是這三個(gè)方法?這是咋回事呢?如果看到這里你有疑問(wèn)的話,那我告訴你,你Android事件傳遞機(jī)制掌握的還不是很好,為什么這么說(shuō)呢??下面我們帶著疑問(wèn)看看源碼:猜都可以猜到GestureDetector處理手勢(shì)的代碼肯定在onTouchEvent方法中,那么我們看一下onTouchEvent方法:

public

boolean

onTouchEvent(MotionEvent

ev)

{

if

(mDoubleTapListener

!=

null)

{

boolean

hadTapMessage

=

mHandler.hasMessages(TAP);

if

(hadTapMessage)

mHandler.removeMessages(TAP);

if

((mCurrentDownEvent

!=

null)

&&

(mPreviousUpEvent

!=

null)

&&

hadTapMessage

&&

isConsideredDoubleTap(mCurrentDownEvent,

mPreviousUpEvent,

ev))

{

//

This

is

a

second

tap

mIsDoubleTapping

=

true;

//

Give

a

callback

with

the

first

tap

of

the

double-tap

handled

|=

mDoubleTapListener.onDoubleTap(mCurrentDownEvent);

//

Give

a

callback

with

down

event

of

the

double-tap

handled

|=

mDoubleTapListener.onDoubleTapEvent(ev);

}

else

{

//

This

is

a

first

tap

mHandler.sendEmptyMessageDelayed(TAP,

DOUBLE_TAP_TIMEOUT);

}

}

mDownFocusX

=

mLastFocusX

=

focusX;

mDownFocusY

=

mLastFocusY

=

focusY;

if

(mCurrentDownEvent

!=

null)

{

mCurrentDownEvent.recycle();

}

mCurrentDownEvent

=

MotionEvent.obtain(ev);

mAlwaysInTapRegion

=

true;

mAlwaysInBiggerTapRegion

=

true;

mStillDown

=

true;

mInLongPress

=

false;

mDeferConfirmSingleTap

=

false;

if

(mIsLongpressEnabled)

{

mHandler.removeMessages(LONG_PRESS);

mHandler.sendEmptyMessageAtTime(LONG_PRESS,

mCurrentDownEvent.getDownTime()

+

TAP_TIMEOUT

+

LONGPRESS_TIMEOUT);

}

mHandler.sendEmptyMessageAtTime(SHOW_PRESS,

mCurrentDownEvent.getDownTime()

+

TAP_TIMEOUT);

handled

|=

mListener.onDown(ev);

break;

}代碼太多了,那為什么我們只收到了onDown、onShowPress、onLongPress這三個(gè)方法的回調(diào)呢?我們知道,當(dāng)我們手指剛按下屏幕的時(shí)候,ACTION_DOWN會(huì)執(zhí)行,然后我們看到這么一行代碼:handled|=mListener.onDown(ev);mListener是我們傳遞的SimpleOnGestureListener,于是就看到了控制臺(tái)的第一個(gè)log:03-0221:51:29.70617138-17138/com.leo.gestureimageviewE/TAG:====onDown=====我們的onDown是打印了,然后handled|=mListener.onDown(ev);看一下我們返回的是什么值:@Override

public

boolean

onDown(MotionEvent

e)

{

Log.e("TAG",

"====onDown=====");

return

super.onDown(e);

}我們直接返回了super.onDown(e),接著我們看一下父類返回的是什么:public

boolean

onDown(MotionEvent

e)

{

return

false;

}可以看到,父類直接返回了false,所以handled此時(shí)為false,然后當(dāng)ACTION_DOWN執(zhí)行完畢后,就回到了我們的自定義view中的onTouchEvent方法中了:

@Override

public

boolean

onTouchEvent(MotionEvent

event)

{

return

detector.onTouchEvent(event);

}此時(shí)我們的view中的onTouchEvent方法返回的是false,到了這里懂事件傳遞機(jī)制的小伙伴都懂,當(dāng)我們的onTouchEvent返回了false的話,后面的事件都將接收不到了,也就是說(shuō)只能執(zhí)行ACTION_DOWN,那么有些小伙伴可能又要說(shuō)了,那我把view的clickable或者longclickable設(shè)置成true,事件不就可以傳遞了么?好的~!我們?cè)囈辉嚕?/p>

<com.leo.gestureimageview.MatrixImageView

android:clickable="true"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:scaleType="matrix"

/>運(yùn)行代碼,還是只打印了那三個(gè)方法,那這又是怎么回事呢?還記得我們view的onTouchEvent方法么?我們是這么寫的:@Override

public

boolean

onTouchEvent(MotionEvent

event)

{

return

detector.onTouchEvent(event);

}如果改成這樣再試試:

@Override

public

boolean

onTouchEvent(MotionEvent

event)

{

detector.onTouchEvent(event);

return

super.onTouchEvent(event);

}拖動(dòng)手指返回結(jié)果:好啦~!!終于看到我們久違的結(jié)果了,如果我們還是想用以前的寫法,把onTouchEvent的返回結(jié)果交給GestureDetector處理該怎么做呢?@Override

public

boolean

onTouchEvent(MotionEvent

event)

{

return

detector.onTouchEvent(event);

}我們只需要在回調(diào)方法的onDown中返回true即可:

@Override

public

boolean

onDown(MotionEvent

e)

{

Log.e("TAG",

"====onDown=====");

return

true;

}我們?cè)俅芜\(yùn)行代碼并拖動(dòng)手指:好啦~!說(shuō)了那么多不知道小伙伴們理解了沒(méi)?還是不理解的小伙伴可以去看看我前幾篇事件傳遞的博客,嘻嘻~我們還是快點(diǎn)往下走吧….我們長(zhǎng)按一下屏幕然后提起手指:03-0222:29:37.36122104-22104/com.leo.gestureimageviewE/TAG:====onDown=====03-0222:29:37.36722104-22104/com.leo.gestureimageviewE/TAG:====onSingleTapUp=====03-0222:29:37.66322104-22104/com.leo.gestureimageviewE/TAG:====onSingleTapConfirmed=====執(zhí)行了onDown=>onSingleTapUp=>onSingleTapConfirmed.我們快速點(diǎn)擊一下屏幕:03-0222:31:48.60322104-22104/com.leo.gestureimageviewE/TAG:====onDown=====03-0222:31:48.61022104-22104/com.leo.gestureimageviewE/TAG:====onSingleTapUp=====03-0222:31:48.90322104-22104/com.leo.gestureimageviewE/TAG:====onSingleTapConfirmed=====執(zhí)行了onDown=>onSingleTapUp=>onSingleTapConfirmed.然后我們?cè)俅位瑒?dòng)手指:03-0222:34:41.82022104-22104/com.leo.gestureimageviewE/TAG:====onDown=====03-0222:34:41.92022104-22104/com.leo.gestureimageviewE/TAG:====onShowPress=====03-0222:34:42.01822104-22104/com.leo.gestureimageviewE/TAG:====onScroll=====03-0222:34:42.01822104-22104/com.leo.gestureimageviewE/TAG:distanceX===>-117.1313803-0222:34:42.01822104-22104/com.leo.gestureimageviewE/TAG:distanceY===>75.10046403-0222:34:42.03622104-22104/com.leo.gestureimageviewE/TAG:====onScroll=====03-0222:34:42.03622104-22104/com.leo.gestureimageviewE/TAG:distanceX===>-75.859314執(zhí)行順序:onDown=》onShowPress=》onScroll(很多次)最后我們手指拖動(dòng)距離長(zhǎng)一點(diǎn)再快一點(diǎn):03-0222:47:42.4535103-5103/com.leo.gestureimageviewE/TAG:distanceX===>-274.6933603-0222:47:42.4535103-5103/com.leo.gestureimageviewE/TAG:distanceY===>-0.3483886703-0222:47:42.4605103-5103/com.leo.gestureimageviewE/TAG:====onFling=====03-0222:47:42.4605103-5103/com.leo.gestureimageviewE/TAG:velocityX===>27284.94303-0222:47:42.4605103-5103/com.leo.gestureimageviewE/TAG:velocityY===>-95.6131前面還有一段log沒(méi)給出了,調(diào)用方法順序?yàn)椋簅nDown=》onShowPress=》onScroll(很多次)=》最后松開(kāi)手指的時(shí)候onFling();好了~!到這里,我們的回調(diào)方法中還有幾個(gè)沒(méi)有被調(diào)用,就是監(jiān)聽(tīng)雙擊事件的時(shí)候,于是我們雙擊屏幕:03-0222:50:34.7865103-5103/com.leo.gestureimageviewE/TAG:====onDown=====03-0222:50:34.7935103-5103/com.leo.gestureimageviewE/TAG:====onSingleTapUp=====03-0222:50:34.9245103-5103/com.leo.gestureimageviewE/TAG:====onDoubleTap=====03-0222:50:34.9245103-5103/com.leo.gestureimageviewE/TAG:====onDoubleTapEvent=====03-0222:50:34.9245103-5103/com.leo.gestureimageviewE/TAG:====onDown=====03-0222:50:34.9325103-5103/com.leo.gestureimageviewE/TAG:====onDoubleTapEvent=====我們雙擊屏幕執(zhí)行的方法為:onDown=>onSingleTapUp=>onDoubleTap=>onDoubleTapEvent=>onDoubleTapEvent可見(jiàn),執(zhí)行了一次onDoubleTap,兩次onDoubleTapEvent好啦~!看完了SimpleOnGestureListener中所有方法的回調(diào),我們反過(guò)來(lái)再看一遍這些回調(diào)方法:好啦~!說(shuō)了那么api內(nèi)容,下面寫個(gè)小例子用一下GestureDetector:package

com.leo.gestureimageview;

import

android.content.Context;

import

android.graphics.Bitmap;

import

android.graphics.BitmapFactory;

import

android.graphics.Matrix;

import

android.util.AttributeSet;

import

android.util.DisplayMetrics;

i

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論