




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國(guó)集線器行業(yè)前景規(guī)劃及投資潛力分析報(bào)告
- 2025-2030年中國(guó)鑄造扣件市場(chǎng)發(fā)展現(xiàn)狀及前景趨勢(shì)分析報(bào)告
- 2025-2030年中國(guó)蠔油醬行業(yè)需求規(guī)模及發(fā)展趨勢(shì)預(yù)測(cè)報(bào)告
- 2025-2030年中國(guó)草柳編制工藝品市場(chǎng)運(yùn)營(yíng)狀況及投資規(guī)劃研究報(bào)告
- 2025-2030年中國(guó)自動(dòng)支票打字機(jī)專用色帶行業(yè)運(yùn)行態(tài)勢(shì)及發(fā)展戰(zhàn)略分析報(bào)告
- 2025-2030年中國(guó)羥丙基甲基纖維素行業(yè)十三五規(guī)劃與發(fā)展策略分析報(bào)告
- 2025-2030年中國(guó)純棉內(nèi)衣市場(chǎng)運(yùn)營(yíng)狀況及發(fā)展前景分析報(bào)告
- 2025-2030年中國(guó)科技地產(chǎn)行業(yè)競(jìng)爭(zhēng)現(xiàn)狀及投資戰(zhàn)略研究報(bào)告
- 2025-2030年中國(guó)硫酸氧釩行業(yè)風(fēng)險(xiǎn)評(píng)估規(guī)劃研究報(bào)告
- 2025-2030年中國(guó)真空凍干蔬菜行業(yè)運(yùn)行狀況及發(fā)展趨勢(shì)預(yù)測(cè)報(bào)告
- 三方公司合作協(xié)議書范本
- 護(hù)理責(zé)任組長(zhǎng)續(xù)聘競(jìng)聘
- 2024-2025學(xué)年第二學(xué)期教學(xué)教研工作安排表
- 2025年貴州云上產(chǎn)業(yè)服務(wù)有限公司招聘筆試參考題庫(kù)含答案解析
- 2025年南京信息職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試近5年??及鎱⒖碱}庫(kù)含答案解析
- 2025-2030年中國(guó)天然氣行業(yè)發(fā)展分析及發(fā)展趨勢(shì)預(yù)測(cè)報(bào)告
- 《雷達(dá)信號(hào)處理基礎(chǔ)》課件
- 2025屆貴州省興義市三年級(jí)數(shù)學(xué)第一學(xué)期期末達(dá)標(biāo)檢測(cè)試題含解析
- 人教版地理七年級(jí)下冊(cè)7.1.2 亞洲的自然環(huán)境(課件39張)
- 外研版(三起)小學(xué)英語(yǔ)三年級(jí)下冊(cè)Unit 1 Animal friends Get ready start up 課件
- 2025年交通運(yùn)輸部廣州打撈局招聘事業(yè)編制人員13人歷年管理單位筆試遴選500模擬題附帶答案詳解
評(píng)論
0/150
提交評(píng)論