日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Android 手势—— GestureDetector 和 SimpleOnScaleGestureListener (手势缩放)

發(fā)布時間:2023/11/27 生活经验 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 手势—— GestureDetector 和 SimpleOnScaleGestureListener (手势缩放) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

GestureDetector 的作用:

檢測各種手勢和事件,使用的使用一般和onTouchEvent 方法結(jié)合在一起使用

下面主要說的內(nèi)容是GestureDetector 和?ScaleGestureDetector

1?GestureDetector

里面有一些回調(diào)接口下面說下

1.1?OnGestureListener 這個是接口,實(shí)現(xiàn)的時候里面的方法會自動生成,

1.2?SimpleOnGestureListener 這個是靜態(tài)的里面的方法需要自己重寫,就是有時候不需要讓生成一大堆的方法,可以使用

這個(平時開發(fā)可是使用SimpleOnGestureListener基本滿足打說需求)

1.3?OnDoubleTapListener 這個是接口里面3個方法SimpleOnGestureListener都有,所以這個就不說了,

1.4?OnContextClickListener 這個也是接口里面有1個方法SimpleOnGestureListener都有,所以這個就不說了,

所以建議大家項(xiàng)目開發(fā)中使用SimpleOnGestureListener 包含了其他的三個的所有方法,需要的時候重寫一些方法即可,下面

下2個demo 僅供參考

OnGestureListener 這個是接口,實(shí)現(xiàn)的時候里面的方法會自動生成,

(1)boolean onDown(MotionEvent e);// 按下事件

(2)public void onShowPress(MotionEvent e)? //用戶已執(zhí)行down{@link MotionEvent}但未執(zhí)行 一個移動或上升。此事件通常用于提供 反饋給用戶,讓他們知道他們的行為 識別,即突出顯示一個元素

(3)public boolean onSingleTapUp(MotionEvent e) //?在按下并抬起時發(fā)生, 使用up{@link MotionEvent}進(jìn)行點(diǎn)擊時通 ?觸發(fā)了它。 @param e完成第一次點(diǎn)擊的向上運(yùn)動事件 @如果事件被消耗,則返回true,否則返回false

(4)public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) //?在屏幕上滑動 ?@param e1開始滾動的第一個向下運(yùn)動事件。 ?@param e2觸發(fā)當(dāng)前onScroll的移動動作事件。?@param distanceX自上一次滾動以來沿X軸的距離??onScroll。這不是{@code e1}之間的距離和{@code e2}。 ?@param distance自上一次滾動以來沿Y軸的距 *onScroll。這不是{@code e1}之間的距離和{@code e2}。 @return true如果事件被消耗,否則為false

(5)onLongPress? // 長按事件

(6)onFling? //? 按下觸摸屏、快速移動后松開 @param e1開始投擲的第一個向下運(yùn)動事件。 @param e2觸發(fā)當(dāng)前觸發(fā)的移動動作事件。 @param velocityX這個投擲的速度,以像素每秒為單位 沿x軸。 @param velocityY這個投擲的速度,以像素每秒為單位 沿y軸。 @return true如果事件被消耗,否則為false

下面開始寫一個demo 看看GestureDetector ,寫一個點(diǎn)擊的時候圖片移動到點(diǎn)擊的位置

下面看下代碼:?

