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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

textureview 缩放_View的双指缩放以及移动

發(fā)布時(shí)間:2023/12/2 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 textureview 缩放_View的双指缩放以及移动 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近做項(xiàng)目,做到了要讓視頻縮放的功能,所以寫(xiě)了一個(gè)小DEMO,進(jìn)行雙指手勢(shì)的操作,DEMO是使用TextView做測(cè)試,實(shí)際使用監(jiān)聽(tīng)放在TextureView也是正常運(yùn)行。

首先就是記錄下觸摸屏幕的手指數(shù)量,一個(gè)手指觸摸的時(shí)候進(jìn)行移動(dòng)操作,兩個(gè)手指觸摸的時(shí)候進(jìn)行縮放操作,大于兩個(gè)手指觸摸的時(shí)候?qū)⒉贿M(jìn)行操作。

縮放模式的時(shí)候主要是記錄下第一次雙指間距,通過(guò)ACTION_MOVE回調(diào)得到的最新雙指間距,和第一次得到的雙指間距對(duì)比,通過(guò)setScaleX和setScaleY進(jìn)行縮放的比例改變。

而移動(dòng)模式的時(shí)候需要注意到,可移動(dòng)的范圍不能超過(guò)View的范圍。通過(guò)setPivotX和setPivotY進(jìn)行放大后的移動(dòng)。

代碼分解如下:

1.記錄觸摸手指的個(gè)數(shù)(觸摸數(shù)量的變化在onTouch方法),定義縮放最大和最小的比例。isCanTouch 就是在外部可以選擇是否開(kāi)啟手勢(shì)縮放。

private boolean isCanTouch = false;

private int point_num = 0;//當(dāng)前觸摸的點(diǎn)數(shù)

public static final float SCALE_MAX = 8.0f; //最大的縮放比例

private static final float SCALE_MIN = 1.0f;//最小縮放比例

2.是否開(kāi)啟手勢(shì)縮放

public void setIsCanTouch(boolean canTouch) {

isCanTouch = canTouch;

}

3.計(jì)算兩個(gè)手指之間的距離的方法。

/**

* 計(jì)算兩個(gè)點(diǎn)的距離

*

* @param event

* @return

*/

private double spacing(MotionEvent event) {

if (event.getPointerCount() == 2) {

float x = event.getX(0) - event.getX(1);

float y = event.getY(0) - event.getY(1);

return Math.sqrt(x * x + y * y);

} else {

return 0;

}

}

4.使用setScaleX和setScaleY進(jìn)行縮放的比例改變。

5.使用setPivotX和setPivotY進(jìn)行放大后的移動(dòng)。

onTouch方法如下:

@Override

public boolean onTouch(View v, MotionEvent event) {

if (!isCanTouch) {

return false;

}

switch (event.getAction() & MotionEvent.ACTION_MASK) {

case MotionEvent.ACTION_DOWN:

point_num = 1;

downX = event.getX();

downY = event.getY();

break;

case MotionEvent.ACTION_UP:

point_num = 0;

downX = 0;

downY = 0;

break;

case MotionEvent.ACTION_MOVE:

if (point_num == 1) {

//只有一個(gè)手指的時(shí)候才有移動(dòng)的操作

float lessX = (float) (downX - event.getX());

float lessY = (float) (downY - event.getY());

moveX = event.getX();

moveY = event.getY();

moveRawX = event.getRawX();

moveRawY = event.getRawY();

setSelfPivot(lessX, lessY);

//setPivot(getPivotX() + lessX, getPivotY() + lessY);

} else if (point_num == 2) {

//只有2個(gè)手指的時(shí)候才有放大縮小的操作

moveDist = spacing(event);

double space = moveDist - oldDist;

float scale = (float) (getScaleX() + space / getWidth());

if (scale > SCALE_MIN && scale < SCALE_MAX) {

setScale(scale);

} else if (scale < SCALE_MIN) {

setScale(SCALE_MIN);

}

}

break;

case MotionEvent.ACTION_POINTER_DOWN:

oldDist = spacing(event);//兩點(diǎn)按下時(shí)的距離

point_num += 1;

break;

case MotionEvent.ACTION_POINTER_UP:

point_num -= 1;

break;

}

return true;

}

6.移動(dòng)的方法,設(shè)置了邊界值,不讓View移動(dòng)到View的范圍外。

/**

* 觸摸使用的移動(dòng)事件

*

* @param lessX

* @param lessY

*/

private void setSelfPivot(float lessX, float lessY) {

float setPivotX = 0;

float setPivotY = 0;

setPivotX = getPivotX() + lessX;

setPivotY = getPivotY() + lessY;

Log.e("lawwingLog", "setPivotX:" + setPivotX + " setPivotY:" + setPivotY

+ " getWidth:" + getWidth() + " getHeight:" + getHeight());

if (setPivotX < 0 && setPivotY < 0) {

setPivotX = 0;

setPivotY = 0;

} else if (setPivotX > 0 && setPivotY < 0) {

setPivotY = 0;

if (setPivotX > getWidth()) {

setPivotX = getWidth();

}

} else if (setPivotX < 0 && setPivotY > 0) {

setPivotX = 0;

if (setPivotY > getHeight()) {

setPivotY = getHeight();

}

} else {

if (setPivotX > getWidth()) {

setPivotX = getWidth();

}

if (setPivotY > getHeight()) {

setPivotY = getHeight();

}

}

setPivot(setPivotX, setPivotY);

}

總結(jié)

以上是生活随笔為你收集整理的textureview 缩放_View的双指缩放以及移动的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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