android 代碼實現類比使用者點擊、滑動等操作

來源:互聯網
上載者:User

標籤:bsp   abs   ptime   左右   for   break   類型   快速   scroll   

/**
* 類比使用者點擊
*
* @param view 要觸發操作的view
* @param x 相對於要操作view的左上方x軸位移量
* @param y 相對於要操作view的左上方y軸位移量
*/
private static void analogUserClick(View view, float x, float y) {
if (view == null) {
return;
}
LogUtil.e(TAG_POINT, "正在類比點擊操作:p->" + x + "," + y);
long downTime = SystemClock.uptimeMillis();//類比按下去的時間

long eventTime = downTime;//事件發生時間

MotionEvent downEvent = MotionEvent.obtain(downTime, eventTime,
ACTION_DOWN, x, y, 0);
view.onTouchEvent(downEvent);

eventTime = eventTime + 90;//離開螢幕時間

MotionEvent upEvent = MotionEvent.obtain(downTime, eventTime,
MotionEvent.ACTION_UP, x, y, 0);
view.onTouchEvent(upEvent);

//回收事件
downEvent.recycle();
upEvent.recycle();
}

 

/**
* 類比使用者滑動操作
*
* @param view 要觸發操作的view
* @param type 類比操作類型:均勻滑動、快速滑動
* @param p1x 滑動的起始點x座標
* @param p1y 滑動的起始點y座標
* @param p2x 滑動的終點x座標
* @param p2y 滑動的終點y座標
*/
private static void analogUserScroll(View view, final int type, final float p1x, final float p1y, final float p2x, final float p2y) {
LogUtil.e(TAG_POINT, "正在類比滑屏操作:p1->" + p1x + "," + p1y + ";p2->" + p2x + "," + p2y);
if (view == null) {
return;
}
long downTime = SystemClock.uptimeMillis();//類比按下去的時間

long eventTime = downTime;

float pX = p1x;
float pY = p1y;
int speed = 0;//快速滑動
float touchTime = 116;//類比滑動時發生的觸摸事件次數

//平均每次事件要移動的距離
float perX = (p2x - p1x) / touchTime;
float perY = (p2y - p1y) / touchTime;

boolean isReversal = perX < 0 || perY < 0;//判斷是否反向:手指從下往上滑動,或者手指從右往左滑動
boolean isHandY = Math.abs(perY) > Math.abs(perX);//判斷是左右滑動還是上下滑動

if (type == USER_TOUCH_TYPE_1) {//加速滑動
touchTime = 10;//如果是快速滑動,則發生的觸摸事件比均勻滑動更少
speed = isReversal ? -20 : 20;//反向移動則座標每次遞減
}

//類比使用者按下
MotionEvent downEvent = MotionEvent.obtain(downTime, eventTime,
ACTION_DOWN, pX, pY, 0);
view.onTouchEvent(downEvent);

//類比移動過程中的事件
List<MotionEvent> moveEvents = new ArrayList<>();
boolean isSkip = false;
for (int i = 0; i < touchTime; i++) {

pX += (perX + speed);
pY += (perY + speed);
if ((isReversal && pX < p2x) || (!isReversal && pX > p2x)) {
pX = p2x;
isSkip = !isHandY;
}

if ((isReversal && pY < p2y) || (!isReversal && pY > p2y)) {
pY = p2y;
isSkip = isHandY;
}
eventTime += 20.0f;//事件發生的時間要不斷遞增
MotionEvent moveEvent = getMoveEvent(downTime, eventTime, pX, pY);
moveEvents.add(moveEvent);
view.onTouchEvent(moveEvent);
if (type == USER_TOUCH_TYPE_1) {//加速滑動
speed += (isReversal ? -70 : 70);
}
if (isSkip) {
break;
}
}

//類比手指離開螢幕
MotionEvent upEvent = MotionEvent.obtain(downTime, eventTime,
MotionEvent.ACTION_UP, pX, pY, 0);
view.onTouchEvent(upEvent);

//回收觸摸事件
downEvent.recycle();
for (int i = 0; i < moveEvents.size(); i++) {
moveEvents.get(i).recycle();
}
upEvent.recycle();
}

 

android 代碼實現類比使用者點擊、滑動等操作

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.