public class TestView extends View {// paint 初始化private Paint paint;private Bitmap bitmap;private int mPointX;private int mPointY;private static String TAG = "---------gestureDetector";public TestView(Context context) {super(context);}public TestView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);init(context, attrs);}public TestView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(context, attrs);}private void init(Context context, AttributeSet attrs) {paint = new Paint();
//        paint.setColor(Color.RED);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}@Overrideprotected void onLayout(boolean changed, int left, int top, int right, int bottom) {super.onLayout(changed, left, top, right, bottom);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.girl);canvas.drawBitmap(bitmap, mPointX, mPointY, paint);}@Overridepublic boolean onTouchEvent(MotionEvent event) {return gestureDetector.onTouchEvent(event);}GestureDetector gestureDetector = new GestureDetector(getContext(),new GestureDetector.OnGestureListener() {// 按下@Overridepublic boolean onDown(MotionEvent e) {Log.e(TAG, "onDown");mPointX = (int) e.getX();mPointY = (int) e.getY();invalidate();return false;}/**用戶已執(zhí)行down{@link MotionEvent}但未執(zhí)行一個移動或上升。此事件通常用于提供反饋給用戶,讓他們知道他們的行為識別,即突出顯示一個元素**/@Overridepublic void onShowPress(MotionEvent e) {Log.e(TAG, "onShowPress");}/*** 使用up{@link MotionEvent}進(jìn)行點(diǎn)擊時通* 觸發(fā)了它。* @param e完成第一次點(diǎn)擊的向上運(yùn)動事件* @如果事件被消耗,則返回true,否則返回false* @param e* @return*/@Overridepublic boolean onSingleTapUp(MotionEvent e) {Log.e(TAG, "onSingleTapUp");return false;}/*** 在屏幕上滑動* @param e1開始滾動的第一個向下運(yùn)動事件。* @param e2觸發(fā)當(dāng)前onScroll的移動動作事件。* @param distanceX自上一次滾動以來沿X軸的距離* onScroll。這不是{@code e1}之間的距離和{@code e2}。* @param distance自上一次滾動以來沿Y軸的距* onScroll。這不是{@code e1}之間的距離和{@code e2}。* *@return true如果事件被消耗,否則為false* @param e1* @param e2* @param distanceX* @param distanceY* @return*/@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,float distanceY) {Log.e(TAG, "onScroll");return false;}// 長按@Overridepublic void onLongPress(MotionEvent e) {Log.e(TAG, "onLongPress");}/*** 按下觸摸屏、快速移動后松開* *@param e1開始投擲的第一個向下運(yùn)動事件。* *@param e2觸發(fā)當(dāng)前觸發(fā)的移動動作事件。* *@param velocityX這個投擲的速度,以像素每秒為單位* *沿x軸。* *@param velocityY這個投擲的速度,以像素每秒為單位* *沿y軸。* *@return true如果事件被消耗,否則為false* @param e1* @param e2* @param velocityX* @param velocityY* @return*/@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {Log.e(TAG, "onFling");return false;}});}

可能有人說使用onTouchEvent 就可以實(shí)現(xiàn)了,這里只是簡單的熟悉GestureDetector使用,

1.2? ?SimpleOnGestureListener 這個是靜態(tài)的里面的方法需要自己重寫,就是有時候不需要讓生成一大堆的方法,可以使用

這個 但是里面多了幾個方法

(1)onSingleTapConfirmed? :這個回顧下onSingleTapUp?在按下并抬起時發(fā)生,onSingleTapConfirmed是?在按下并抬起時發(fā)生但是多了個附加條件就是會確保單擊之后短時間內(nèi)沒有再次單擊,

(2)onDoubleTap:雙擊的第二下Touch down時觸發(fā)

(3)onDoubleTapEvent:雙擊的第二下Touch down和up都會觸發(fā)

其他的事件基本一樣

下面使用SimpleOnGestureListener 寫一個寫一個點(diǎn)擊圖片放大的效果

public class TestView extends View {// paint 初始化private Paint paint;private Bitmap bitmap;private Matrix matrix = new Matrix();private static String TAG = "---------gestureDetector";public TestView(Context context) {super(context);}public TestView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);init(context, attrs);}public TestView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(context, attrs);}private void init(Context context, AttributeSet attrs) {paint = new Paint();//        paint.setColor(Color.RED);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}@Overrideprotected void onLayout(boolean changed, int left, int top, int right, int bottom) {super.onLayout(changed, left, top, right, bottom);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.girl);canvas.drawBitmap(bitmap, matrix, paint);}@Overridepublic boolean onTouchEvent(MotionEvent event) {return gestureDetector.onTouchEvent(event);}GestureDetector gestureDetector = new GestureDetector(getContext(),new GestureDetector.SimpleOnGestureListener() {@Overridepublic boolean onDown(MotionEvent e) {matrix.postScale(1.5f, 1.5f);invalidate();return super.onDown(e);}});}

?2?ScaleGestureDetector 手勢的縮放

使用方法和GestureDetector 差不多,

里面的接口回調(diào)方法如下

2.1??OnScaleGestureListener 是接口使用的時候回自動生成3個方法

(1)onScale 縮放進(jìn)行中

(2)onScaleBegin 縮放開始

(3)onScaleEnd 縮放結(jié)束

2.2?SimpleOnScaleGestureListener 這個是靜態(tài)的類 的三個方法和OnScaleGestureListener 一樣,不過用到的時候需要重寫一下

下面是一個demo 實(shí)現(xiàn)圖片的縮放,效果出現(xiàn)了邊界,沒有限制,這里只是演示OnScaleGestureListener 使用,實(shí)現(xiàn)圖片可以縮放了,

public class TestView extends View {// paint 初始化private Paint paint;private Bitmap bitmap;private float scaleX;private float scaleY;Matrix matrix = new Matrix();private static String TAG = "---------gestureDetector";public TestView(Context context) {super(context);}public TestView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);init(context, attrs);}public TestView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(context, attrs);}private void init(Context context, AttributeSet attrs) {paint = new Paint();//        paint.setColor(Color.RED);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}@Overrideprotected void onLayout(boolean changed, int left, int top, int right, int bottom) {super.onLayout(changed, left, top, right, bottom);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.girl);canvas.drawBitmap(bitmap, matrix, paint);}float[] m = new float[9];private float getMatrixScaleY() {matrix.getValues(m);return m[4];}@Overridepublic boolean onTouchEvent(MotionEvent event) {return scaleGestureDetector.onTouchEvent(event);}ScaleGestureDetector scaleGestureDetector = new ScaleGestureDetector(getContext(),new ScaleGestureDetector.OnScaleGestureListener() {@Overridepublic boolean onScale(ScaleGestureDetector detector) {float scaleFactor = detector.getScaleFactor();Log.e("--------onScale", String.valueOf(scaleFactor));scaleX = detector.getCurrentSpanX();scaleY = detector.getCurrentSpanY();Log.e("--------scaleX", String.valueOf(scaleX));Log.e("--------scaleY", String.valueOf(scaleY));if (getMatrixScaleY() * scaleFactor > 2) {scaleFactor = 2 / getMatrixScaleY();}if (getMatrixScaleY() * scaleFactor < 0.5) {scaleFactor = 0.5f / getMatrixScaleY();}matrix.postScale(scaleFactor, scaleFactor, scaleX, scaleY);invalidate();return true;}@Overridepublic boolean onScaleBegin(ScaleGestureDetector detector) {Log.e("--------onScaleBegin", String.valueOf(detector.getScaleFactor()));return true;}@Overridepublic void onScaleEnd(ScaleGestureDetector detector) {Log.e("--------onScaleEnd", String.valueOf(detector.getScaleFactor()));}});}

?

?

?

?

總結(jié)

以上是生活随笔為你收集整理的Android 手势—— GestureDetector 和 SimpleOnScaleGestureListener (手势缩放)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲最黄视频 | 狼人综合网 | 国产成人无码性教育视频 | 好色综合| 亚洲每日在线 | 日韩欧美四区 | 四虎免费看黄 | 韩国av免费在线观看 | 国产精品夜夜夜爽张柏芝 | 亚洲一区二区在线视频 | 小泽玛利亚一区二区三区在线观看 | 同人动漫在线观看 | 亚洲欧美乱综合图片区小说区 | 午夜影院18| 日韩毛片中文字幕 | 密臀av在线 | 青青草视频播放器 | 永久免费54看片 | 专业操老外 | 日韩a∨ | 欧洲亚洲自拍 | 久久久久久久麻豆 | 黑人干亚洲人 | 日韩三区在线观看 | 国产欧美一区二区三区精华液好吗 | av一区不卡| 封神榜二在线高清免费观看 | 成年人黄色一级片 | 日韩久久网 | 特大黑人巨交吊性xxxxhd | av生活片| 成人在线免费播放视频 | 男人av资源 | 91精品啪在线观看国产线免费 | 无码人妻精品一区二区三区99不卡 | 97久久国产亚洲精品超碰热 | 亚洲精品人妻av | 欧美午夜在线视频 | 欧美色999 | 欧美一级淫片aaaaaa | 老司机伊人 | 色婷婷免费 | 婷婷国产精品 | 不卡三区 | 91精品在线看 | 日韩在线第一区 | 少妇在线视频 | www.浪潮av.com| 26uuu精品一区二区在线观看 | 欧美三级免费 | 一级毛片黄色 | 久久这里只有精品国产 | 中文字幕成人在线 | 国产精品亚洲成在人线 | 国产乱仑视频 | 久久天天躁狠狠躁夜夜躁2014 | 性开放网站 | 亚洲国产精品电影 | 蜜桃传媒一区二区亚洲av | www.jizzcom| 国产人久久人人人人爽 | av福利在线| 久久深夜| 亚洲综合激情网 | 乱人伦av| 污污污污污污www网站免费 | 丁香九月婷婷 | 熟妇人妻精品一区二区三区视频 | 欧美一区二区在线视频 | 免费色站 | 色综合久久久久久 | 亚洲综合色站 | 蜜臀av在线播放 | 亚洲AV无码一区二区三区性 | 国产精品老熟女一区二区 | 性chinese天美传媒麻 | 美女扒开腿让男人操 | 毛片久久久久久久 | 国产无码精品在线观看 | 国产综合亚洲精品一区二 | h片在线观看免费 | 黄色片在线免费 | 天堂8在线天堂资源bt | 欧美日韩黄色 | 精品午夜久久久 | 不卡视频免费在线观看 | 青青国产视频 | wwwxxxx在线观看| 97精品超碰一区二区三区 | 亚洲精品久久久久久无码色欲四季 | bbbbbxxxxx性欧美 | 国产黄色免费大片 | 日日干夜夜拍 | 国产乱真实合集 | 小珊的性放荡羞辱日记 | 91精品国产综合久久久蜜臀粉嫩 | 少妇把腿扒开让我舔18 | 黄瓜视频污在线观看 | 久久老熟女一区二区三区 |